阅读 404

热修复技术实践之旅——TinkerPatch热修复加Walle多渠道打包(下)

本文下篇导语:

本文下篇核心内容介绍:
(1)Tinker加入了walle的多渠道打包方案,能迅速打出很多个渠道包。详细的介绍了真实项目上线时APK及补丁包的版本维护,如何通过单个补丁包,修复多个渠道,进行热修复的实现方案。
(2)文章末尾总结了接入过程中可能遇到的坑,及相应的解决方案,能帮助你无障碍的接入Tinker。以及简单的分享了一些关于热修复技术方面需要储备的一些技术知识。

三、Tinker结合Walle多渠道打包的使用详解

Walle(瓦力):是美团开源的Android Signature V2 Scheme 签名下的新一代渠道包打包神器,跟gradle打包不一样,walle是在APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,可以作为单机工具来使用,也可以部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。 ---Walle的介绍

1.在项目根目录的bulid,gradle文件中添加Walle插件的依赖:

 classpath 'com.meituan.android.walle:plugin:1.1.6'
复制代码

2.在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR

apply plugin: 'walle'

dependencies {
    compile 'com.meituan.android.walle:library:1.1.6'
}
//配置插件
walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名称
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel.txt")
}
复制代码

3.配置项具体解释:

  • apkOutputFolder:指定渠道包的输出路径, 默认值为new File("${project.buildDir}/outputs/apk")

  • apkFileNameFormat:定制渠道包的APK的文件名称, 默认值为'${appName}-${buildType}-${channel}.apk' 可使用以下变量:

      projectName - 项目名字
      appName - App模块名字
      packageName - applicationId (App包名packageName)
      buildType - buildType (release/debug等)
      channel - channel名称 (对应渠道打包中的渠道名字)
      versionName - versionName (显示用的版本号)
      versionCode - versionCode (内部版本号)
      buildTime - buildTime (编译构建日期时间)
      fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
      flavorName - 编译构建 productFlavors 名
    复制代码

4.在App目录下新建channel.txt配置所需要的渠道。具体内容格式详见:渠道配置文件示例,支持使用#号添加注释。

5.生成渠道包——在Android Studio的控制台—Teminal输入: ①生成所有渠道的渠道: gradlew clean assembleReleaseChannels
②生成某一个渠道:gradlew clean assembleReleaseChannels -PchannelList=baidu ③生成指定的多个渠道包 ./gradlew clean assembleReleaseChannels -PchannelList=baidu,xiaomi

Build成功后的效果如下图:

walle_build_apk_sucessful.png
生成的多渠道包的目录如下图:
image.png
6.针对多渠道打出适用所有渠道包的补丁包:使用tinkerPatchRelease打出补丁包,具体如下图所示。
image.png
适用于所有渠道的补丁包的位置如下:
image.png

7.获取渠道信息

String channel = WalleChannelReader.getChannel(this.getApplicationContext());
复制代码

四、接入Tinker热修复和多渠道打包后,项目线上APK的发布及补丁包发布的维护。

(1)多渠道APK的发布: 每次上线时,只需要执行上面生成渠道包的命令,打出多个渠道的APK即可,将各个渠道分发到各个应用市场即可。根据项目需求,可以通过获取渠道信息,进行渠道统计。切记每次发布新版本时,一定要备份好bacApk目录的文件,发布补丁的时候需要。因为一旦丢失,就失去了基准包的信息了,就无法打出相应基准包的补丁包了。 (2)补丁包的发布: 当线上APK出现bug需要修复时,在tinkerPatch.gradle中配置好你线上发布的基准包的信息(之前备份的基准包),使用tinkerPatchRelease打出补丁包,在TinkerPatch管理后台下发补丁。具体如上步骤6.

配置基准包信息:

image.png

五、接入时可能遇到的问题:

(1)接入Tinker时,打包的时候出现以下错误com.tencent.tinker.loader.TinkerRuntimeException: Tinker Exception:applicationLike must not be null.:是因为你的 tinkerPatch.gradle中配置 reflectApplication = false,但是你又没有相应的改造你的Application类。本文介绍的是不改造我们的 Application 类接入Tinker,所以 配置应该为:reflectApplication = ture。

image.png

(2)多渠道打包时,出现下面错误

  • What went wrong: Execution failed for task ':app:compileReleaseJavaWithJavac'. Could not find tools.jar. Please check that D:\develop\JRE-New contains a valid JDK installation.

这个错误是因为在安装JDK时,会安装两次,一次安装JDK,一次安装jre,因为第一次JDK的安装就已经安装了一个jre,而安装时的提示会再次安装一个jre。所以在第二次安装jre时,先暂停,你需要将第一次安装JDK的目录下的一个/jre文件夹删掉,然后在安装另一个jre,这样就可以了。再重新执行walle打包的命令,就能成功打出多渠道包了。

image.png
(3)Demo打开运行时,如果提示下面问题, Rebuild一下工程或者将implementation 'com.android.support:appcompat-v7:26.1.0'改成 implementation 'com.android.support:appcompat-v7:27.1.1'即可:

Error:Execution failed for task ':app:preDebugAndroidTestBuild'. Conflict with dependency 'com.android.support:support-annotations' in project ':app'. Resolved versions for app (26.1.0) and test app (27.1.1) differ. See https://d.android.com/r/tools/test-apk-dependency-conflicts.html for details.

(4)执行多渠道打包命令(如gradlew clean assembleReleaseChannels)时,若提示如下BUILD FAILED的信息,Rebuild一下工程再执行打包命令即可正常打包。

  • What went wrong: Execution failed for task ':app:clean'. Unable to delete file: C:\Users\18673\Desktop\TinkerPatchDemo-master\app\build\intermediates\manifests\full\debug\AndroidManifest.xml

####知识储备: 1、关于Dex Dex是Android平台上可执行文件的类型,是可以在Dalvik虚拟机上直接运行的文件格式。Java源代码经过ADT的复杂编译后转换成Dex文件,这是一个逐步优化的过程。Dex文件的指令码就是Dalvik虚拟机专有的一套指令集,相比标准java的.class文件,它体积小,运行效率高。

2、理解热修复原理: Android JVM的运行过程

3、关于虚拟机Dalvik

  • 每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。
  • 所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。
  • 不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。

4、关于ART模式 ART模式英文全称为:Android runtime,谷歌Android 4.4系统新增的一种应用运行模式,与传统的Dalvik模式不同,ART模式可以实现更为流畅的安卓系统体验。 Android系统是以Linux系统为底层构建的。谷歌为了降低应用的开发难度在Linux底层之上构筑了一个名为“Dalvik”的虚拟机。 因为Dalvik虚拟机的存在,Android系统的开发者只需使用谷歌提供的SDK(软件开发工具包)即可较为轻松的按照一套“规则”创建APP,不用顾忌硬件、驱动等问题,在每次执行应用的时候Dalvik虚拟机都会将程序的语言由高级语言编译为机器语言,这样当前设备才能够运行这一应用。

ART模式与Dalvik模式最大的不同在于,在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。

本文完整Demo GitHub下载地址请戳:TinkerPatchDemo

本文参考:
Tinker源码
TinkerPatch 接入及平台使用文档
Android 热修复 Tinker接入及源码浅析—hongyang
MultiDex与热修复实现原理 Tinker加入Walle多渠道打包

文章分类
Android