一偷遗、通用的修復(fù)方式
? ? ? 構(gòu)造一個新的AssetManager,并通過反射調(diào)用addAssetPath,把這個完整新的資源包加入到AssetManager中锄蹂,這樣就得到了一個包含新資源的AssetManger牙瓢。找到之前所有引用到原有AssetManger的地方畦韭,通過反射轧叽,替換掉原來的AssetManger弯予。
?缺點:處理大量的兼容性問題戚宦。這種方式在Android L之后,會解析資源包锈嫩,但是獲取資源時還是引用舊的資源受楼,然后在引用補丁包的資源,4.4以下呼寸,不會發(fā)生解析新的資源包艳汽,根本修復(fù)不了。
二对雪、AssetManager的替換
? 在Android L 之后河狐,直接在原來的AssetManager添加patch就可以了,這里的patch,packageId 不可以是0x7f 和0x01 瑟捣。
在Android 4.4 及以下:調(diào)用AssetManager的destory方法馋艺,destory方法是個native方法,調(diào)用native destory方法迈套,解除java層AssetManager對native層AssetManger的使用捐祠,然后調(diào)用init方法進行重新構(gòu)造AssetManager,制空mstringBlocks,重新添加原來AssetManager加載過的資源路徑,添加patch的資源路徑桑李,重新對mStringBlocks賦值踱蛀,mStringBlocks記錄了之前加載過的所有資源包的String bool 。