在研究dexposed时候,怎么使用另外一个apk的资源。
我们知道,activity的工作主要是由ContextImpl来完成的, 它在activity中是一个叫做mBase的成员变量。注意到Context中有如下两个抽象方法,看起来是和资源有关的,实际上context就是通过它们来获取资源的,这两个抽象方法的真正实现在ContextImpl中。也即是说,只要我们自己实现这两个方法,就可以解决资源问题了。
public abstract AssetManager getAssets();
public abstract Resources getResources();
以下是我的实现方式:
首先需要把新的包资源添加到宿主包中:
/**
* 添加 新的 apk文件资源 到宿主apk文件中
*
* @param dexPath 新的apk文件
* @return 资源管理
*/
public static AssetManager createAssetManager(String dexPath) {
try {
AssetManager assetManager = AssetManager.class.newInstance();
// 反射添加新的dex包的
Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
addAssetPath.invoke(assetManager, dexPath);
return assetManager;
} catch (Exception e) {
return null;
}
}
然后把资源路径放入资源中
/**
* 创建 新的资源resources 添加
*
* @param activity 上下文
* @param assetManager 资源路径管理
* @return 新的资源(包含 新加包,宿主包)
*/
public static Resources createResources(Activity activity, AssetManager assetManager) {
Resources superRes = activity.getResources();
Resources resources = new Resources(assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());
return resources;
}
这样我们就获取到了新的 Resources 资源了,我们就可以使用新的资源加载patch 包中的资源了。
参考博客:http://www.cnblogs.com/lee0oo0/p/3665066.html