您的位置:首页 > 其它

动态加载apk

2016-03-12 10:46 507 查看
原文出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587

动态加载apk,也就是已经安装的apk去加载未安装的apk中的资源以及activty,去执行其中的逻辑,即使两个apk的签名不一样也可以。这样可以给我们的应用瘦身以及去动态更新应用(其实还有很多其他的用处,我还没有理解到位所以就只列了自己理解了的用处)。

实现的方式就是在已经安装的apk中的某个activity(这个activity是一个空的activity,只做加载的功能)中采用DexClassLoader去加载未安装的apk中的指定的class(也就是activity,因为没有安装所以就可以看成一个单纯的class),这个加载过程其实就是将未安装apk中的内容注入到已安装的apk中的那个空activity中,如果要实现跳转到未安装apk的另一个activity中其实就是空activity自己跳转到自己,唯一改变的就是参数(根据这个参数加载不同的内容),所以这里就对加载模式有要求,这一点原文中没有提到(经过测试也验证了我的想法,本人也去原文下面留了言,还有点小激动,虽然其实也没有什么),如果加载模式不是standard就不能跳转到未安装的apk的其他页面。

代码就不再这里贴了,大家可以去原文中看。。。

上面只是做了动态加载的第一步,第二步就是做到能加载资源文件,原文的代码就知道我们要去加载的apk中是在代码中写的界面,没有用到xml,如果要这样写的话效率就太低了,原文的博主也给出了解决方法:http://blog.csdn.net/singwhatiwanna/article/details/23387079

也就是在宿主程序ProxyActivity中加载资源,然后重写下面这两个方法

@Override
public AssetManager getAssets() {
return mAssetManager == null ? super.getAssets() : mAssetManager;
}

@Override
public Resources getResources() {
return mResources == null ? super.getResources() : mResources;
}


具体的加载资源的方法请看原文。

实现了上述两个方法以及加载了资源之后你会发现,可以加载布局文件了,比如简单加载一个只写了一个button按钮的布局而且这个没有设置背景什么的,但是如果你在xml中使用了图片什么的就不行了,图片的指定只能在代码中写。其实并不只图片,凡是在xml中使用@引入的资源(也就是在其他文件中的资源)都不能访问。不要问我为什么,谁叫这个apk没有安装。。。

下面给出我跟着原文写的demo(关键代码都是抄原文的,勿喷!!)

http://download.csdn.net/detail/u012806692/9462420
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: