前言

最近项目集成了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的内容。具体关于packer-ng-plugin的介绍,可以参考文档[Android打包工具packer-ng-plugin]。

考虑三:资源混淆所造成的问题

目前项目使用了资源混淆项目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代码如下:

 1 android.applicationVariants.all { variant ->2 /**3 * task type, you want to bak4 */5 def taskName = variant.name6 7 tasks.all {8 if (variant.buildType.name == 'release') {9
10 if ("tinkerPatch${taskName.capitalize()}".equalsIgnoreCase(it.name)) {
11
12 // find resguard task
13 def resguardTask
14 tasks.all {
15 if (it.name.startsWith("resguard")) {
16 resguardTask = it
17 }
18 }
19 it.doFirst({
20 // change build apk path
21 it.buildApkPath = "${buildDir}/outputs/apk/AndResGuard_${project.getName()}-${taskName}/${project.getName()}-${taskName}_signed.apk"
22 })
23
24 // change task dependence to resguard task
25 it.dependsOn resguardTask
26 }
27
28 if ("resguard${taskName.capitalize()}".equalsIgnoreCase(it.name)) {
29 it.doLast {
30 copy {
31 def date = new Date().format("MMdd-HH-mm-ss")
32 from "${buildDir}/outputs/apk/AndResGuard_${project.getName()}-${taskName}/${project.getName()}-${taskName}_signed_7zip_aligned.apk"
33 into file(bakPath.absolutePath + "/resguard")
34 rename { String fileName ->
35 fileName.replace("${project.getName()}-${taskName}_signed_7zip_aligned.apk", "${project.getName()}-${taskName}-${date}.apk")
36 }
37
38 from "${buildDir}/outputs/mapping/${taskName}/mapping.txt"
39 into file(bakPath.absolutePath + "/resguard")
40 rename { String fileName ->
41 fileName.replace("mapping.txt", "${project.getName()}-${taskName}-${date}-mapping.txt")
42 }
43
44 from "${buildDir}/intermediates/symbols/${taskName}/R.txt"
45 into file(bakPath.absolutePath + "/resguard")
46 rename { String fileName ->
47 fileName.replace("R.txt", "${project.getName()}-${taskName}-${date}-R.txt")
48 }
49 from "${buildDir}/outputs/apk/AndResGuard_${project.getName()}-${taskName}/resource_mapping_${project.getName()}-release.txt"
50 into file(bakPath.absolutePath + "/resguard")
51 rename { String fileName ->
52 fileName.replace("resource_mapping_${project.getName()}-release.txt", "${project.getName()}-${taskName}-${date}-resource_mapping.txt")
53 }
54 }
55 }
56 }
57 }
58 }

针对问题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

over~~

转载于:https://www.cnblogs.com/zhangkeyu/p/6647553.html

Android热更新开源项目Tinker集成实践总结相关推荐

  1. Android热更新十:自己写一个Android热修复

    很早之前就想深入的研究和学习一下热修复,由于时间的原因一直拖着,现在才执笔弄起来. Android而更新系列: Android热更新一:JAVA的类加载机制 Android热更新二:理解Java反射 ...

  2. Android热更新五:四大热修复方案对比分析

    很早之前就想深入的研究和学习一下热修复,由于时间的原因一直拖着,现在才执笔弄起来. Android而更新系列: Android热更新一:JAVA的类加载机制 Android热更新二:理解Java反射 ...

  3. Android热更新初探,Bugly热更新的集成和使用(让你的应用轻松具备热更新能力)

    介绍   在介绍Bugly之前,需要先向大家简单介绍下一些热更新的相关内容.当前市面的热补丁方案有很多,其中比较出名的有阿里的AndFix.美团的Robust以及QZone的超级补丁方案.但它们都存在 ...

  4. Android热更新技术的研究与实现Sophix

    所以阿里爸爸一直在进步着呢,知道技术存在问题就要去解决问题,这不,从Dexposed-->AndFix-->HotFix-->Sophix,技术是越来越成熟了. Android热更新 ...

  5. Android热更新研究与实现

    第一部分重点是将当下热门的热更新方案实现之后再研究,第二部分则是自己动手实现一个自己的热更新框架. Android热更新技术的研究与实现之研究篇 ---概念讲解--– 热更新 相关概念 这个词出现的时 ...

  6. bugly android8.1加固,2020-09-27 Bugly Android热更新使用指南

    戳我查看 DEMO Bugly Android热更新使用指南 官方文档 视频教程 第一步:添加插件依赖 工程根目录下"build.gradle"文件中添加: buildscript ...

  7. GitHub Android 最火开源项目Top20

    GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上.基于不要重复造轮子的原则,了解当下比较流行的Android与i ...

  8. Android 收集的开源项目和文章集合

    Android 收集的开源项目和文章集合 置顶2017年12月21日 16:06:45 阅读数:3128 2017-12-21 1.仿QQ说说发图片选择框架  https://github.com/y ...

  9. android 热更新 方案,热更新-热更新app开发的两种系统方案!

    针对app开发工作人员来讲,除开要会编码,热更新也是一定要学好和把握的方法,从技术性视角而言,热更新对Android和iOS各自有不一样的系统软件方案,为了更好地让大伙儿掌握这二种系统方案的差别,今日 ...

最新文章

  1. MPB:陈同等-ImageGP在微生物组可视化中的应用
  2. JavaScript高级编程学习7——this关键字
  3. PyCharm+QT Designer整合
  4. 修改服务器文件系统为xfs,CentOS Linux如何无损调整分区大小(XFS文件系统)
  5. 1.2 @Override注解
  6. 重构客户注册-基于ActiveMQ实现短信验证码生产者
  7. C++关系运算符重载
  8. C#学员信息管理试题
  9. SpringBoot整合kafka(实现producer和consumer)
  10. idea升级2019.3后字体有的粗有的细
  11. MyBatis-Plus_断言
  12. CUDA peer to peer多GPU间内存copy技术
  13. 风控中的企业与个人数据有哪些核验维度
  14. vuecli+axios的post请求传递参数异常
  15. 数据结构上机实践第三周项目3- 求集合并集
  16. 关于VS2017提示I/O文件操作函数需要加上_s的解决办法
  17. eslint 报error
  18. MyBatis官方文档——入门部分
  19. SQL server置疑数据库修复
  20. 用苹果手机做c语言作业,c for ios好用吗,就是苹果手机上的一个C语言编程APP

热门文章

  1. RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)
  2. C语言switch制作菜单例题,c语言入门之,switch语句习题。
  3. C++工作笔记-对'xxxxx'未定义的引用的2种情况
  4. php提交raw_PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
  5. php mysql mvc_超简洁PHPMVC
  6. python subplot_Python金融应用之图表制作(五)
  7. C语言重点难点:与,或和异或
  8. opencv调试利器ImageWatch的安装使用
  9. mingW与cygwin
  10. QT 提示之右下角冒泡