插件的概念:
1、插件不能独立运行,服务于宿主程序。
2、插件一般可以独立安装
3、宿主管理不同的插件,包括插件数量、启用禁用、切换、兼容性等等。
插件的实现:
基于DexClassLoader动态加载类文件。
AssetManager加载资源文件:
创建Resource对象:
public Resources getBundleResource(Context context, String apkPath){ AssetManager assetManager = createAssetManager(apkPath); return new Resources(assetManager, context.getResources().getDisplayMetrics(), context.getResources().getConfiguration()); }
创建AssetManager对象:
private AssetManager createAssetManager(String apkPath) { try { AssetManager assetManager = AssetManager.class.newInstance(); AssetManager.class.getDeclaredMethod("addAssetPath", String.class).invoke( assetManager, apkPath); return assetManager; } catch (Throwable th) { th.printStackTrace(); } return null; }
/**
* 插件apk路径
*/
String apkPath = Environment.getExternalStorageDirectory()+"/apkbeloaded-debug.apk";
/**
* 插件资源对象
*/
Resources resources = getBundleResource(this,apkPath);
/**
*获取图片资源
*/
Drawable drawable = resources.getDrawable(resources.getIdentifier("icon_be_load", "drawable",
"laodresource.demo.com.apkbeloaded"));
/**
* 获取文本资源
*/
String text = resources.getString(resources.getIdentifier("text_beload","string",
"laodresource.demo.com.apkbeloaded"));