与Android热更新方案Amigo的初次接触

4,133 阅读2分钟

图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文件,所以保证了成功率。