修复前:点击文字没有跳转
修复后:点击文字可以跳转(增加了Activity和布局文件)
其实热更新最重要的是不需要重新安装apk,有的甚至不需要重启app,就可以更新代码或者资源文件。
我对比目前的几大主流的热更新方案,感觉Amigo是目前最适合我的。
上表来自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文件,所以保证了成功率。