修復前:點選文字沒有跳轉
修復後:點選文字可以跳轉(增加了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檔案,所以保證了成功率。