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

Android热更新开源项目Tinker集成实践总结,第1张

概述前言最近项目集成了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.nametasks.all {if (variant.buildType.name == 'release') {if ("tinkerPatch${taskname.cAPItalize()}".equalsIgnoreCase(it.name)) {// find resguard taskdef resguardTasktasks.all {if (it.name.startsWith("resguard")) {resguardTask = it}}it.doFirst({// change build apk pathit.buildApkPath = "${buildDir}/outputs/apk/AndResGuard_${project.getname()}-${taskname}/${project.getname()}-${taskname}_signed.apk"})// change task dependence to resguard taskit.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集成实践总结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存