Tinker热修复框架集成与使用

简介:

Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。
官网:http://www.tinkerpatch.com/

Tinker与其它热修复框架差别对比

Tinker QZone AndFix Robust
类替换 yes yes no no
So替换 yes no no no
资源替换 yes yes no no
全平台支持 yes yes yes yes
即时生效 no no yes yes
性能损耗 较小 较大 较小 较小
补丁包大小 较小 较大 一般 一般
开发透明 yes yes no no
复杂度 较低 较低 复杂 复杂
gradle支持 yes no no no
Rom体积 较大 较小 较小 较小
成功率 较高 较高 一般 最高

Tinker集成

  1. TinkerPatch 插件配置
    在项目build.gradle文件里配置TinkerPatch插件

    1
    2
    3
    dependencies {
    classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.2"
    }
  2. 新建thinkerpatch.gradle文件,配置thinker相关,其中bakPath,baseInfo,variantName三个变量指明基准包路径。

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
apply plugin: 'tinkerpatch-support'
def bakPath = file("${buildDir}/bakApk/")
def baseInfo = "app-1.0-0308-17-30-00"
def variantName = "release"
tinkerpatchSupport {
/** 可以在debug的时候关闭 tinkerPatch **/
tinkerEnable = true
/** 是否使用一键接入功能 **/
reflectApplication = true
/** 是否开启加固模式,只有在使用加固时才能开启此开关 **/
protectedApp = false
/** 补丁是否支持新增 Activity (exported必须为false)**/
supportComponent = false
autoBackupApkPath = "${bakPath}"
/** 在tinkerpatch.com得到的appKey **/
appKey = "*************"
/** 注意: 若发布新的全量包, appVersion一定要更新 **/
appVersion = "1.0"
def pathPrefix = "${bakPath}/${baseInfo}/${variantName}"
def name = "${project.name}-${variantName}"
baseApkFile = "${pathPrefix}/${name}.apk"
baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
baseResourceRFile = "${pathPrefix}/${name}-R.txt"
}
tinkerPatch {
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
}
}
  1. 依赖Tinker SDK,在模块build.gradle里配置

    1
    2
    3
    dependencies {
    compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.2")
    }
  2. SDK初始化,在Application里初始化SDK

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class BaseApplication extends Application {
    @Override
    public void onCreate() {
    super.onCreate();
    // 我们可以从这里获得Tinker加载过程的信息
    ApplicationLike tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();
    // 初始化TinkerPatch SDK, 更多配置可参照API章节中的,初始化SDK
    TinkerPatch.init(tinkerApplicationLike)
    .reflectPatchLibrary()
    .setPatchRollbackOnScreenOff(true)
    .setPatchRestartOnSrceenOff(true)
    .setFetchPatchIntervalByHours(3);
    // 每隔3个小时(通过setFetchPatchIntervalByHours设置)去访问后台时候有更新,通过handler实现轮训的效果
    TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();
    }
    }

Tinker使用

  1. 官方平台帐号注册
  2. 配置完gradle后,通过执行thinkerPatchRelease task生成补丁包
  3. 在官方平台上调试补丁包
  4. 在官方平台上发布补丁包