android studio:多版本,多渠道编译
proguard混淆
一般release发布版本是需要启用混淆的,这样别人反编译之后就很难分析你的代码,而我们自己开发调试的时候是不需要混淆的,所以debug不启用混淆。对release启用混淆的配置如下:
android {
buildTypes {
release {
minifyEnabled true//是否启动混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
多版本,多渠道编译
构建变量= 构建类型 + product flavor
其中 构建类型一般是 debug与 release, 也可自定义构建类型
Product flavor有产品的味道的意思。
可为每个 product flavor 单独配置资源文件 layout 与 drawable.如果与main有冲突编译优先会取flavor. value会与 main合并。 也可为 每个 falvor 单独创建目录java文件,在flavor下单独存在,各个flavor互不冲突,但不可与main有冲突,否则编译不过。
资源优先级(覆盖原则:从左到右 优先级逐步降低):
Buildtype -------->product falvor ------->main---->库中的资源
可在每个 product flavor中 自定义
versionCode
versionName
会覆盖 默认defaultConfig中的 versionCode与versionName
另外,可以在product flavor中 自定义资源变量,根据构建变量,编译出apk后,运行后就可以取出该资源变量的值。根据该变量值,华数apk 做出相应的UI调整,以及业务规则修改。 product flavor的buildConfigField属性也可以解决该问题,编译出apk后,可以获得静态变量 BuildConfig.channel的值
声明如下:
buildConfigField "String", "channel", name
例子如下:
flavorDimensions("channel", "region")
productFlavors {
//渠道名
hangzhou { dimension "region"
resValue("string", "region", "China")}
zhejiang { dimension "region"
resValue("string", "region", "chongqing")}
//版本名
tcl {
dimension "channel"
versionCode 1234
versionName "AAA-1234"
resValue("string", "versionType", "TCL")
}
对于jar包多版本区别打包,实例如下:
tclCompile files('libs/***.jar')
chuangweiHCompile files('libs/***.jar')
chuangweiLCompile files('libs/***.jar')
changhongCompile files('libs/***.jar')
buildTypes
buildTypes {
release {
debuggable true minifyEnabled true //启用Proguard
shrinkResources true //是否清理无用资源,依赖于minifyEnabled
zipAlignEnabled true //是否启用zipAlign压缩
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' }
debug {
debuggable true
minifyEnabled false //不启用Proguard
shrinkResources false //是否清理无用资源,依赖于minifyEnabled
zipAlignEnabled false //是否启用zipAlign压缩
signingConfig signingConfigs.debug
}
}
注意:
1 .minifyEnabled 会对代码进行混淆和压缩,shrinkResources 会对比R文件对无用资源进行删除
2.minifyEnabled 设置为true时shrinkResources 的设置才会生效