插件化 加载其他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()); } }
