资源修复-深入热修复(2)

一、通用的修复方式

      构造一个新的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 。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容