本篇文章使用 tinker 做为热修复工具,使用 bugly 作为后台进行下补丁。android
「 Tinker 」 是微信官方的 Android 热补丁解决方案,支持动态下发代码、So库以及资源,用来紧急修复 bug,解决你的燃眉之急。git
「 Bugly 」 是腾讯针对移动端 bug 管理、运营统计、热修复的一个平台。github
Tinker 热修复组件 GitHub 连接地址。bash
使用说明和简介详见项目 wiki 连接地址。微信
接入指南详见 GitHub 连接地址。app
Bugly Android 热更新使用指南 连接地址。ide
参考上面的「 Bugly Android 热更新使用指南 」,按照步骤一步一步来。 其中要注意一下以几个点:工具
配置依赖时,最好指定版本号。由于最新版本要是改东西了,你也不知道,可能就会发生一些问题,好比:方法的名字变了,当升级后就找不到了。gradle
若是你之前接入过 bugly 须要在 gradle 中注释掉原有的 bugly 依赖。ui
别忘记在 app modul e的 “build.gradle” 文件中添加插件依赖。
apply from: 'tinker-support.gradle'
使用推荐的 Tinker 接入方式,虽然接入麻烦写,但兼容性会更好。
这里详细说下推荐的 Tinker 接入方式,许多人在这里比较晕乎。
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
// you must install multiDex whatever tinker is installed!
MultiDex.install(base);
// 安装tinker
Beta.installTinker(this);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {
getApplication().registerActivityLifecycleCallbacks(callbacks);
}
复制代码
@Override
public void onCreate() {
super.onCreate();
// 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId
// 调试时,将第三个参数改成true
Bugly.init(getApplication(), "900029763", false);
}
复制代码
至此,咱们的原 BaseApplication 就已经改造完成了。Application 的获取能够经过 getApplication() 进行获取。
public class SampleApplication extends TinkerApplication {
public SampleApplication() {
super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike",
"com.tencent.tinker.loader.TinkerLoader", false);
}
}
复制代码
其中第二个参数 "xxx.xxx.SampleApplicationLike",就是咱们刚刚改好的 BaseApplication,xxx.xxx 是你的项目包名。
至于 tinker-support.gradle 文件,咱们直接粘贴过来便可。 配置参数可参考 TinkerSupport 插件使用指南,参考连接。
在项目的主 moudle 下,打开 tinker-support.gradle 文件,也可以使用全局搜索。此文件是 tinker 的配置文件,热修复相关功能和参数能都在此文件中配置。
打开 tinker 热修复组件。在 tinkerSupport 的方法中,将 enable 改成 true。
enable = true
( true 开启,false 关闭 )。
启用覆盖 tinkerPatch 配置功能。在 tinkerSupport 的方法中,将 overrideTinkerPatchConfiguration 改成 true。
overrideTinkerPatchConfiguration = true
( true 开启,false 关闭 )。
按照规则配置 tinkerId,tinkerId必须保证惟一性。
关闭 tinkerPatch 的功能。在 tinkerPatch 中,注释 tinkerPatch 中 tinkerEnable = false。
//tinkerEnable = false
修改好这些配置后,就能够正式打包了,打包有两种方式,如下两种方式都可。
Android Studio 正常打包流程,Build -> Generate Signed APK。
打开 gradle 文件,运行 项目 gradle -> Tasks -> build -> assembleRelease。
等待 gradle 运行结束后,会生成 bakApk 的文件夹,此文件夹下的 app-MMdd-hh-mm-ss 是咱们的基准包目录,后期打补丁包的时候须要用到,必定要保存好。
文件位置:项目主 moudle -> build -> bakApk -> app-MMdd-hh-mm-ss(按照时间生成)。
app-release.apk 就是咱们打好的包,在使用 360 加固助手加固后就能够上线了。
当修改好 bug 之后,
修改基准包目录。在 tinker-support.gradle 中,将 def baseApkDir 改成你须要修复版本的基准包目录(也就是上面提到的基准包目录)。
def baseApkDir = "app-MMdd-hh-mm-ss"
MMdd-hh-mm-ss 修改成你须要修复版本的基准包目录
后续的 5 个步骤和发正式包的前 5 个步骤相同,切记必定要修改 tinkerId,不然无发辨别版本。
打开 gradle 运行 项目 gradle -> Tasks -> tinker-support -> buildTinkerPatchRelease。
若是没有此选项,首先确认你的 tinkerEnable 是不是 true,而后从新构建下项目便可。
等待 gradle 运行结束后,会生成新的基准包,修复好的 apk 在此文件中。同时,还会生成 patch 文件夹,下发的补丁 patch_signed_7zip.apk 就在此文件夹中。
补丁文件位置:项目主 moudle -> build -> outputs -> patch -> release。
打开 Bugly 平台,选择移动端平台 -> 应用升级 -> 热更新。
点击发布补丁,选择补丁文件,目标版本会在补丁上传后会自动匹配。 可选择下发范围,选好后下发便可。
因为 Android Studio 的 instantrun 和 tinker 有冲突,因此,想要使用 instanttun 须要关闭 tinker,关闭方法以下:
1.关闭 tinker 热修复组件。在 tinkerSupport 的方法中,将 enable 改成 false。
enable = false
( true 开启,false 关闭 )。
2.关闭覆盖 tinkerPatch 配置功能。在 tinkerSupport 的方法中,将 overrideTinkerPatchConfiguration 改成 false。
overrideTinkerPatchConfiguration = false
( true 开启,false 关闭 )。
3.打开 tinkerPatch 的功能。在 tinkerPatch 中,去掉 tinkerPatch 中 tinkerEnable = false 的注释。
tinkerEnable = false
而后就能够正常的使用 instantrun 功能了。