android hotfix nuwa2, support gradle 2.x

说明:
热修复是什么?热修复就是app出现bug之后无需用户更新app就能静默修复bug,注意不是web页面而是可以静默修复原生bug哦。
外面的热修复框架都是公说公有理,婆说婆有理,既然如此,我就都体验一番。
以前使用阿里的andfix集成到我们的项目,听云错误监听工具发现,兼容性80%-90%,报错率达到0.1以上,不可使用。
腾讯微信的tikner也体验过,操作复杂,文档复杂,且不支持加固,国内360助手安卓市场,必须用360加固软件加固后才能发包,故暂不用tinker。
美团的Robust据说比较稳定,17年3月份也开源了,看了下他们文档,不过操作和注意点还是挺多的。
大众点评某工程师开发的一套nuwa,用的是DexClassLoader,兼容性好,稳定性高,针对加固的APP,如360加固仅支持修复MainActivity加载之后的MainActivity之外的代码。
但是作者的nuwa,仅支持gradle 1.2.3(即项目根目录build.gradle中的classpath 'com.android.tools.build:gradle:1.2.3')。
现在都更新到2.3了,instant-run等都需要新版gradle才能支持,所以很多人都不愿意用。作者没维护,因为他自己创业去了?好像后面就没碰这些代码了吧。
由于nuwa稳定可靠,操作简单,不要浪费前人的血汗,经过对比多个热修复框架之后,我决定把他的gradle插件更新了一番,支持1.x到现在的2.x版本,另外完善了之前的部分细节。
支持新增包、新增类、新增方法、新增变量、修改类、不能修改资源文件、不能修改Application子类,限制只能修改App包名下的java文件,第三方库不能修改。

下面说明操作步骤(Teamlib SDK内部基础library项目默认已集成,具体参见HotfixManager.java类注释。下面介绍单独集成方式):
1.复制plugin文件夹到项目中app/plugin

-------------------------------------------------------------------------------------------------------------------------------

2.需要添加SD卡读写两个权限(安卓6.0以上需要申请权限哦~)
< uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

-------------------------------------------------------------------------------------------------------------------------------

3.复制追加proguard-rules.pro中的混淆到你的项目混淆文件,并且app/build.gradle中开启混淆(如果你的项目中有配置的某一行,则那一行可以不用重复写了)
buildTypes {
   release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
   }
}

-------------------------------------------------------------------------------------------------------------------------------

4.app/build.gradle添加插件
apply plugin: 'com.android.application' //这句想必你的项目自带已经有了吧,不用重复复制
buildscript {
    repositories {maven {url uri('./plugin')}}
    dependencies {classpath 'cn.jiajixin.nuwa:buildsrc:2.0'}
}
apply plugin: 'cn.jiajixin.nuwa'

dependencies中追加一个依赖
compile 'cn.jiajixin.nuwa:nuwa:1.0.0'
然后同步一下,rebuild一下

-------------------------------------------------------------------------------------------------------------------------------

5.自定义Application重写下面这个方法
@Override
protected void attachBaseContext(Context base) {
   super.attachBaseContext(base);
   try{
       //放到Application直接子类这里,不要封装到其他地方
        Nuwa.init(base);
        //具体补丁位置可以修改,补丁名称建议用VERSION_CODE区别,别每个版本的APK都加载同一个补丁哈
        //可以让服务端弄个接口检测是否要下载补丁,下载完成killProcess重启应用,仅简单finish不行哈,要killProcess,比如利用AlarmManager重启Application
        String patch = "/sdcard/patch_"+BuildConfig.VERSION_CODE+".jar";
        Nuwa.loadPatch(base, patch);
    }catch (Throwable e){//6.0系统要自己申请权限,如果想省事,可以直接配置targetSdkVersion 22
        e.printStackTrace();
    }
    //其他代码写在后面
}

-------------------------------------------------------------------------------------------------------------------------------

6.集成完了,简单吧。下面来测试打补丁,打包release版本apk,会在app/build/outputs中生成nuwa文件夹,备份好,例如放到d:/nuwa,安装这个打包好的apk,
注意每次打包发布正式发APK时,要备份当前打包的时对应的源码,和对应的nuwa文件夹,因为制作补丁时将用到这份源码和nuwa文件夹。

-------------------------------------------------------------------------------------------------------------------------------

7.先测试单渠道打包情况,如果有多渠道,看下一步即可。
在上一步release版本apk对应的源码基础上,修改包名里面任意一个方法,比如弹个toast测试也行,以及用到上一步备份好的D:/nuwa文件。
打开android studio底部Terminal命令行输入:
gradlew nuwaReleasePatch -P NuwaDir=D:/nuwa
首次编译可能要下载一些东西,以后就非常快。
命令执行完成会出现“BUILD SUCCESSFUL”,然后等待几秒,项目大就等久一点,补丁将生成到app/build/outputs/nuwa文件夹中的patch.jar,进入找到即可。
重命名补丁文件,拷贝放到第5步指定的patch位置,"/sdcard/patch_"+BuildConfig.VERSION_CODE+".jar";
杀掉APP进程重启即可看到你改动后的功能(简单finish不行,需要killProgress)。

-------------------------------------------------------------------------------------------------------------------------------

8.如果你的项目用到多渠道打包,例如你配置了两个渠道
   productFlavors {
        qihoo360//360助手
                {
                    manifestPlaceholders = [channelID_td_analytics: "360市场"]
                    buildConfigField "String", "channelId_talkingdata", "\"xxxxxxx\""
                    buildConfigField "String", "channel", "\"qihoo360\""
                }
        tecent//应用宝
                {
                    manifestPlaceholders = [channelID_td_analytics: "应用宝"]
                    buildConfigField "String", "channelId_talkingdata", "\"xxxxx\""
                    buildConfigField "String", "channel", "\"tecent\""
                }
    }
生成补丁命令差异,中间多个渠道名即可,例如:
gradlew nuwaQihoo360ReleasePatch -P NuwaDir=D:/nuwa

下载地址:https://github.com/654277633/nuwa2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值