基于Nuwa实现Android自动化HotFix

作者: Archmage | 来源:发表于2015-12-29 19:50 被阅读13594次

    What--什么是HotFix

    HotFix是针对某一个具体的系统漏洞或安全问题而发布的专门解决该漏洞或安全问题的小程序,通常称为修补程序

    Why--为什么我们要用HotFix

    试想这样一个场景:当Android发布App之后,如果突然发现了一个严重bug,而这个bug需要进行紧急修复

    这时候我们通常的处理流程是:解决bug、重新打包App、测试、向各个应用市场和渠道换包、提示用户升级、用户下载、覆盖安装。有时候仅仅是为了修改了一行代码,也要付出巨大的成本进行换包和重新发布。用户体验来很是糟糕

    Question: 有没有办法不重新发布App,不需要用户重新下载覆盖安装,就可以完成Bug的修复?

    答案是Yes,HotFix就是做这个事情的。Android HotFix原理介绍可以参照这里:HotFix

    Nuwa(女娲)是一个自动化的工具,基于上述原理将骤自动化了,下面我就介绍一下如何使用

    How--怎么用

    添加Gradle Plugin

    在工程的根build.gradle文件中添加

    classpath 'cn.jiajixin.nuwa:gradle:1.2.2'

    然后我们的build.gradle文件可能长这样:

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:1.2.3'
            classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
        }
    }
    

    添加Nuwa SDK

    在app的build.gradle中添加依赖:

    apply plugin: "cn.jiajixin.nuwa"

    然后我们的build.gradle文件可能长这样:

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'cn.jiajixin.nuwa:nuwa:1.0.0'
    }
    

    【备注】 这边有个坑,2.0版本的Android Studio为了支持Instant Run, 默认使用的Gradle Plugin是2.0.0-alpha2, 如果用此版本,会报错Error:Cannot get property 'taskDependencies' on null object,乖乖降低到1.2.3,木有此问题

    使用Nuwa

    1.自定义Application,并且在Application类中添加如下代码:

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        Nuwa.init(this);
        Nuwa.loadPatch(this,"/sdcard/patch.jar")
    }
    

    2.运行并安装apk,会在app/build/outputs/目录下自动生成一个叫nuwa的目录:

    拷贝此目录到一个指定的目录,比如:

    /Users/Documents/nuwa

    此apk目前是有bug的apk, 然后我们修复bug, 修复完毕后进入步骤3

    3.在修复完bug的code base下执行如下命令:

    ./gradlew clean nuwaDebugPatch -P NuwaDir=/Users/Documents/nuwa

    然后在app/build/outputs/nuwa/debug/目录下会自动生成patch.jar文件:

    此文件就是我们热部署的补丁文件

    4.我们把补丁文件拷贝到sdcard根目录(这边只是为了测试整个hotfix流程, 自己的项目肯定是放在服务器上,我们通过代码自己去下载和存储)

    adb push app/build/outputs/nuwa/debug/patch.jar /sdcard/

    5.重新启动app,Bug Fix😀

    代码混淆

    在proguard-rules.pro中添加:

    -keep class cn.jiajixin.nuwa.** { *; }

    我写了一个简单地例子用于演示,点此查看

    相关文章

      网友评论

      • 三十而立_f5ae:github搜nuwa2,做了些改进,兼容gradle2.x
      • 乱舞小天1009:补丁管理后台和客户端接入代码
        https://github.com/baidao/tinker-manager
      • wxq123:llllo
      • 代码GG陆晓明:有无替代产品?降低Gradle Plugin版本,databinding 没法用最新的了。
        代码GG陆晓明:@Archmage 多谢回复,据说这些都有bug。。
        Archmage:@代码GG 有,AndFix, DroidFix,HotFix都可以,Nuwa只是比较自动化一些
      • 3cea7bc29e70:无法生成 patch.jar 文件,我已经修改了!
        miffy_stone:我也无法生存patch.jar文件,就连hash.txt文件里都没有内容:disappointed_relieved:
        丹_1314:最后解决了吗,我也是无法生成patch.jar文件,报错是sdk目录下的dx.bat有问题,不知道你是否同样的原因
      • 吕檀溪:我在打修复包的时候(./gradlew clean nuwaDebugPatch -P NuwaDir=/Users/Documents/nuwa)一直抛出Execution failed for task ':app:nuwaClassBeforeDexDebug',求指教
      • 2f19e49192b6:为什么我在编译的时候执行到nuwa的task的时候,出现异常,提示android_home is not defined 实际上我的path中是有这个环境变量的啊 mac 系统
      • 猫狗爪抓:确实有很多要注意的地方,作者现在貌似不太有时间关注这个框架,很多提问没有回答。

        不过看看那些已关的issue可以找到很多填坑方法。

        我的项目已经集成进来并投入使用了,还不错! :wink:
        猫狗爪抓:@WalterBryant 终端中定位到工程目录下执行。这就是一个gradle命令
        猫狗爪抓:@WalterBryant 意思是你有个bug,然后修改代码把它修复了,然后,在终端中,对这个工程执行nuwa生成补丁的命令就会得到一个patch.jar的补丁文件了。
        猫狗爪抓:@WalterBryant 出了什么错误吗?按照github上的说明就可以了啊:grin:
      • HuDP:生成成功后 并没有什么东西出来
      • Deng偉:没遇到一个坑?
      • 尛坏蛋:nuwa很多坑,作者都不填,谁用谁知道。
        尛坏蛋:@尛坏蛋 ,这个东西去年就出来了,坑早就发掘出来了,建议你们别用。我使用nuwa在生产环境中有一些时间,后面被各种bug导致被迫放弃
        HarveyLegend:@尛坏蛋 你们说的坑是啥,给点指点啊
        dd9672cdcbb0:@尛坏蛋 正想用呢,还望告知...3Q

      本文标题:基于Nuwa实现Android自动化HotFix

      本文链接:https://www.haomeiwen.com/subject/qzlihttx.html