说明: 热修复是什么?热修复就是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
android hotfix nuwa2, support gradle 2.x
最新推荐文章于 2024-03-22 09:58:36 发布