自己以前很懒,不想写博客,写了也只是对一些Bug的记录:只是问题简单的描述,以及在哪里搜索的答案,最后贴上解决办法完事;没有考虑别人是否能够读懂或者看懂。最近发生一件事情,让我对写博客,有了改观:自己查看自己的博客,还需要很久才能搞懂怎么样解决问题。因此,决定:以后写博客,做到简单易懂,血的教训。。。
好了,不再废话进入正题:
最近公司的项目需要根据不同的公司生成不成的应用(包名,应用名,以及配置其他的不同数据),还要根据不同的渠道生成渠道包;再加上Android Studio升级到3.0后以前的配置不能用了,因此在此记录备忘!
以上是缘由,再网上搜到的数据也要看最近发布的,因为以前的再AS3.0上面报错,并且大部分的方案都是针对一种结果,对于即包含不同公司和不同渠道的方法还没有看到,因此只能再官网找了,Android中文网站不用翻墙,找到配置构建变体,看到下面“配置产品风味”->“组合多个产品风味”,才发现这是才是我想要的东西,虽然当时并没有看出来,(lll¬ω¬),简单看一下官网的gradle配置:
android {
...
buildTypes {
debug {...}
release {...}
}
// Specifies the flavor dimensions you want to use. The order in which you
// list each dimension determines its priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
//指定要使用的味道维度。
//当Gradle合并变体来源和配置时,您列出每个维度的顺序决定了它的优先级,从最高到最低。
//您必须将您配置的每种产品口味分配给其中一个口味维度。
//以上是机器翻译,这就是算两个模块,一个是api,一个mode,可以分别配置,
//需要在productFlavors中用dimension来标明
flavorDimensions "api", "mode"
productFlavors {
demo {
// Assigns this product flavor to the "mode" flavor dimension.
dimension "mode"
...
}
full {
dimension "mode"
...
}
// Configurations in the "api" product flavors override those in "mode"
// flavors and the defaultConfig {} block. Gradle determines the priority
// between flavor dimensions based on the order in which they appear next
// to the flavorDimensions property above--the first dimension has a higher
// priority than the second, and so on.
minApi24 {
dimension "api"
minSdkVersion '24'
// To ensure the target device receives the version of the app with
// the highest compatible API level, assign version codes in increasing
// value with API level. To learn more about assigning version codes to
// support app updates and uploading to Google Play, read Multiple APK Support
versionCode 30000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi24"
...
}
minApi23 {
dimension "api"
minSdkVersion '23'
versionCode 20000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi23"
...
}
minApi21 {
dimension "api"
minSdkVersion '21'
versionCode 10000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi21"
...
}
}
}
官方说,使用Android插件3.0.0及更高版本配置产品风格时,必须使用flavorDimensions属性指定至少一个风格维度,然后将每种风格分配给一个维度。因此以前的配置在Android Studio3.0上边不能用了。Gradle 创建的构建变体数量等于每个风味维度中的风味数量与您配置的构建类型数量的乘积。在 Gradle 为每个构建变体或对应 APK 命名时,属于较高优先级风味维度的产品风味首先显示,之后是较低优先级维度的产品风味,再之后是构建类型。以上面的构建配置为例,Gradle 可以使用以下命名方案创建总共 12 个构建变体:
构建变体:[minApi24, minApi23, minApi21][Demo, Full][Debug, Release]
对应 APK:app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk
例如,
构建变体:minApi24DemoDebug
对应 APK:app-minApi24-demo-debug.apk
以上大部分都是官网翻译的文字,我只是粘贴过来。。。所以需要多看看官网数据。
以下是我写的代码:
//企业和渠道
flavorDimensions "company", "channel"
productFlavors {
//企业
hi {
dimension "company"
resValue("string", "app_name", "hi")
manifestPlaceholders = [COMPANY_CODE: "",
API_KEY : "1ffa31c047ef2df54a01672287aadd"]
}
hua {
dimension "company"
applicationIdSuffix ".hua"
resValue("string", "app_name", "hua")
manifestPlaceholders = [COMPANY_CODE: "\"410000000000000047\"",
API_KEY : "f09b7fc44ac0f45323a92101cb7094"]
}
jia {
dimension "company"
applicationIdSuffix ".jia"
resValue("string", "app_name", "jia")
manifestPlaceholders = [COMPANY_CODE: "\"147\"",
API_KEY : "515d173aac1b17ec715aae8e6e16db"]
}
shang {
dimension "company"
applicationIdSuffix ".shang"
resValue("string", "app_name", "shang")
manifestPlaceholders = [COMPANY_CODE: "\"410000000000000020\"",
API_KEY : "9068bf32814f86117b5416ca5ab875"]
}
//渠道
hiSoft {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "hi"]
}
qq {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "qq"]
}
huawei {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "huawei"]
}
xiaomi {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"]
}
qq {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "qq"]
}
_360 {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "360"]
}
baidu {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "baidu"]
}
oppo {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "oppo"]
}
vivo {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "vivo"]
}
}
打包的时候,如图所示:
总过四个公司,八个渠道,生成32个包。我也是醉了,也不知道公司是怎么想的。总之,心情是愉悦的,终于解决了目前的问题。但是这只是暂时的,因为以后不同的公司以后会有不同的需求,然后不同的公司代码也就不同了,用插件化吗?看来知识储备还是不够,自勉。。。