外掛化 載入資源的核心程式碼
阿新 • • 發佈:2019-01-29
外掛化 載入其他apk 的資源的核心思想是 拿到其他apk 的Resources 物件,然後通過反射 ,
可以拿到 我們想要的資源,然後使用。
拿到其他apk 的物件 ,主要是通過 AssetManager 的 addAssetPath,方法;
因為這個方法在frameWork 層,所以要通過反射來拿;
相關framework層程式碼 涉及到(contentImp,ApkLoad,AssetManager )
/**
* 外掛化載入資源的核心程式碼* @author lsw8569013
*
*/
public class PluginResource extends Resources{
public PluginResource(AssetManager assets, DisplayMetrics metrics,
Configuration config) {
super(assets, metrics, config);
// TODO Auto-generated constructor stub
}
public static AssetManager getAssetManager(File file ,Resources resource){
//
try {
Class<?> AssetManager = Class.forName("android.content.res.AssetManager");
Method[] declaredMethods = AssetManager.getDeclaredMethods();
for(Method method : declaredMethods){
if(method.getName().equals("addAssetPath")){
android.content.res.AssetManager assetManager = AssetManager.class.newInstance();
method.invoke(assetManager, file.getAbsolutePath());
return assetManager;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
public static PluginResource getPluginResource(Resources res,AssetManager assetManager){
return new PluginResource(assetManager, res.getDisplayMetrics(), res.getConfiguration());
}
}