Android热补丁更新 Tinker 接入详细教程

前言

相信不少Android的小伙伴们都会遇到过APP上线之后才发现还有Bug,或者哪个地方还需要小改动,难道这个时候为了一点小改动重新编译,重新发布新版本吗?使用Tinker来解决Android APP的热补丁更新,实现修改.java代码、替换.so、替换资源后免发布版本,更新APP的代码。

Tinker是什么?为什么选择Tinker?

Tinker 是一个开源项目(Tinker GitHub链接),它是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So 库以及资源,让应用能够在不需要重新安装的情况下实现更新。

几款主流热补丁更新的对比

TinkerPatch 平台

一个后台管理系统,使用者通过这个平台为APP下发和管理补丁包。

首先我们需要进入到Tinker Patch平台中,注册账号并登陆。然后添加APP,获取到APP Key,并且添加一个基包版本号。

这里解释一下基包,就是全量包,也可以说是完整的基础包。

补丁包,也就是增量包,也可以说是升级包,基于基包修改后,tinker比对后生成的差异包。

通俗的原理:发布一个全量包,如果有bug或者改动,通过tinker比对生成升级包,再通过TInkerPatch平台发布下发给用户这个升级包,用户客户端自动完成后台升级,下次打开就是修改后的客户端了。

具体TinkerPatch平台的使用流程参考:http://www.tinkerpatch.com/Docs/start

记下来APP Key和添加的版本号 我这里版本号设置成1.0.0

Gradle集成SDK

1.在项目的根目录下的build.gradle中添加jcenter远程仓库的依赖,和添加TinkerPatch 插件

添加TinkerPatch插件

2.在app目录下 添加TinkerPatch的配置文件tinkerpatch.gradle

applyplugin:'tinkerpatch-support'

/**

* TODO: 请按自己的需求修改为适应自己工程的参数

*/

def bakPath = file("${buildDir}/bakApk/")

def baseInfo ="app-1.0.0-1112-12-49-34"

def variantName ="release"

/**

* 对于插件各参数的详细解析请参考

* http://tinkerpatch.com/Docs/SDK

*/

tinkerpatchSupport {

/** 可以在debug的时候关闭 tinkerPatch **/

    tinkerEnable =true

    /** 是否使用一键接入功能  **/

    reflectApplication =true

    /** 是否开启加固模式,只有在使用加固时才能开启此开关 **/

    protectedApp =false

    /** 补丁是否支持新增 Activity �(exported必须为false�)**/

    supportComponent =true

    autoBackupApkPath ="${bakPath}"

    /** 在tinkerpatch.com得到的appKey **/

    appKey ="yourAppKey"

    /** 注意: 若发布新的全量包, appVersion一定要更新 **/

    appVersion ="1.0.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是否被使能

*/

android {

defaultConfig {

buildConfigField"boolean","TINKER_ENABLE","${tinkerpatchSupport.tinkerEnable}"

    }

}

/**

* 一般来说,我们无需对下面的参数做任何的修改

* 对于各参数的详细介绍请参考:

* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97

*/

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

    }

}

3.在app/build.gradle中添加TinkerPatch的SDK依赖和引入上个步骤新建的配置文件

添加tinker sdk的依赖和引入配置文件

4.build.gradle依赖sdk和引入配置文件后,sync now 同步成功之后,右上角的Gradle点开,项目(root)》tasks》会增加一个tinker,这个时候tinker插件加载进来了。

tinker插件

布局及功能

1.按钮用来强制更新拉取补丁包,TextView用来显示后续更新状态

界面布局

2.布局的逻辑代码,按钮点击通过TinkerPatch.with().fetchPatchUpdate(true);来强制拉取补丁

界面逻辑代码

3.app/tinkerpatch.gradle 中的reflectApplication =true的时候,我们需要新建一个自定义MyApplication继承Application中重写onCreate,在super.onCreate();之后一行进行Tinker的初始化工作。reflectApplication =false的情况请参考官方文档。

Application中初始化Tinker

8.再到AndroidManifest.xml中 application节点添加自定义的MyApplication

签名配置

1.在app/build.gradle中,配置签名

配置签名

生成基包(全量包/完整包/基础包)

生成基包,主要需要配置的TinkerPatch参数是一个appVersion和appKey ,appKey只需要一次配置正确后续不用管,appVersion参数需要你在TinkerPatch平台中发布的app版本号要一致,同时app/build.gradle中的versionName也要一致。其他的参数就是先不用管。现在就可以打包全量包了。通过点击右上角的Gradle》项目名(root)》Tasks》build》assembleRelease来打包

通过assembleRelease打包

之后在app/build/bakApk/下生成一个apk完整的包

生成的全量包

我们把这个全量包,丢到手机中安装。

基包效果图

生成补丁包

接下去我们修改一些代码,再生成补丁包,再下发给用户。

红色改动的代码

接着我们就要配置一下app/tinkerpatch.gradle的参数,主要需要修改的是baseInfo和variantName参数,其他的无需更改

修改配置

接着就是使用tinker插件,来生成补丁包(增量包/升级包),点击右上角Gradle》项目(root)》Tasks》tinker》tinkerPatchRelease来生成补丁包

生成补丁包

输出日志显示SUCCESS字样就是成功了,成功之后在app/build/outputs/tinkerPatch/release/下生成patch_signed_7zip.apk

生成补丁包

然后我们把补丁包到TinkerPatch平台中,发布补丁

发布补丁

接着我们继续打开我们的app,点击强制更新按钮,之后可以查看我们TinkerPatch后台查看状态

监控下发补丁状态

点击了强制更新之后,可以看到用户已经下载了,结束app进程,重新启动APP

结束应用重启后

重启之后,我们就可以发现文本框已经改变了,所以也应用成功了,热更新就这样成功了。我们再看看TinkerPatch平台的监控状态

监控状态

TinkerPatch平台后台监控,同样也能看到应用成功数、合成成功数、下载成功数的状态了。

注意

如果再次修改生成补丁,配置文件中的baseinfo不需要改动,保持最初的基包。修改代码后直接通过Gradle的tinker插件生成补丁包,再到TinkerPatch平台下发补丁包就好了。

默认的话 Tinker是三个小时拉取一次更新包,在教程中,我是通过按钮,执行强制拉取代码来马上热更。在实际应用中,你们也可以通过推送,然后执行强更操作。又或者保留原本三小时拉取一次都可以。

第二次写博客,有问题的地方还请指出。有帮助到你的话点个赞,谢谢~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容