动态加载apk

原文出处: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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值