Android热更新开源项目Tinker集成实践总结
发布时间 - 2026-01-10 22:28:45 点击率:次前言

最近项目集成了Tinker,开始认为集成会比较简单,但是在实际操作的过程中还是遇到了一些问题,本文就会介绍在集成过程大家基本会遇到的主要问题。
考虑一:后台的选取
目前后台功能可以通过三种方式实现:
1、自己搭建后台布丁下发系统
2、第三方提供的服务,目前如原微信simsun大神的个人tinkerpatch平台,目前出于内测阶段,暂时免费。后期应该会按下发量对app进行收费。
3、腾讯Bugly提供的服务,提供了热更新的下发后台,集成到了bugly的升级sdk中。免费。
根据公司的精神,我们选择了Bugly作为我们的方案,这个大家都懂得。
考虑二:多渠道打包的问题
我们有将近100个渠道,每个渠道需要一个不同的渠道号,按product flavor的方式打出来的包的dex都有差异。这样就造成100个渠道包的热更新就需要100个补丁,这对管理简直是一个灾难。Tinker也对这种问题给出了推荐的方案,那就是使用开源项目packer-ng-plugin,它的原理是将渠道信息写在apk文件的zip comment中,这样在多渠道打包时就不会影响dex的内容。
考虑三:资源混淆所造成的问题
目前项目使用了资源混淆项目AndResGuard,关于AndResGuard的介绍,可以参考文档AndResGuard[Android混淆工具AndResGuard]。
也正是引入了资源混淆,热更新和多渠道打包都必须依赖资源混淆后生成的apk包才行。所以我们对编译流程进行了整合。
**整合前**
编译:编译直接使用AndResGuard提供的命令resguardRelease生成即可。resguardRelease生成的apk文件是没有资源混淆的。
./gradlew resguardRelease
Tinker生成补丁:直接调用tinkerPatchRelease任务生成的Release文件没有进行资源混淆
./gradlew tinkerPatchRelease
多渠道打包:使用packer-ng的命令apkRelease生成多渠道文件没有进行资源混淆
./gradlew apkRelease
**整合后**
主要解决两个问题:
1、Tinker生成补丁的原始和新的apk,需要使用资源混淆后的apk
2、多渠道打包所使用的原始apk,需要使用资源混淆后的apk
针对问题1:
当使用resguardRelease进行编译,在编译完成后,将生成的apk文件、R文件、map文件和resouce map文件拷贝到${buildDir}/bakApk/resguard目录下;
当使用tinkerPatchRelease生成补丁时,在tinkerPatchRelease任务前加入resguardTask任务,这样生成补丁时使用的新旧apk都是资源混淆过的。核心的gradle代码如下:
android.applicationVariants.all { variant ->
/**
* task type, you want to bak
*/
def taskName = variant.name
tasks.all {
if (variant.buildType.name == 'release') {
if ("tinkerPatch${taskName.capitalize()}".equalsIgnoreCase(it.name)) {
// find resguard task
def resguardTask
tasks.all {
if (it.name.startsWith("resguard")) {
resguardTask = it
}
}
it.doFirst({
// change build apk path
it.buildApkPath = "${buildDir}/outputs/apk/AndResGuard_${project.getName()}-${taskName}/${project.getName()}-${taskName}_signed.apk"
})
// change task dependence to resguard task
it.dependsOn resguardTask
}
if ("resguard${taskName.capitalize()}".equalsIgnoreCase(it.name)) {
it.doLast {
copy {
def date = new Date().format("MMdd-HH-mm-ss")
from "${buildDir}/outputs/apk/AndResGuard_${project.getName()}-${taskName}/${project.getName()}-${taskName}_signed_7zip_aligned.apk"
into file(bakPath.absolutePath + "/resguard")
rename { String fileName ->
fileName.replace("${project.getName()}-${taskName}_signed_7zip_aligned.apk", "${project.getName()}-${taskName}-${date}.apk")
}
from "${buildDir}/outputs/mapping/${taskName}/mapping.txt"
into file(bakPath.absolutePath + "/resguard")
rename { String fileName ->
fileName.replace("mapping.txt", "${project.getName()}-${taskName}-${date}-mapping.txt")
}
from "${buildDir}/intermediates/symbols/${taskName}/R.txt"
into file(bakPath.absolutePath + "/resguard")
rename { String fileName ->
fileName.replace("R.txt", "${project.getName()}-${taskName}-${date}-R.txt")
}
from "${buildDir}/outputs/apk/AndResGuard_${project.getName()}-${taskName}/resource_mapping_${project.getName()}-release.txt"
into file(bakPath.absolutePath + "/resguard")
rename { String fileName ->
fileName.replace("resource_mapping_${project.getName()}-release.txt", "${project.getName()}-${taskName}-${date}-resource_mapping.txt")
}
}
}
}
}
}
针对问题2、在AS中使用apkRelease任务打包的方式不再适用,可直接使用packer-ng所提供的命令行方式进行生成渠道包,经过测试,100个渠道包的确在10s左右就能打完,速度相当之快。考虑到市场推广人员会打不同渠道包,后期可做一个简易工具提供给市场推广人员。
整合后操作:
编译:
./gradlew resguardRelease
生成的apk文件放在${app}\build\bakApk\resguard\目录下
打补丁包:
./gradlew tinkerPatchRelease ./gradlew generateManifestForReleaseTinkerPatch
最终生成的补丁放在${app}\build\outputs\patch\目录下
多渠道打包:
针对编译后生成的包,使用packer-ng提供的命令行操作即可
java -jar PackerNg-x.x.x.jar apkFile marketFile outputDir
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# android
# 热更新
# tinker开源
# tinker集成
# 微信Android热更新Tinker使用详解(星空武哥)
# Android微信Tinker热更新详细使用
# Android热修复Tinker接入及源码解读
# 放在
# 新和
# 目录下
# 命令行
# 市场推广
# 后期
# 都是
# 是一个
# 就会
# 都有
# 出了
# 大家都
# 就能
# 腾讯
# 可以通过
# 大神
# 这对
# 三种
# 考虑到
# 时就
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作企业网站建设方案,怎样建设一个公司网站?
bing浏览器学术搜索入口_bing学术文献检索地址
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Thinkphp 中 distinct 的用法解析
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
网站优化排名时,需要考虑哪些问题呢?
Python高阶函数应用_函数作为参数说明【指导】
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
SQL查询语句优化的实用方法总结
公司门户网站制作流程,华为官网怎么做?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
Linux网络带宽限制_tc配置实践解析【教程】
Laravel观察者模式如何使用_Laravel Model Observer配置
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
如何挑选最适合建站的高性能VPS主机?
教学论文网站制作软件有哪些,写论文用什么软件
?
如何在阿里云高效完成企业建站全流程?
专业商城网站制作公司有哪些,pi商城官网是哪个?
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何为不同团队 ID 动态生成多个独立按钮
如何快速生成可下载的建站源码工具?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
JS经典正则表达式笔试题汇总
高性价比服务器租赁——企业级配置与24小时运维服务
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
JavaScript如何实现继承_有哪些常用方法
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何在万网ECS上快速搭建专属网站?
MySQL查询结果复制到新表的方法(更新、插入)
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
如何在自有机房高效搭建专业网站?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
Linux系统命令中screen命令详解
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
如何在橙子建站上传落地页?操作指南详解
微信小程序 HTTPS报错整理常见问题及解决方案
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
Java垃圾回收器的方法和原理总结

