内容简介:step 5:在 TinkerPatch 平台中添加 app,并获取 appkey,填入到 tinkerpatch.gradle 中对于的 appkey 参数中
- Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。
较为具体的技术实现过程
Step 1: 添加 gradle 依赖
- 在项目的 build.gradle 中添加 tinker-patch-gradle-plugin的依赖
buildscript { dependencies { // TinkerPatch 插件 classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.2" } } 复制代码
- 然后在app的gradle文件app/build.gradle,我们需要添加tinker的库依赖以及apply tinker的gradle插件
dependencies { // TinkerPatch SDK 依赖 compile 'com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.9.1' } 复制代码
//apply tinker插件 apply plugin: 'com.tencent.tinker.patch' 复制代码
Step 2:设置 TinkerPatch 相关的配置
- 为了简单方便,我们将 TinkerPatch 的相关配置都发在 tinkerpatch.gradle 中,创建他 TinkerPatch.gradle 文件之后,在 app.gradle 中使用该文件(apply from: 'tinkerpatch.gradle'),TinkerPatch.gradle 的参数如下:
apply plugin: 'tinkerpatch-support' /** * TODO: 请按自己的需求修改为适应自己工程的参数 */ def bakPath = file("build/backupApk/") def baseInfo = "app-1.0.2-1120-17-20-01" def variantName = "release" /** * 对于插件各参数的详细解析请参考 * http://tinkerpatch.com/Docs/SDK */ tinkerpatchSupport { /** 可以在debug的时候关闭 tinkerPatch, isRelease() 可以判断BuildType是否为Release **/ tinkerEnable = true // 是否反射实现一键接入 reflectApplication = true /** * 是否开启加固模式,只能在APK将要进行加固时使用,否则会patch失败。 * 如果只在某个渠道使用了加固,可使用多flavors配置 **/ protectedApp = true /** * 实验功能 * 补丁是否支持新增 Activity (新增Activity的exported属性必须为false) **/ supportComponent = true autoBackupApkPath = "${bakPath}" appKey = "d5d1c96215a04b5c" /** 注意: 若发布新的全量包, appVersion一定要更新 **/ /** Tinker 使用 appVersion 作为 TinkerId, 我们需要保证每个发布出去的基础安装包的 appVersion 都不一样。 **/ appVersion = "1.0.2" def pathPrefix = "${bakPath}/${baseInfo}/${variantName}/" def name = "${project.name}-${variantName}" /** 基准包的文件路径, 对应 tinker 插件中的 oldApk 参数;编译补丁包时,必需指定基准版本的 apk,默认值为空,则表示不是进行补丁包的编译。 */ baseApkFile = "${pathPrefix}/${name}.apk" baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt" baseResourceRFile = "${pathPrefix}/${name}-R.txt" /** * (可选)重命名备份文件的格式化字符串,默认为'${appName}-${variantName}' * * Available vars: * 1. projectName * 2. appName * 3. packageName * 4. buildType * 5. versionName * 6. versionCode * 7. buildTime * 8. fileSHA1 * 9. flavorName * 10. variantName * * default value: '${appName}-${variantName}' * Note: plz use single-quotation wrapping this format string */ // 格式化命名备份文件 这里请使用单引号 backupFileNameFormat = '${appName}-${variantName}' /** * 若有编译多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-%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 } } import java.util.regex.Matcher import java.util.regex.Pattern /** * 如果只想在Release中打开tinker,可以把tinkerEnable赋值为这个函数的return * @return 是否为release */ def isRelease() { Gradle gradle = getGradle() String tskReqStr = gradle.getStartParameter().getTaskRequests().toString() Pattern pattern; if (tskReqStr.contains("assemble")) { println tskReqStr pattern = Pattern.compile("assemble(\\w*)(Release|Debug)") } else { pattern = Pattern.compile("generate(\\w*)(Release|Debug)") } Matcher matcher = pattern.matcher(tskReqStr) if (matcher.find()) { String task = matcher.group(0).toLowerCase() println("[BuildType] Current task: " + task) return task.contains("release") } else { println "[BuildType] NO MATCH FOUND" return true; } } 复制代码
- 重要参数
参数 | 作用 |
---|---|
tinkerEnable | 是否开启热更新 |
reflectApplication | 是否反射实现一键接入 |
supportComponent | 是否支持新增 activity |
protectedApp | 是否开启应用加固(360 加固或者乐固) |
appKey | 在 TinkerPatch 平台 申请的 appkey |
appVersion | 若发布新的全量包, appVersion一定要更新 |
autoBackupApkPath | 自动备份文件的路径 |
step 3:reflectApplication = true
- 为了更方便的使用,我们选择使用 reflectApplication = true 的模式,这种模式我们不用为了接入 tinker 而改造我们的 Application 类。
public class SampleApplication extends Application { ... @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(); } ... 复制代码
step 4:运行 assembleRelease task(生成基准包 -- 发布到应用商店)
-
运行 assembleRelease task 构建基准包(请在发布前确保更新tinkerpatchSupport中的appVersion),tinkerPatch会基于你填入的autoBackupApkPath自动备份基础包信息到相应的文件夹,包含:apk文件、R.txt文件和mapping.txt文件 (注:mapping.txt是proguard的产物,如果你没有开启proguard则不会有这个文件)
- 备份的路径
- 备份的文件
-
这个步骤是我们一般的情况下的打包操作,如我们发布到应用商店的版本名为:1.0.0,那么之后我们发布补丁的话,我们都是要在这个 1.0.0 的版本之上生成补丁包的。
step 5:在 TinkerPatch 平台中添加 app,并获取 appkey,填入到 tinkerpatch.gradle 中对于的 appkey 参数中
- 添加 app
- 获取 appkey
step 6:发布到应用商店的版本出现 bug,想要发布补丁包
-
运行 tinkerPatchRelease task 构建补丁包,补丁包将位于 build/outputs/tinkerPatch下,默认的情况下,补丁包为:patch_signed.apk
- 执行 tinkerPatchRelease
- 执行 tinkerPatchRelease 之后,生成的补丁包路径
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Kubernetes滚动更新介绍及使用
- 使用 Github API 更新仓库
- 使用 kubeadm 更新 kubernetes 集群
- 使用PostgreSQL中的查询结果更新列
- macOS 下使用 pyenv 编译并使用 Python 3.7 或更新版本
- 如何使用 C# 爬虫获得专栏博客更新排行
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
创业就是要细分垄断
李开复、汪华、傅盛 / 文化发展出版社 / 2017-5-1 / CNY 45.00
对各方面资源极为有限的创业公司而言,想在激烈的市场竞争中站立下来的第一步是:成为细分市场的垄断者。不管是资本还是尖端人才,追逐的永远是行业里尖端的企业,第二名毫无意义。 首先,要精准定位潜在市场。这个市场的需求仍没有被满足,并且潜力巨大。其次,抓住时代和行业的红利,通过高速增长实现“小垄断”,抢滩登陆。最后,在细分领域里建立起自己的竞争壁垒,应对巨头和竞争对手的复制,去扩展更大的市场,从而扩......一起来看看 《创业就是要细分垄断》 这本书的介绍吧!