概念汇总
- 动态加载:在程序运行的时候,加载一些程序自身原本不存在的可执行文件并运行这些文件里的代码逻辑。
- 增量更新:做更新的时候更新部分,将旧版本的apk和差异包合并成为一个新的apk,引导客户安装
- 热修复:修改了小部分代码,不用重新发包,在用户不知情的情况下,给app打补丁,让app按照补丁的逻辑运行
- 插件化:拆分apk,形成宿主+寄生关系
- 组件化:把常用的模块代码,抽取lib工程或者jar达到复用的效果
- multiDex:dex内方法数目超过65536(short长度范围-32768~32767),会提示错误,就需要拆分dex;
增量更新
- 优点:节省流量,加快更新速度
- 缺点:
- 针对不同版本要生成不同的差异包
- 不安装官方版本无法做更新
- 实现:开源项目SmartAppUpdates(核心是bsdiff),友盟(已停止更新)
热修复HotFix
- AndFix
- Dexposed
- nuwa
- HotFix
dexposed和andfix是alibaba的开源项目,都是apk增量更新的实现框架,目前dexposed的兼容性较差,只有2.3,4.04.4兼容,其他Android版本不兼容或未测试,而andfix则兼容2.36.0。
核心都是classloader。
参考http://www.jianshu.com/p/d791bbede02c
动态加载
- 概念:在程序运行时,加载一些程序自身原本不存在的可执行文件,并且运行这些文件里面的代码逻辑。
- 开源项目
- DynamicLoadApk(携程)
- Atlas(阿里)
- DroidPlugin(360)
- DexClassLoader(可以加载dex,jar,apk),PathClassLoader(只能加载已经安装过的apk)
- 动态加载activity
- 代理方式动态加载activity
代理模式中,使用一个代理Activity去完成本应该由插件Activity完成的工作,这个代理Activity是一个标准的Android Activity组件,具有生命周期和上下文环境(ContextWrapper和ContextCompl),但是它自身只是一个空壳,并没有承担什么业务逻辑;而插件Activity其实只是一个普通的Java对象,它没有上下文环境,但是却能正常执行业务逻辑的代码。代理Activity和不同的插件Activity配合起来,就能完成不同的业务逻辑了。所以代理模式其实还是使用常规的Android开发技术,只是在处理插件资源的时候强制调用了系统的隐藏API,因此这种模式还是可以稳定工作和升级的。- 主APK可以启动未安装的插件APK;
- 插件APK也可以作为一个普通APK安装并且启动;
- 插件APK可以调用主APK里的一些功能;
- 主APK和插件APK都要接入一套指定的接口才能实现以上功能;
-
动态创建activity
动态创建Activity模式,在主项目里注册一个通用的Activity(比如TargetActivity)给插件里所有的Activity用,被动态创建出来的Activity类是有在主项目里面注册的,它是一个标准的Activity,它有自己的Context和生命周期,不需要代理的Activity。- 主APK可以启动一个未安装的插件APK;
- 插件APK可以是任意第三方APK,无需接入指定的接口;