一、通用的修复方式
构造一个新的AssetManager,并通过反射调用addAssetPath,把这个完整新的资源包加入到AssetManager中,这样就得到了一个包含新资源的AssetManger。找到之前所有引用到原有AssetManger的地方,通过反射,替换掉原来的AssetManger。
缺点:处理大量的兼容性问题。这种方式在Android L之后,会解析资源包,但是获取资源时还是引用旧的资源,然后在引用补丁包的资源,4.4以下,不会发生解析新的资源包,根本修复不了。
二、AssetManager的替换
在Android L 之后,直接在原来的AssetManager添加patch就可以了,这里的patch,packageId 不可以是0x7f 和0x01 。
在Android 4.4 及以下:调用AssetManager的destory方法,destory方法是个native方法,调用native destory方法,解除java层AssetManager对native层AssetManger的使用,然后调用init方法进行重新构造AssetManager,制空mstringBlocks,重新添加原来AssetManager加载过的资源路径,添加patch的资源路径,重新对mStringBlocks赋值,mStringBlocks记录了之前加载过的所有资源包的String bool 。