最近简单研究了一下apk在线修复处理方式,有部分心得,就此分享下吧,这里指在线修复dex文件,不修复资源,但是可以扩展。
Android系统有个分水领,即支持一个dex和支持多个dex
1.如果系统支持多个dex,分享的方案可以支持不需要重启App就可以直接在线修复。
2.如果系统不支持多个dex,分享的方案则需要重启App后才能看到修复方案。
先说支持多个dex的吧,Android app默认是pathclassloader,父classloader一般BootClassloader,pathclassloader加载App本身的资源,bootclassloader一般加载android sdk资源,如果我们通过反射处理把pathclassloader的父classloader置换成我们自定义的Myclassloader,Myclassloader的父loader置换成BootClassloader,同时获取到pathclassloader的DexFile对象,这样所以非sdk的资源加载时必定通过Myclassloader加载,这样原来的classloader委派线路 pathclassloader-->BootClassloader ,就转变成pathclassloader-->Myclassloader-->BootClassloader.
当App通过补丁服务器获取补丁信息(包含补丁class全路径及下载路径),就可以在Myclassloader加载时进行class全路径过滤,加载对应的补丁dex/jar,此时如果补丁class里面依赖其他非补丁类,则使用pathclassloader的DexFile对象加载,这样就解决了大量依赖导致补丁包过大问题。但是此时系统必须支持多个dex,否则将采用下面的方案。
如果系统只支持一个dex则看下一个处理方案。