在使用 androidStudio 的时候,和 Eclipse 对比最大的优势,就是可以更灵活的配置任何地方,可以定制出更多更复杂的适合我们自己的个性化配置,下面我们就来总结下开发过程中遇到的一些问题。
开发打包过程中,我们经常会有多个不同渠道的打包需求,不同渠道的打包可能会遇到替换资源文件的 string , drawable 以及 applicationId,包名, 代码中的各种开关等等。怎么解决这些问题?
问题一: 怎么打包时候动态替换 applicationId ?
问题二: 怎么打包时候动态替换 常量?如字符串,log开关等
问题三: 怎么打包时候动态替换 渠道资源 ?如友盟的渠道信息
先熟悉下 gradle 配置文件的结构, 并将问题的答案写在代码中:
apply plugin: com.android.application''
android{
compileSdkVersion 25
buildToolsVersion 25.0.2
defaultConfig{
applicationId "com.xyd.http_demo"
minSdkVersion 16
targetSdkVersion 22
verionCode 1
versionName "1.0.0"
}
// 编译类型,只能有 release 和 debug 这两种版本,可以配置代码中的开关,静态变量等
buildTypes{
debug {
signingConfig signingConfigs.release
//shrinkResources true
//对齐优化设置为true,否则找不到该task (默认不写也是true)
zipAlignEnabled true
buildConfigField "boolean", "LOG_DEBUG", "true"
buildConfigField "boolean", "OPEN_AD", "false"
buildConfigField "boolean", "OPEN_Verify", "false"
}
release {
signingConfig signingConfigs.release
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
buildConfigField "boolean", "OPEN_AD", "true"
buildConfigField "boolean", "OPEN_Verify", "true"
minifyEnabled false //混淆
zipAlignEnabled true //Zipalign优化
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// 签名文件的配置
signingConfigs{
release {
keyAlias "xyd"
keyPassword "xyd"
storeFile file('.../sss.jks')
storePassword '123456'
}
debug{
}
}
// 配置多渠道, 这里的多渠道名会出现在 gradle -> tasks -> build 下
productFlavors{
// 渠道名是字符串的形式,可以用 "" 包起来,如 "baidu" ;或者直接写,如 xiaomi
xiaomi {
// 该配置会覆盖defaultConfig中的配置, 通过此方式可实现不同渠道,不同包名
applicationId "com.xyd.http_demo1"
// 该配置会覆盖 manifest 中的渠道变量 channel
//
manifestPlaceholders = [channelName: "xiaomi"]
}
"baidu" {
applicationId "com.xyd.htto_debug"
manifestPlaceholders = [channelName: "baidu"]
}
}
}
多渠道信息的配置也可以采用这样:
android {
productFlavors {
"xiaomi"{}
"baidu"{}
"wandoujia"{}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [channelName: name]
}
}
问题四: 怎么打包时候,替换 appName 和 drawable 呢?
这个问题不提现在下面的配置文件中,想实现替换 appName 和 drawable 这类 resource 常量,需要在 main 同级目录下,新建和渠道名同名的目录,并建立相同的子路径,然后以相同的名字命名不同的资源文件,打包时候会实现自动替换或者合并。如下图。
例如: 在资源文件目录 mian\res\mipmap-hdpi\ic_laucher.png ,那 baidu 渠道要在 baidu\res\mipmap-hdpi\ic_laucher.png 放置,打包 baidu 渠道的时候,就会自动替换图片。
合并的情况,比如在 string.xml 中文件内容是:
加载中...
无更多数据
baidu 下面的 string.xml 文件内容是:
正在加中,不要着急...
打包 baidu 渠道会变成:
正在加中,不要着急...
无更多数据
采用这种方式,main 下所有文件都可以替换或者合并。