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垃圾回收器的方法和原理总结