不爱写博客其实是有点苦逼的,因为有些东西不常用就容易模糊。
热更新技术在去年的时候就已经很火了,记录Tinker热更新,这里直接从bugly里面去集成,步骤比较简单,而且也不用后台配合,只要前端集成成功,在bugly里面上传补丁apk就ok。Tinker不支持立即生效,需要重启apk才可以生效,但功能大啊,支持类和资源文件的替换。其实和其他的几种热更新技术比较起来也是个有千秋,稳定就好。
为什么要用腾讯bugly, 因为简单,也不用注册直接用qq号登陆即可。而且里面还支持异常搜集和版本更新等等。可以去官网自行了解。
第一步:添加插件依赖
1、首先,第一步去腾讯bugly官网,用QQ号就直接可以登录,然后创建需要实现热更新的apk产品名,这个步骤非常简单。创建完成后,就开始看文档。我们就跟着文档去集成
版本号最好用release,
工程根目录下“build.gradle”文件中添加:
buildscript {
repositories {
jcenter()
}
dependencies {
// tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
classpath "com.tencent.bugly:tinker-support:latest.release"
}
}
第二步:集成SDK
2、添加依赖
dependencies {
compile "com.android.support:multidex:1.0.1" // 多dex配置
compile 'com.tencent.bugly:crashreport_upgrade:latest.release' // 升级SDK
}
3、在gradle里面添加, 注意这个添加完先不要Sync Now,等第4步添加完在下载
在app module的“build.gradle”文件中添加:
// 依赖插件脚本
apply from: 'tinker-support.gradle'
4、这一步,我是在我的电脑找到工程的文件夹,然后在app文件目录里创建一个txt文本,然后更改后缀名就可以 了,创建完毕后,再次回到studio里面,就会出现tinker-support.gradle这个文件,
把这个拷贝到刚创建tinker-support.gradle这个文件里
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
* 此处填写每次构建生成的基准包目录
*/
def baseApkDir = "app-0208-15-10-00"
/**
* 对于插件各参数的详细解析请参考
*/
tinkerSupport {
// 开启tinker-support插件,默认值true
enable = true
// 指定归档目录,默认值当前module的子目录tinker
autoBackupApkDir = "${bakPath}"
// 是否启用覆盖tinkerPatch配置功能,默认值false
// 开启后tinkerPatch配置不生效,即无需添加tinkerPatch
overrideTinkerPatchConfiguration = true
// 编译补丁包时,必需指定基线版本的apk,默认值为空
// 如果为空,则表示不是进行补丁包的编译
// @{link tinkerPatch.oldApk }
baseApk = "${bakPath}/${baseApkDir}/app-release.apk"
// 对应tinker插件applyMapping
baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"
// 对应tinker插件applyResourceMapping
baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"
// 构建基准包和补丁包都要指定不同的tinkerId,并且必须保证唯一性
tinkerId = "base-1.0.1"
// 构建多渠道补丁时使用
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
// 是否开启反射Application模式
enableProxyApplication = false
}
/**
* 一般来说,我们无需对下面的参数做任何的修改
* 对于各参数的详细介绍请参考:
* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
*/
tinkerPatch {
//oldApk ="${bakPath}/${appName}/app-release.apk"
ignoreWarning = false
useSign = true
dex {
dexMode = "jar"
pattern = ["classes*.dex"]
loader = []
}
lib {
pattern = ["lib/*/*.so"]
}
res {
pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
ignoreChange = []
largeModSize = 100
}
packageConfig {
}
sevenZip {
zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
// path = "/usr/local/bin/7za"
}
buildConfig {
keepDexApply = false
//tinkerId = "1.0.1-base"
//applyMapping = "${bakPath}/${appName}/app-release-mapping.txt" // 可选,设置mapping文件,建议保持旧apk的proguard混淆方式
//applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可选,设置R.txt文件,通过旧apk文件保持ResId的分配
}
}
以上几步添加完之后没有什么问题就可以继续按照文档初始化SDK,文档上写的初始化SDK很详细,注意我这里写的3和4步,第4步做完,在Sync Now第3步添加的插件脚步
文档第三步,初始化SDK,创建自定义application,然后按照文档进行添加,别忘了在清单文件里注册application。
文档推荐的是enableProxyApplication = false 的情况 目的是为了更好的去兼容,但是这个不支持加固,其实配置混淆也是可以的,干嘛非得用第三方的加固,AndroidStudio配置混淆很简单,即使用了第三方加固,apk反编译虽然看到的类全是abcd这样的,但是资源文件包括布局照样可以看到,等下推荐一个反编译的工具。
第四步:AndroidManifest.xml配置以及添加权限 其他的更具需求添加
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
第五步:混淆配置 (到这里如果按照文档配置添加,更换application里的appId,都没有问题,基本 上算是集成 成功了,剩下的还是需要看文档进行apk打基包, 和补丁包。集成不难,在apk管理上面比较 复杂一点,如果使用多渠道打包,那更需要悠着点去管理apk了)
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
//v4包
-keep class android.support.**{*;}
使用范例 (继续看文档)
大家如果想测试验证热更新能力,请仔细查看以下文档:
热更新使用范例
1、编译基准包
配置基准包的tinkerId
这里,当你打个基包用1.0.1-base 然后这个apk出现了bug,你在改这个1.0.1-path的补丁包。)
执行assembleRelease编译生成基准包: (如果执行assembleRelease打包的apk如果安装不了的话,说明没有签名打包,需要在gradle里面配置下就 可以打Release并且正常安装。如果打的是debug版的,不用配置)如果打release版本的包,最好在gradle里面配置下。
我是这样配置的
signingConfigs {
release {
keyAlias 'tinKer'
keyPassword '000000'
storeFile file('F:\\icon\\tinker.keystore')
storePassword '000000'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
debuggable false //这个也需要配置下,不然,直接运行不了,也就是说无法调试。
}
}
这个会在build/outputs/bakApk路径下生成每次编译的基准包、混淆配置文件、资源Id文件,如下图所示:
实际应用中,请注意保存线上发布版本的基准apk包、mapping文件、R.txt文件,如果线上版本有bug,就可以借助我们tinker-support插件进行补丁包的生成。(意思就是让 你保存下来,因为当你clear一下的时候,这些都会被删除的。如果用的时候在拷贝到目录里,就可以打补丁包了,切记apk的 管理)
到这里,如果打包和文档上一样,就说明配置没有问题了。接下来就是测试了。
测试:
1、先打个基包
2、先修改待修复apk路径、mapping文件路径、resId文件路径
3、在打补丁包( 一定要先执行第2步,在打补丁包)。
4、将补丁包上传到平台 (这些步骤文档上的图片很清晰)
这个只是普通的打包,多渠道打包文档也有提供。按照文档去集成,注意点细节就不会有问题
最后附上集成的demo地址 : githup地址