Fork me on GitHub

集成Tinker实现热更新

集成bugly的tinker实现app的热更新

进入Bugly

bugly是腾讯团队开源的一个异常上报,运营统计平台。其中有一些使用的功能,比如异常上报,在线升级和热更新等。而热更新就是今天要记录的重点。

bugly的官网点这里

申请自己的产品

因为是腾讯家的平台,所以我们用QQ号或者微信号就可以登录了,然后去个人中心申请自己的产品,拿到key(所有第三方都是这么个套路)


登录完,申请完了之后,如下拿到属于自己产品的AppID

集成热更新组件Tinker

详细的关于tinker的使用方式和开发文档请查看bugly的官方文档点我查看文档

1.添加插件依赖

工程根目录下“build.gradle”文件中添加:

1
2
3
4
5
6
7
8
9
buildscript {
repositories {
jcenter()
}
dependencies {
// tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
classpath "com.tencent.bugly:tinker-support:1.1.5"
}
}

2.集成SDK

在app module的“build.gradle”文件中添加

1
2
3
4
compile "com.android.support:multidex:1.0.1" // 多dex配置
compile 'com.tencent.bugly:crashreport_upgrade:1.3.6'
compile 'com.tencent.tinker:tinker-android-lib:1.9.9'
compile 'com.tencent.bugly:nativecrashreport:latest.release'

3.添加依赖插件脚本

在app module的“build.gradle”文件中添加:

1
apply from: 'tinker-support.gradle'

4.配置tinker-support.gradle

直接从官方文档上复制粘贴即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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}"

// 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
// isProtectedApp = true

// 是否开启反射Application模式
enableProxyApplication = false

// 是否支持新增非export的Activity(注意:设置为true才能修改AndroidManifest文件)
supportHotplugComponent = true

}

/**
* 一般来说,我们无需对下面的参数做任何的修改
* 对于各参数的详细介绍请参考:
* 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的分配
}
}

注意: enableProxyApplication = false表示不使用反射的方式

5.初始化SDK

如图,在自己的Application中进行初始化

注:我当前的项目中未采取tinker推荐的自建simpleApplication,然后让主application集成它的方式,我是用的反射,官方比较推荐不使用反射的方式,但是我觉得反射挺好用,而且灵活性更高(具体原因是项目中需要动态修改包名,所以pass掉了第一种推荐方式)

生成基准包

  • 之后,进行三方库的导入和编译,这时我们应该可以成功打包了。配置好多渠道后,直接gradle打相应的渠道包,生成基准包。
  • 同时注意,打基准包的时候需要在tinker-suppor.gradle文件中,定义好tinkerID,一般可以把基准包记为base-x-x
  • 打包完毕后,生成的所有apk都在路径为app-build-bakApk,然后根据时间找到基准包目录,如下的release包即为正式包。

上报联网

把新打的apk,安装到手机上,必须进行一次网络请求,因为bugly需要网络才能和平台联系在一起。上报联网之后,控制台里就可以出现刚刚上传上去的版本了。如图

生成补丁包

修改代码吧,修改过后,还要在tinker-support.gradle文件中修改基准包路径,和TinkerID。最后打开gradle脚本,找到tinker-support,如图

点击buildTinkerPatchXXXRelease,生成后的补丁包,到路径为app-build-outputs-patch,找到后缀为7zip的文件,即为补丁包。

上传补丁包修复基准包

在bugly后台点击热更新,上传新补丁,上传过后会自动找到对应的基准包,如图所示


下图就是成功下发一个新补丁的样子,如图

尾声

tinker热更新就记录完了,其实看官网文档更加详细,只不过我是为了加深自己的印象,建议大家去官方文档进行查看。

OVER

0%