android热补丁作用,Android热补丁更新 Tinker 接入详细教程

前言

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

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

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

7ecc0e7bab7a

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

TinkerPatch 平台

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

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

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

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

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

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

Gradle集成SDK

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

7ecc0e7bab7a

添加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依赖和引入上个步骤新建的配置文件

7ecc0e7bab7a

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

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

7ecc0e7bab7a

tinker插件

布局及功能

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

7ecc0e7bab7a

界面布局

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

7ecc0e7bab7a

界面逻辑代码

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

7ecc0e7bab7a

Application中初始化Tinker

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

签名配置

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

7ecc0e7bab7a

配置签名

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

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

7ecc0e7bab7a

通过assembleRelease打包

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

7ecc0e7bab7a

生成的全量包

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

7ecc0e7bab7a

基包效果图

生成补丁包

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

7ecc0e7bab7a

红色改动的代码

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

7ecc0e7bab7a

修改配置

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

7ecc0e7bab7a

生成补丁包

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

7ecc0e7bab7a

生成补丁包

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

7ecc0e7bab7a

发布补丁

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

7ecc0e7bab7a

监控下发补丁状态

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

7ecc0e7bab7a

结束应用重启后

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

7ecc0e7bab7a

监控状态

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

注意

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值