差异化工具集成
目录
介绍:
差异化编译目的是对不同版本不同渠道对代码,资源,lib库等文件单独配置打包,解耦业务,功能,模块减少包大小。
一、差异化编译
1.FlavorDimensions 的意义
多维度理解
其实这涉及到了版本差异化打包的内容,如果说3.0以前的版本差异化打包更多的是为了厂商定制的,那么3.0以后的版本差异化打包就是在厂商的基础之上加入了机型,渠道等一些参数,变成了多个维度的产品。
也就是说之前的一个产品只有一个参数进行描述的话,现在就可以为其增加多个参数进行配置,比如A厂商的A渠道的A机型、A厂商的B渠道的C机型等,维度越多,产品的样式越发丰富。
2.ProductFlavors 组合
productFlavors 从字面了解是“产品风味”。他需要和一个风味维度对接,否则会报错。接着我们上面的例子,使用 productFlavors 定义维度上的风味,使用 dimension 关联。
可以理解为总共有两个维度公司(version)和渠道(country),这里version的维度排前面,所以所有的产品就是,A版本的A渠道产品,A版本的B渠道产品,B版本的A渠道产品,B版本的B渠道产品。可见,增加维度之后,版本差异化的内容就更为丰富了。
编译不同task在build->outputs->apk可以找到不同维度目录apk
二、差异化配置
1.Version维度配置版本相关信息
productFlavors可以重新定义defaultConfig配置里的信息dimension关联维度
(1)version定义版本号,sdk版本。。。可以通过DefaultProductFlavor.java文件查看可以配置的属性
(2)Country下面定义包名,图标,应用名,签名。。。
(3)最终安装apk以后可以在桌面看到不同应用
(4)差异化配置代码,资源,Aidl,Jni…可以通过AndroidSourceSet.java文件查看可以配置属性
(5)注意事项
代码做差异化配置时直接用AndroidStudio创建的项目在settings.gradle配置里面可以看到
include ':app'
这个说明项目根目录在app目录下,默认代码和资源文件都是固定导致后面配置的sourceSet差异化代码无法生效。
解决方法:
(1)settings.gradle去掉应用根目录配置':app',去除以后所有文件代码资源等需要在下面重新配置,因为跟目录变成了项目根目录
sourceSets {
main {
java.srcDir './app/src/main/java'
res.srcDirs './app/src/main/res'
manifest.srcFile '/app/src/main/AndroidManifest_common.xml'
}
}
(2)把app/src/下的build.gradle和最外层的build.gradle合并,最好保留根目录下的build.gradle文件
4.Debug和Release版本调试工具配置
为了监控应用内存,耗时和其他问题代码需要借助一些常用工具,这些工具要区分研发版本和发布版本,不能把调试工具带入到用户版本上,如果通过一些代码变量控制很容易出问题,单通过差异化配置就可以一次解决打包引起的代码混乱问题。
(1)debug版本时导入相关工具,也可以根据自己定义的渠道添加不同的依赖库
dependencies {
...
//debug模式时工具编入项目
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3'
//release编译
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'
debugImplementation 'com.github.markzhai:blockcanary-android:1.5.0'
releaseImplementation 'com.github.markzhai:blockcanary-n