主要记下引入Amigo的过程。
修复前:点击文字没有跳转
修复后:点击文字可以跳转(增加了Activity和布局文件)
其实热更新最重要的是不需要重新安装apk,有的甚至不需要重启app,就可以更新代码或者资源文件。
我对比目前的几大主流的热更新方案,感觉Amigo是目前最适合我的。
对比项
Amigo
Tinker
nuwa/QZone
AndFix
Dexposed
类替换
yes
yes
yes
no
no
lib替换
yes
yes
no
no
no
资源替换
yes
yes
yes
no
no
全平台支持
yes
yes
yes
yes
no
即时生效
optional
no
no
yes
yes
性能损耗
无
较小
较大
较小
较小
补丁包大小
较大
较小
较大
一般
一般
开发透明
yes
yes
yes
no
no
复杂度
无
较低
较低
复杂
复杂
gradle支持
yes
yes
yes
no
no
接口文档
丰富
丰富
一般
一般
较少
占Rom体积
较大
较大
较小
较小
较小
成功率
100%
较好
很高
一般
一般
上表来自Amigo的Github主页,觉得100%的成功率起到了很好的宣传效果!
tinker的功能非常强大,基本除了AndroidManifest.xml文件和tinker本身少数几个类之外,其他内容都能替换,包括布局、资源。不足之处在于其首次配置稍有点复杂,上手难度较AndFix稍高一些。
AndFix不可以修复Application的onCreate(),而且现在已经升级为SopHix,SopHix需要使用阿里的平台,每月免费5万台。目测SopHix的功能很强大,但是要接入阿里……
Robust是美团的方案,但是由于进行了代码侵入,对运行效率、方法数、包体积都有影响,文件方法数变多,企业级应用可能会涉及到65535的问题。
Amigo是下载一个完整的APK(所以包有点大,当然也可以做差分包),支持增加Activity,支持修改资源文件。
重点是接入方便。
在 project 的 build.gradle中:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
......
classpath 'me.ele:amigo:0.6.8'
}
}
复制代码
对了,目前Amigo不支持gradle3.0,我用的是2.3.0。
在module的 build.gradle
apply plugin: 'me.ele.amigo'
android {
...
}
dependencies {
...
compile 'me.ele:amigo-lib:0.6.7'
}
//if you don't want use amigo in dev, set this value to true
//you can define this extension in your mybuild.gradle as to distinguish debug & release build
amigo {
disable false //default false
autoDisableInInstantRunMode true // default false
}
复制代码
调用更新(新的apk已经在本地)
var file = File(Environment.getExternalStorageDirectory().path + File.separator + "test.apk")
if(file.exists()){
Amigo.workLater(this, file) {
if(it){
toast("更新成功!")
val intent = packageManager.getLaunchIntentForPackage(packageName)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
android.os.Process.killProcess(android.os.Process.myPid())
}
}
}
复制代码
最后是重启App。
我调用Amigo.work(context, patchApkFile);方法app不会自动重启,需要手动点击图标启动。
在Amigo的插件中,替换原有 Application的,所以Amigo支持修改Application。
Amigo替换了整个dex文件,所以保证了成功率。