與Android熱更新方案Amigo的初次接觸

我是綠色大米呀發表於2019-03-04

圖1
主要記下引入Amigo的過程。

修復前:點選文字沒有跳轉

修復後:點選文字可以跳轉(增加了Activity和佈局檔案)

圖2

其實熱更新最重要的是不需要重新安裝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檔案,所以保證了成功率。

與Android熱更新方案Amigo的初次接觸

相關文章