热修复之微信Tinker集成

xiaoxiao2021-02-28  7

Tinker的集成步骤比简单,但是坑特别多,稍不注意,就会导致打补丁包失败、补丁无法下发等问题,楼主在集成过程中也遇到这样的问题,现在总结下,前半部分介绍Tinker的集成步骤,按照官方文档一步一步来就可以了http://www.tinkerpatch.com/Docs/intro,后半部分介绍Tinker的一些列坑,以及下发步骤。

一、集成步骤

1、 添加 gradle 插件依赖

buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.0' classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.6" } }

2、集成 TinkerPatch SDK

dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.+' testImplementation 'junit:junit:4.12' compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.6") }

3、配置 tinkerpatchSupport 参数

打开引入的 tinkerpatch.gradle 文件,配置申请的appkey,以及App版本号,位于/app/tinkerpatch.gradle目录下,如下,并将其在app的gradle中引入:apply from: 'tinkerpatch.gradle':

/** * 对于插件各参数的详细解析请参考 * http://tinkerpatch.com/Docs/SDK */ tinkerpatchSupport { /** 可以在debug的时候关闭 tinkerPatch **/ /** disable tinker的时候需要添加multiDexKeepProguardproguardFiles, 这些配置文件本身由tinkerPatch的插件自动添加,当你disable后需要手动添加 你可以copy本示例中的proguardRules.protinkerMultidexKeep.pro, 需要你手动修改'tinker.sample.android.app'本示例的包名为你自己的包名, com.xxx前缀的包名不用修改 **/ tinkerEnable = true reflectApplication = true /** * 是否开启加固模式,只能在APK将要进行加固时使用,否则会patch失败。 * 如果只在某个渠道使用了加固,可使用多flavors配置 **/ protectedApp = false /** * 实验功能 * 补丁是否支持新增 Activity (新增Activityexported属性必须为false) **/ supportComponent = true autoBackupApkPath = "${bakPath}" appKey = "660666666666666" /** 注意: 若发布新的全量包, appVersion一定要更新 **/ appVersion = "7.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" /** * 若有编译多flavors需求, 可以参照: https://github.com/TinkerPatch/tinkerpatch-flavors-sample * 注意: 除非你不同的flavor代码是不一样的,不然建议采用zip comment或者文件方式生成渠道信息(相关工具:walle 或者 packer-ng **/ } /** * 用于用户在代码中判断tinkerPatch是否被使能 */ android { defaultConfig { buildConfigField "boolean", "TINKER_ENABLE", "${tinkerpatchSupport.tinkerEnable}" } } /** * 一般来说,我们无需对下面的参数做任何的修改 * 对于各参数的详细介绍请参考: * https://github.com/Tencent/tinker/wiki/Tinker-接入指南 */ 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 } }

4、初始化 TinkerPatch SDK

自定义Application,如MyApplication继承自Application,在Application里面进行初始化。

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

5、运行 tinkerPatchRelease task 构建补丁包,补丁包将位于 build/outputs/tinkerPatch下。

二、注意事项

1、tinkerpatch.gradle路径,tinkerpatch.gradle的内容复制官网或者上面的即可,但是路径一定要在项目的modle里面,不能写到根目录中,否则无法编译。

2、在app中引入tinkerpatch.gradle文件。需要:

apply from: 'tinkerpatch.gradle'

3、使用assembleRelease 构建基准包失败。如下:

gradle版本不存在,更换网络或者设置代理重试。

4、生成基准包

    使用assembleRelease打完包之后会生成:(注意这个包是含有bug的包,被修复的包,也称为基准包):

     会生成bakApk/app-7.0.0-0508-22-40-24/release文件夹,会有三个文件:app-release.apk,app-release-maping.txt,app-release-R.txt,如果没有app-release-mapping.txt则没有配置签名。

    现在看看刚才配置的信息:

    需要修改如下:

    def baseInfo = "app-7.0.0-0427-23-06-59",双引号里面的替换为生成的新的“app-7.0.0-0508-22-40-24”号码,一定要保证一致,否则无法生成基准包,这个很关键,其他的不用任何修改。

5、生成补丁包

    基准包是包含bug的包,补丁包则是bug被修复的包,在上述基准包的bug被修复完成之后,依据基准包生成补丁包。但是需要注意,基准包必须和补丁包包含的APPVision完全一致,否则下发的补丁包找不到修复的对象导致热修复失败。

    运行tinkerPatchRelease命令生成补丁包,在outpust/apk/tinkerPatch目录下会生成补丁文件,如下:

/

    其中patch_signed_7zip.apk就是要下发的补丁,至此补丁包完成。

三、补丁包下发    

1、注册http://www.tinkerpatch.com/平台账号,新增App:

2、添加App版本

    这个版本号一定要和打的补丁包、基准包保值一致,否则下发失败。

3、发布补丁

    在创建好的新的版本号中发布补丁,如下:

    其中补丁文件选中刚刚生成的patch_signed_7zip.apk,选中开发预览,再提交。然后再点击SDK下载,下载TinkerDebugTool.apk完成测试,大约十来分钟补丁就下发到手机,有bug版本的App就会被修复了,开发预览若没问题,再点选中全量下发即可。这样Tinker就集成完毕。

    github中的文档还是很粗略的,细节没介绍,坑比较多,很容易搞混了,在此把集成中遇到的问题总结下。最后来看看效果:

        

最后附上源码地址:https://download.csdn.net/download/yoonerloop/10411267点击打开链接

转载请注明原文地址: https://www.6miu.com/read-1600052.html

最新回复(0)