Android中类的加载以及应用

Android应用程序如何实现动态加载类 它允许应用程序在运行时动态加载类文件,而不需要在编译时将这些类文件包含在应用程序的源代码中。通过动态加载类,我们可以在运行时加载和使用类文件,从而提供更大的灵活性和可扩展性。在本文中,我们介绍了实现动态加载类的步骤,并提供了相应的代码示例。我们需要提供.dex文件的路径、存储动态加载类的目录以及父类加载器。在上述代码中,我们使用类加载器加载了名为"com.example.DynamicClass"的类。在上述代码中,我们使用应用程序的私有目录作为存储动态加载类的目录,并获取了应用程序的父类加载器。 阅读详情

将重点介绍一下三个方面:

  1. 类的加载机制
  2. 热修复原理
  3. 增量更新原理

一、类加载器的分类

1、Java ClassLoader

(1)启动类加载器:Bootstrap ClassLoader

用C++编写的,是JVM自带的类加载器,负责Java平台核心库,用来加载核心类库。该加载器无法直接获取。加载存放在JAVA_HOME\lib目录中的类。

(2)扩展类加载器:Extension ClassLoader

负责jre/lib/ext目录下的jar包或 –D java.ext.dirs 指定目录下的jar包装入工作库

(3)应用程序类加载器:App/System ClassLoader

负责java –classpath 或 –D java.class.path所指的目录下的类与jar包装入工作 ,是最常用的加载器,可以通过ClassLoader的静态方法getSystemLoader()来获取系统类的加载器。如果没有特别指定,则用户自定义的类的加载器都以此类加载器作为父类。

2、Android ClassLoader

(1)BootClassLoader,它是 Android 中最顶层的 ClassLoader,继承自ClassLoader,C代码编写,不能被继承和修改。

(2)PathClassLoader:只能加载已经安装到Android系统中的apk文件(/data/app目录),是Android默认使用的类加载器。

(3)DexClassLoader:可以加载任意目录下的dex/jar/apk/zip文件,比PathClassLoader更灵活,是实现热修复的重点。

他们都继承自BaseDexClassLoader,他又继承自ClassLoader。PathClassLoader 和 DexClassLoader 最大的区别就是 DexClassLoader 可以加载 外置dex文件,这是因为 PathClassLoader 构造方法中像上传递时第二个参数传了null,这个参数代表的是 dex 优化后的路径,DexPathList 在生成 Element数组 时会判断这个参数是否为 null,如果为 null 就使用系统默认路径 /data/dalvik-cache,这也是导致如果要加载外置dex文件只能使用 DexClassLoader 的原因。

Android 中主要使用的 ClassLoader 有 PathClassLoader 和 DexClassLoader,它们都继承自 BaseDexClassLoader,BaseDexClassLoader 中维护了一个 DexPathList, DexPathList 中又维护这一个 Element 数组,这个数组中 Element元素 其实就是 Dex 文件,所以子类可以通过父类findClass方法获得这个dex集合。

二、类的加载机制

1、 双亲委派模型

在Java中为了保证一个类的唯一性使用了双亲委派模型,也就是说如果要加载一个类首先会委托给自己的父加载器去完成,父加载器会再向上委托,直到最顶层的类加载器,如果父加载器没有找个要加载的类,父类的子类才会一步步尝试自己去加载,如果再加载失败测抛出异常,这样就保证了加载的类都是一个类。

2、如何保证类的唯一性

JVM 在判定两个 class 是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。只有两者同时满足的情况下,JVM 才认为这两个 class 是相同的。就算两个 class 是同一份 class 字节码,如果被两个不同的 ClassLoader 实例所加载,JVM 也会认为它们是两个不同 class。

三、热修复技术

就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当用到这个重复的类的时候,系统会选择哪个类进行加载呢?一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数组dexElements,当找类的时候,会按顺序遍历dex文件,然后从当前遍历的dex文件中找类,如果找到类则返回,如果找不到从下一个dex文件继续查找。理论上,如果在不同的dex中有相同的类存在,那么会优先选择排在前面的dex文件的类。热补丁的方案,把有问题的类打包到一个dex(patch.dex)中去,然后把这个dex插入到Elements的最前面,在遍历时候获取到最前面的dex然后返回,后面的就不管了。目前较火的热修复方案大致分为两派,分别是:

(1)阿里系:DeXposed、andfix:从底层二进制入手c语言替换方法。

(2)腾讯系:tinker:从java加载机制入手,替换class文件。

1、QQ空间超级补丁技术

基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把bug方法修复以后,放到一个单独的dex里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。当patch.dex中包含Test.class时就会优先加载,在后续的DEX中遇到Test.class的话就会直接返回而不去加载,这样就达到了修复的目的。详细步骤如下:

(1)通过获取到当前应用的Classloader,即为BaseDexClassloader;

(2)通过反射获取到他的DexPathList属性对象pathList;

(3)通过反射调用pathList的dexElements方法把patch.dex转化为Element[];

(4)两个Element[]进行合并,把patch.dex放到最前面去;

(5)根据类的加载机制,加载Element[],达到修复目的。

特点是产很灵活,对开发者透明,但是不支持即时生效,必须通过重启才能生效。另外当插入的dex比较多的时候影响启动性能比较大。

2、微信Tinker修复方案

微信针对QQ空间超级补丁技术的不足提出了一个提供DEX差量包,整体替换DEX的方案。主要的原理是与QQ空间超级补丁技术基本相同,区别在于不再将patch.dex增加到elements数组中,而是差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并,然后整体替换掉旧的DEX文件,以达到修复的目的。

特点是稳定性比较高,与超级补丁技术一样,不支持即时生效,必须通过重启应用的方式才能生效。对于多DEX的应用来说,如果修改了多个DEX文件,就需要下发多个patch.dex与对应的classes.dex进行合并操作时这种情况会更严重,因此合并过程的失败率也会更高。

3、阿里系AndFix修复方案

AndFix不同于QQ空间超级补丁技术和微信Tinker通过增加或替换整个dex的方案,提供了一种运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。AndFix对ART设备同样支持,具体的过程与Dalvik相似。替换流程如下:

Dalvik设备——>Native层找到被替换的类——>将类的状态设置为初始化完毕——>得到新旧方法的指针——>操作指针,指针指向新的替换方法——>完成新的方法替换。

特点是及时性强,不需要重启手机,生成的差量包小,性能损耗小,缺点是是不支持新增字段,也不支持对资源的替换,和ROM关系很大,一旦厂商修改ROM下发就失败了。

4、三个热修复技术比较

关于热修复微信Tinker的接入请参考:

https://blog.youkuaiyun.com/yoonerloop/article/details/80246265

四、增量更新

自从 Android 4.1 开始, Google Play 引入了应用程序的增量更新功能,App使用该升级方式,可节省约2/3的流量。在APP应用商城上我们可以看到很多APP显示省流量更新,这就是使用了增量更新技术。如下:

1、原理

old.apk  new.apk,服务端比较两个安装包的差异生成增量包patch,客户端下载增量包patch,下载完成后和olde.apk合成新的new.apk再安装。这样可以减少很多下载中的流量。比较有名的开源库为bsdiff,使用bsdiff可以生成增量包和合并增量包。这个增量更新的过程需要客户端和服务端同时支持。

2、注意事项

(1)增量包patch可以在dos命令生成也可以服务端生成。

(2)差分包的版本问题,一般在服务器会保存几个拆分包,如果用户当前为1.0版本,很久没更新,一下子需要升级到6.0这时候就不合适用拆分包,可能1.0到6.0的拆分包比直接下载还大,这时候需要全量更新了,这种情况需要在代码中进行判断,版本差异比较下,变化比较下使用差分包,版本差异很大或者架构调整很多适合用全量包。所有一个APP集成增量更新的同时也需要集成全量更新功能。

(3)集成增量更新需要用到NDK技术,集成步骤请查看相关文档。

 

参考文献:

https://blog.youkuaiyun.com/qq_31530015/article/details/51785228?locationNum=11

 

 

 

Android中动态载入自定义类 普通的Android程序Dalvik虚拟机都是从一个默认的地方载入程序需要的类文件(dex文件),而Dalvik虚拟机还提供了从其他地方载入类的能力(比如从设备的内部存储空间以及互联网). 这种自定义类加载机制可以使用于一些场景: dex文件只能包含最多64K的函数引用,对于大型的程序如果超过了该数字,就可以通过把程序打包为多个dex文件来实现,在程序运行的时候在加载这些需要的类 一些开发框架可以通过运行时自定义类加载机制来设计出更加可扩展的框架 通过该方式实现更加强壮的程序注册机制,防止被人破解 载入自定义类的过程 获取需要载入的自定义类的dex文件,可以是设备本地的文件或者互联网上的文件 把获取到的自定义类dex文件保存到程序的内部储存空间中:new File(getDir(“dex”, Context.MODE_PRIVATE),SECONDARY_DEX_NAME); 通过DexClassLoader类加载器来解析优化前面的dex文件 通过DexClassLoader的loadClass函数来载入类 通过获得到的类的newInstance函数来生成需要的对象 开始使用获取到的动态类对象~\(≧▽≦)/~啦啦啦 立即下载

相关推荐

【路由交换】思科5506防火墙三区域互通

思科 5506 inside outside dmz 互通

baidu_22774701的博客 6203

Android中类加载机制

它允许类加载器委派加载类的请求给其父类加载器,直到找到可以加载该类的类加载器为止。**按 DEX 文件加载顺序加载:**如果父类加载器中不存在该类,则按 DEX 文件加载顺序加载 DEX 文件中的类。第一个加载的 DEX 文件中的类将被加载。**System ClassLoader:**加载系统类路径 (CLASSPATH) 中的类,例如 java.class.path 中的类。**DexClassLoader:**用于加载从 DEX 文件加载的类,通常用于加载 Android 应用中的类。

shuizhizhiyin的专栏 1575

保姆级教程:在Rockchip RK3588 SDK中,如何为你的新硬件板子创建第一个DTS文件

本文提供在Rockchip RK3588 SDK中为自定义硬件创建首个DTS文件的详细教程。通过分析DTS在RK3588开发中的角色、快速定位参考设计、实操步骤及调试验证方法,帮助开发者高效完成硬件板级配置,特别适合嵌入式Linux系统开发者参考。

weixin_28678831的博客 282

Android基础——类加载器和动态加载

关于动态加载和类加载器的简单理解

weixin_44901971的博客 2331

智能车竞赛新手必看:单车定向组直线竞速与八字慢速实战技巧

本文为智能车竞赛新手提供单车定向组直线竞速与八字慢速的实战技巧,涵盖赛道分析、动力调校、传感器配置等关键环节。通过真实案例和代码示例,详细讲解如何平衡速度与稳定性,帮助选手避免常见失误,提升比赛成绩。特别针对智能车竞赛中的直线竞速和八字慢速项目,提供从硬件选型到临场策略的全方位指导。

weixin_28718793的博客 430

基于RK3588的高效音视频对讲系统设计与实现

本文详细介绍了基于RK3588芯片的高效音视频对讲系统设计与实现。文章深入剖析了RK3588在8K编解码、高性能音频DSP及丰富接口方面的优势,并提供了从开发环境搭建、分层软件架构设计,到视频采集编码、音频回声消除及低延迟网络传输的完整实战指南,旨在帮助开发者充分利用该芯片硬件能力,构建稳定、低延迟的实时通信系统。

dapp9builder的博客 254

gradle 部分jar导入报错_弄懂Gradle依赖 Android依赖导入全攻略

原标题:弄懂Gradle依赖 Android依赖导入全攻略本文作者作者:大头呆链接:https://juejin.im/post/5acd6daaf265da238a30ca73本文由作者授权发布。在我们开发安卓项目的时候,不会所有的功能都自己去造轮子,经常要使用到各种的其他包,其中有谷歌给我们提供的各种support包,也有各种第三方的功能库,有时候我们自己也会将一些功能封装成包。这些包存在和导...

weixin_33599503的博客 1430

Modbus CRC和LRC算法研究及代码实现

一、CRC(循环冗余校验) 1 CRC16实现流程 XOR = 异或 N = 字节的信息位 POLY = CRC16 多项式计算 = 1010 0000 0000 0001 (生成多项式 = 1 + x2 + x15 + x16) 在CRC16中,发送的第一个字节位低字节 2 CRC16实例推导 3 CRC16代码实现 unsigned short CRC16(unsigned char *a...

Hi, Boy 2891

Android快速开发系列 10个常用工具类

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/38965311,本文出自【张鸿洋的博客】 打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~ 在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1、日志工具类L.java [java

struggling的专栏 987

半导体晶圆调平系统:基于最小二乘法的实现方案

基于最小二乘法的晶圆调平技术通过数学建模与工程实现的结合,解决了半导体量测中高精度平面对准的核心问题。实际应用中,需根据设备特性优化采样策略、校准传感器误差,并通过实时性优化满足高产能场景需求。该方案的模块化设计(如分离数据采集、拟合计算、补偿输出)也为后续功能扩展(如引入机器学习优化拟合模型)提供了灵活性。

品质生活,极致编程。 1177

Challenge 6 - OSCP C

开放了161端口,直接snmpbulkwalk扫描得到账号密码试了那几个web端口,发现可以登录8083的vesta,但是需要用户名大写Jack接着登录之后里面可以创建计划任务,直接弄个反弹shell,一分钟回弹。得到shell后,运行linpeas.sh提供了几个可能的漏洞,挨个试一下。

羽的博客 4109

android加载已安装应用程序,Android应用开发提高系列——Android动态加载(下)——加载已安装APK中的类和资源...

前言Android动态加载(下)——加载已安装APK中的类和资源。声明欢迎转载,但请保留文章原始出处:)博客园:http://www.cnblogs.com农民伯伯: http://over140.cnblogs.comAndroid中文Wiki:http://wikidroid.sinaapp.com正文一、目标注意被调用的APK在Android系统中是已经安装的。从当前APK中调用另外一个已安...

weixin_34609222的博客 278

基于深度学习的人脸识别考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

基于深度学习的口罩人脸识别的考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1820

Android应用开发提高系列(5)——Android动态加载(下)——加载已安装APK中的类和资源

文章出处:http://www.cnblogs.com/over140/archive/2012/04/19/2446119.html   前言    Android动态加载(下)——加载已安装APK中的类和资源。 声明   欢迎转载,但请保留文章原始出处:)     博客园:http://www.cnblogs.com     农民伯伯: http://over140.cnb

zhou699的专栏 1129

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

安卓逆向之脱壳-认识一下动态加载 双亲委派(一)

Android 使用多种来加载不同类型的类。默认情况下,Android 使用的是来加载应用程序的dex文件。系统 ClassLoader (:它负责加载 Android 系统核心库(如android.*和java.*等)。应用 ClassLoader (:负责加载应用程序的主dex文件。用户 ClassLoader (:在一些高级应用中,允许动态加载外部的dex文件(例如插件化框架)。每个都有自己的类加载路径,它们通过层层委托的方式来加载类。委托模式意味着一个会请求父加载类,直到找到该类为止。如果父。

SXXYNHHXX的博客 2074

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类

http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html 前言   近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流!   关键字:Android动态加载   声明   欢迎转载,但请保留文章原始出处:

mengzhengjie的专栏 425

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...

前言   近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流!   关键字:Android动态加载   声明   欢迎转载,但请保留文章原始出处:)      博客园:http://www.cnblogs.com     农民伯伯: http://over140.cnblogs.com ...

幸福过饱和的专栏 97

[转]Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...

本文转自:http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html 前言   近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流!   关键字:Android动态加载 声明   欢迎转载,但请保留文章原始出处:)...

weixin_30788731的博客 54

安卓内嵌uniapp的H5页面 android调用h5内部方法

1、准备我这里是uniapp与原生安卓之间的相互调用,也就是原生安卓内嵌H5页面,下面先来准备一下安卓端的代码。(2)、初始化的方法onCreate 设置 WebView 的参数及各种设置,这里主要是开启js 的调用 和添加H5调用的类,相当于在项目启动的时候就加载H5需要调用的类。uniapp H5与原生安卓的数据互通和方法调用_安卓代码中调用uniapp中页面中的方法-优快云博客。

前端小胡兔的博客 1579

Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类[转]...

转http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html 前言   近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流!   关键字:Android动态加载 声明   欢迎转载,但请保留文章原始出处:)     博客...

weixin_30872867的博客 80
上一篇: 探究ZoomImageVie中的图片居中和多点触控
下一篇: 日历时间选择器
一杯清泉
博客等级 码龄11年 314粉丝 210原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值