Android Resources的一点笔记

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

  2. Resources.getIdentifier 方法, 根据 entryName, typeName, package, 可获取对应资源在Resources对象中唯一的id;

int resId = mResources.getIdentifier(resName, "drawable", packageName);

猜你喜欢

转载自blog.csdn.net/qq_23327993/article/details/88891788
今日推荐