Android热更新开源项目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 -> /** * 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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

时间: 2024-10-04 19:41:52

Android热更新开源项目Tinker集成实践总结的相关文章

美团 Android 热更新方案 Robust 开源,包含自动化补丁工具

美团 Android 热更新方案 Robust 开源了. Robust 是新一代热更新系统,对 Android 版本无差别兼容,无需发版就可以做到随时修改线上 bug,快速对重大线上问题作出反应.Robust 热更新系统借鉴 Instant Run 原理,实现了一个兼容性更强而且实时生效的热更新方案.其基本思路是,Robust 热更新系统在一个方法的入口处插入一段跳转代码,当发现某个方法出现 bug 就跳转执行补丁中的代码,略过原有代码的执行,否则执行原有方法体逻辑. 优势 支持 Android

Android项目持续集成实践之Gitlab CI(Docker版本)

接上一篇 Android项目持续集成实践之Gitlab CI. 在我看来,.gitlab-ci.yml 配置还是有些复杂,写的脚本还是有点多,有没有办法更精简一点呢? 有,那就是Android环境Docker化.(注:对Docker感兴趣的同学,请参考这本书<Docker -- 从入门到实践>). 我在这本书的指导下封装了一个包含Android开发环境的Docker镜像. 1. https://github.com/snowdream/docker-android 1. https://hub

源代码-我在学习Android 的ZXing开源项目二维码时 有几个类 不清楚他具体的意义,功能。

问题描述 我在学习Android 的ZXing开源项目二维码时 有几个类 不清楚他具体的意义,功能. ①BitMatrix.java ②ByteMatrix.java ③MultiFormatWriter.java ④QRCodeWriter.java 这4个 我实在不懂 这功能,这里面哪个 是将输入字符串 变成那个0,1 那个的?用什么算法了...我这是Android工程. 谢谢了...

开源项目的最佳实践

来自GitHub的Phil Haack在Channel 9网站上举办了一次座谈会,专注于谈论开源项目的最佳实践. 本次会议的四位与会者都是开源项目的维护者,包括来自微软拉美区的听众布道经理(Audience Evangelism Manager)Carlos Rojas,用于创建松耦合.可维护.易测试的XAML应用的PRISM框架的作者Brian Lagunas,参与了多个开源项目工作的David Paquette,以及适用于C#及VB的分析器库CodeCracker的维护者Carlos dos

微信Android热更新Tinker使用详解(星空武哥)

Tinker是什么 Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码.So库以及资源,让应用能够在不需要重新安装的情况下实现更新.当然,你也可以使用Tinker来更新你的插件. 它主要包括以下几个部分: gradle编译插件: tinker-patch-gradle-plugin 核心sdk库: tinker-android-lib 非gradle编译用户的命令行版本: tinker-patch-cli.jar 为什么使用Tinker 当前市面的热补丁方案有很多,其中比较

Android项目持续集成实践之Gitlab CI

简介 持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误. 入门 下面我们来简单介绍,如果通过Gitlab CI来对Android项目持续集成. 一言不合,先甩给你一个项目链接:https://gitlab.com/snowdream/Citest 项目很简单,就是一个默认创建的Andro

更新开源项目cocopods spec版本

1.进入到工程有podspec文件的目录 2.git tag查看所有的tag 3.git tag -d tagName 删除一个tag 4.git tag 1.2添加一个tag 5.git add-A && git commit -m 'Release 1.2'添加新的release版本 6.git push –tags在github上添加tag并更新内容 7.如果需要删除一个远程的Tag: git push origin –delete tag <tagName> 8.更新p

【Android】GitHub Android 开源项目汇总

参考网址:http://blog.csdn.net/ithomer/article/details/8882236 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上.基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你达到事半功倍的效果. 1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个

感受开源之力,参加“阿里开源项目最佳实践”峰会5大理由!

开源是孵化新技术领域的容器,开源是技术演进的强大推动力.多年来,阿里巴巴集团一直积极拥抱开源事业,无论是开源软件的应用.回馈以至自研技术的开源都非常活跃.2016年更是阿里技术开源的丰收年:73款产品开源.JStorm.RocketMQ.Weex三连捐Apache基金会.Weex在GitHub上Star破万.阿里云成为MySQL开源分支 WebScaleSQL 的发起成员:不仅量多而且质精:在开源中国公布的"2016年最受欢迎中国开源软件评选"的结果中,阿里巴巴独占TOP20中的4席.