talk is cheap,先看代码:
try (
// 创建AssetManager
AssetManager assetManager = AssetManager.class.newInstance()
) {
// 反射调用 调用 addAssetPath 方法
Method method = AssetManager.class.getDeclaredMethod("addAssetPath", String.class);
method.setAccessible(true);
//目标apk 所在地址
String path = getFilesDir().getPath() + File.separator + "skin_package-debug.apk";
/// 反射执行方法
method.invoke(assetManager, path);
// 新建一个Resources
Resources resources = new Resources(assetManager, createDisplayMetrics(), createConfiguration());
/// 加载drawable
int drawableId = resources.getIdentifier("image", "drawable", "com.example.skin_package");
imageSkin.setImageDrawable(resources.getDrawable(drawableId, null));
} catch (Exception e) {
e.printStackTrace();
}
大概思想:
AssetManager 是用来管理apk的,然后 apk 的各种信息是保存在 apkAssets 中,而 addAssetPath 方法主要就是 将 path 路径下的 resource 资源 重新解析 到 apkAssets 中,然后 新建一个 resources 对象,通过 新建的 resources 对象获取 对应 id,然后 通过常规的 方法进行 设置生效即可。