多渠道打包及资源指定
由于项目涉及多个车型,使用的是同一个base代码,不同车型都有差分项,所以需要进行多渠道打包,编译不同的资源进行编译处理
一、多渠道打包方式
productFlavor
背景
Android默认提供了Gradle
插件库
classpath "com.android.tools.build:gradle:4.0.1"
在module中的build.gradle
中引入相关插件,如:
apply plugin: 'com.android.application'
而productFlavor正是这个插件中提供的API方便进行配置
使用
需要在module
下的build.gradle
中设置
flavorDimensions "default"
productFlavors {
favor {
}
disfavor {
}
}
此时就可以在AndroidStudio
中的BuildVariants
中选择想要编译的版本
-
我们只配置了两项,至于这里的为什么有四个选项,这是由于APP默认就会有两个变种,分别是debug和release;
-
debug和release版本区别
在
Android
开发中,Debug版本和Release版本是两种不同的构建方式,它们在以下几个方面有所区别:- 调试信息:Debug版本包含了丰富的调试信息,以方便开发者在调试过程中进行断点调试、日志输出等操作。这些调试信息可以帮助开发者定位和解决问题。而Release版本会进行代码优化和混淆,以减小应用程序的体积和提高执行效率,但可能不包含完整的调试信息。
- 性能:由于Debug版本包含了较多的调试信息和没有经过优化的代码,因此它往往会比Release版本运行速度稍慢。而Release版本由于进行了代码优化、资源压缩和混淆等操作,因此在性能方面通常更为优化。
- 安全性:由于Release版本进行了代码混淆和资源压缩等操作,使得逆向工程变得更加困难,从而提高了应用程序的安全性。而Debug版本则没有进行相关操作,可能容易被逆向工程分析。
- 签名:Release版本需要进行数字签名,以确保应用程序的身份和完整性。签名可以防止恶意篡改应用程序,并使得应用程序在发布到应用商店时能够通过签名验证。
- 日志输出:Debug版本可以输出详细的日志信息,包括调试信息、异常堆栈等。而Release版本通常会禁用一些敏感信息的日志输出,以保护用户隐私和应用程序的安全
-
这里的flavorDimensions是必须要有的,否则会报错
Error:All flavors must now belong to a named flavor dimension.
AndroidStudio3.0之前可以,之后的版本就会提示这个异常;大致是因为Plugin 3.0.0之后有一种自动匹配消耗库的机制,便于debug variant 自动消耗一个库,然后就是必须要所有的flavor 都属于同一个维度。解决办法就是添加flavorDimensions “”
最好属性设置default默认,这样就可以保证所有的flavor属于同一个维度;注意这里的flavorDimensions
可以添加多个属性,但是添加多个属性后需要在每个flavor中配置相应的dimension;例如
flavorDimensions "default","channel"
productFlavors {
favor {
dimension "default"
buildConfigField "boolean", "LOG_DEBUG", "false"
}
disfavor {
dimension "channel"
buildConfigField "boolean", "LOG_DEBUG", "true"
}
}
- 同时,我们可以在不同的flavor中配置需要的属性值,比如上面的buildConfigField设置,这样就会在BuildConfig文件中生成,这样我们就可以在代码中读取相应的值进行设置
二、资源制定
sourceSets
sourceSet
的具体表现类为 com.android.build.gradle.api.AndroidSourceSet
是一个接口;sourceSets
可以针对不同的类型进行个性化设置,main为主干,其他的设置为分支,分支的设置会合并到主干中,并且支持配置多个sourceSet
;
使用
需要在module
下的build.gradle
中设置
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/main/favor']
res.srcDirs = ['src/main/res', 'src/main/res-favor']
}
favor.java.srcDirs = ['src/main/favor']
favor.assets.srcDirs = ['src/main/favor/assets']
favor.res.srcDirs = ['src/main/res-favor']
disfavor.java.srcDirs = ['src/main/disfavor']
disfavor.assets.srcDirs = ['src/main/disfavor/assets']
disfavor.res.srcDirs = ['src/main/res-disfavor']
}
此时编译的时候就会根据我们选中的不同的渠道下的资源进行编译;上面main中的配置是指将原本编译的路径替换为我们指定的路径,下面的设置是指定不同渠道下需要编译的资源路径
配置
依赖设置
可以根据不同渠道添加不同的依赖文件
dependencies {
flavorImplementation 'xxx'
flavorApi 'xxx'
}