Android apk动态加载机制的研究

Android apk动态加载机制的研究

1.问题:
app内的方法数超过谷歌限制的64k,即app爆棚了;
工程量大,编译缓慢。

2.解决方案:app的动态部署,也叫做app的插件化。

3.原理:
先安装一个空壳apk(也叫宿主程序),然后动态加载其他apk在宿主程序中运行。
4.问题:
①.资源文件的读取。因为apk加载到宿主程序中去,无法通过context去读取。
解决方案:通过加载apk的资源到Resurce中来,这样就能用R文件找到资源文件了;
②.activity生命周期的管理
加载到宿主程序的activity和一般的类一样,只能手动管理生命周期,手动传入各参数

5.详细设计:
宿主程序的实现:
①.主界面,放了一个button,点击就会调起apk,我把apk直接放在了sd卡中,至于先把apk从网上下载到本地再加载其实是一个道理。

@Override
public void onClick(View v) {
if (v == mOpenClient) {
Intent intent = new Intent(this, ProxyActivity.class);
intent.putExtra(ProxyActivity.EXTRA_DEX_PATH, “/mnt/sdcard/DynamicLoadHost/plugin.apk”);
startActivity(intent);
}

}

②.首先要加载apk中的资源:
view plaincopyfile:///C:\Users\Gaoyang\AppData\Local\Temp\ksohtml\wps_clip_image-26568.png
protected void loadResources() {
try {
AssetManager assetManager = AssetManager.class.newInstance();
Method addAssetPath = assetManager.getClass().getMethod(“addAssetPath”, String.class);
addAssetPath.invoke(assetManager, mDexPath);
mAssetManager = assetManager;
} catch (Exception e) {
e.printStackTrace();
}
Resources superRes = super.getResources();
mResources = new Resources(mAssetManager, superRes.getDisplayMetrics(),
superRes.getConfiguration());
mTheme = mResources.newTheme();
mTheme.setTo(super.getTheme());
}
说明:加载的方法是通过反射,通过调用AssetManager中的addAssetPath方法,我们可以将一个apk中的资源加载到Resources中,由于addAssetPath是隐藏api我们无法直接调用,所以只能通过反射,下面是它的声明,通过注释我们可以看出,传递的路径可以是zip文件也可以是一个资源目录,而apk就是一个zip,所以直接将apk的路径传给它,资源就加载到AssetManager中了,然后再通过AssetManager来创建一个新的Resources对象,这个对象就是我们可以使用的apk中的资源了,这样我们的问题就解决了。

③.activity生命周期的管理
我们要在代理activity中去反射apk中activity的所有生命周期的方法,然后将activity的生命周期和代理activity的生命周期进行同步。首先,反射activity生命周期的所有方法,还反射了onActivityResult这个方法,尽管它不是典型的生命周期方法,但是它很有用。
view plaincopyfile:///C:\Users\Gaoyang\AppData\Local\Temp\ksohtml\wps_clip_image-20158.png
protected void instantiateLifecircleMethods(Class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值