返回顶部
首页 > 资讯 > 移动开发 >Android热更新开源项目Tinker集成实践总结
  • 426
分享到

Android热更新开源项目Tinker集成实践总结

开源tinker更新Android 2022-06-06 04:06:38 426人浏览 安东尼
摘要

前言 最近项目集成了Tinker,开始认为集成会比较简单,但是在实际操作的过程中还是遇到了一些问题,本文就会介绍在集成过程大家基本会遇到的主要问题。 考虑一:后台的选取 目前后

前言

最近项目集成了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 ->

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使用详解(星空武哥)Android微信Tinker热更新详细使用Android热修复Tinker接入及源码解读


--结束END--

本文标题: Android热更新开源项目Tinker集成实践总结

本文链接: https://lsjlt.com/news/22600.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android热更新开源项目Tinker集成实践总结
    前言 最近项目集成了Tinker,开始认为集成会比较简单,但是在实际操作的过程中还是遇到了一些问题,本文就会介绍在集成过程大家基本会遇到的主要问题。 考虑一:后台的选取 目前后...
    99+
    2022-06-06
    开源 tinker 更新 Android
  • Git与持续集成实践:项目经验总结
    Git与持续集成实践:项目经验总结导言:在软件开发领域,版本控制和持续集成是两个非常重要的概念。Git作为一种分布式版本控制系统,在项目开发中具有广泛的应用。而持续集成则能够提高团队的协作效率和软件交付质量。本文将总结一下我在项目中使用Gi...
    99+
    2023-11-03
    git 持续集成 项目经验
  • Git与持续集成最佳实践:项目经验总结
    在当今软件开发领域中,Git 和持续集成已经成为了不可或缺的一部分。Git 是一种分布式版本控制系统,可以极大地简化多人协作,保证代码的版本历史和安全性。持续集成是一种将代码持续集成到主干分支的自动化流程,可以自动运行测试用例和构建过程,确...
    99+
    2023-11-02
    实践 git 持续集成
  • Vue3结合TypeScript项目开发实践总结
    目录概述1、compositon Api1、ref 和 reactive的区别?2、周期函数3、store使用4、router的使用2、关注点分离3、TypeScript支持概述 ...
    99+
    2024-04-02
  • 新版Flutter集成到已有Android项目的实现
    FlutterSDK升级后,我们发现不能按照原来的方式集成到已有Android项目中了,因为没有了Flutter这个类,通过阅读源码我找到了新的使用方式。 一、创建Flutte...
    99+
    2022-06-06
    flutter Android
  • Git与持续集成技巧实战:项目经验总结
    Git与持续集成技巧实战:项目经验总结引言:在软件开发领域,版本控制系统和持续集成技术是不可或缺的工具,它们能够极大地提高团队合作效率,确保软件质量和交付速度。本文将从实际项目经验出发,总结一些Git和持续集成技巧,帮助读者更好地应用于实践...
    99+
    2023-11-03
    git 持续集成 技巧实战
  • 项目实践:如何运用CSS框架快速开发网页的经验总结
    项目实践:如何运用CSS框架快速开发网页的经验总结引言:在如今互联网飞速发展的时代,网页设计与开发的速度和效率成为了项目成功的关键因素之一。为了更快速地实现网页布局和样式的开发,开发者借助CSS框架成为一种常见的选择。本文将通过项目实践的经...
    99+
    2023-11-02
    网页 快速开发 CSS框架
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作