Android Resources的一點筆記

  1. 一個進程有一個ResourcesManager類, 單例; 一個ResourcesManager類管理多個Resources;
  2. ResourcesManager中, 由mActiveResources的map, 保存多個ResourcesKeyResources的鍵值對, (不同分辨率, 語言); 由getTopLevelResources獲取對應(yīng)的Resources
  3. ContextImpl對象, 包含一個mResources的變量, context對象的getResources即返回此變量, 而mRseources對象由 getTopLevelResources方法獲取
  4. Resources對象包含 AssetManager 對象
  5. app不走正常的初始化,沒法獲得AssetManager, 但是可以通過反射創(chuàng)建, AssetManager的私有方法 addAssetPath 接受一個dex文件的路徑, 可以生成對于的AssetManager
AssetManager assetManager = AssetManager.class.newInstance();
Method addAssetPathMethod = assetManager.getClass().getMethod("addAssetPath", String.class);
addAssetPathMethod.invoke(assetManager,  apkPath );
  1. 根據(jù)原apk的context對象, 可以創(chuàng)建一個新的Resources對象
Resources superRes = context.getResources();
Resources apkResource = new Resources(assetManager,superRes.getDisplayMetrics(),superRes.getConfiguration());
  1. 每個資源屬性的定義, 由 packageName, TypeName, entryName 構(gòu)成, 可以由getResourceName(resId)獲得, "package:type/entry", 也可分別獲得 getResourcePackageName getResourceTypeName getResourceEntryName

  2. Resources.getIdentifier 方法, 根據(jù) entryName, typeName, package, 可獲取對應(yīng)資源在Resources對象中唯一的id;

int resId = mResources.getIdentifier(resName, "drawable", packageName);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容