- 一个进程有一个ResourcesManager类, 单例; 一个ResourcesManager类管理多个Resources;
- ResourcesManager中, 由
mActiveResources
的map, 保存多个ResourcesKey
和Resources
的键值对, (不同分辨率, 语言); 由getTopLevelResources
获取对应的Resources - ContextImpl对象, 包含一个
mResources
的变量, context对象的getResources
即返回此变量, 而mRseources
对象由getTopLevelResources
方法获取 - Resources对象包含 AssetManager 对象
- app不走正常的初始化,没法获得AssetManager, 但是可以通过反射创建, AssetManager的私有方法
addAssetPath
接受一个dex文件的路径, 可以生成对于的AssetManager
AssetManager assetManager = AssetManager.class.newInstance();
Method addAssetPathMethod = assetManager.getClass().getMethod("addAssetPath", String.class);
addAssetPathMethod.invoke(assetManager, apkPath );
- 根据原apk的
context
对象, 可以创建一个新的Resources对象
Resources superRes = context.getResources();
Resources apkResource = new Resources(assetManager,superRes.getDisplayMetrics(),superRes.getConfiguration());
-
每个资源属性的定义, 由 packageName, TypeName, entryName 构成, 可以由
getResourceName(resId)
获得, "package:type/entry", 也可分别获得getResourcePackageName
getResourceTypeName
getResourceEntryName
-
由
Resources.getIdentifier
方法, 根据 entryName, typeName, package, 可获取对应资源在Resources对象中唯一的id;
int resId = mResources.getIdentifier(resName, "drawable", packageName);
网友评论