封裝產(chǎn)品的特性,只需配置 productFlavors {} 。productFlavors支持與 defaultConfig{} 相同的屬性,這是因?yàn)?defaultConfig 實(shí)際上屬于 ProductFlavor類。這意味著,您可以在 defaultConfig {} 代碼塊中提供productFlavors的基本配置,productFlavors{}里面的每種均可更改任何這些默認(rèn)值,也可以指定不同的特性、設(shè)備需求、資源和應(yīng)用程序ID,同時(shí)共享公共源代碼和資源.
android {
...
defaultConfig {...}
buildTypes {...}
productFlavors {
demo {
applicationIdSuffix ".demo"
versionNameSuffix "-demo"
}
full {
applicationIdSuffix ".full"
versionNameSuffix "-full"
}
}
}
Gradle 會(huì)根據(jù)您的buildType{}和productFlavors自動(dòng)創(chuàng)建構(gòu)建變體,并按照 <product-flavor><Build-Type> 的格式命名這些變體。
下面是它的一些常用屬性:
| 屬性 | 描述 |
|---|---|
| applicationId | 應(yīng)用的包名 |
| versionCode | 版本號(hào) |
| versionName | 版本名 |
| versionNameSuffix | 版本名后綴 |
| map<String,Object> manifestPlaceholders | 定義Manifest變量占位符 |
applicationId
每個(gè) Android 應(yīng)用均有一個(gè)唯一的應(yīng)用 ID,像 Java 軟件包名稱一樣,如 com.example.myapp。 此 ID 可以在設(shè)備上和 Google Play 商店中對(duì)您的應(yīng)用進(jìn)行唯一標(biāo)識(shí)。 如果您想要上傳新版本的應(yīng)用,應(yīng)用 ID必須與原始 APK 相同 - 如果您更改應(yīng)用 ID,Google Play 商店會(huì)將 APK 視為完全不同的應(yīng)用。所以您發(fā)布應(yīng)用后,絕不應(yīng)更改應(yīng)用 ID。
當(dāng)您在 Android Studio 中創(chuàng)建新項(xiàng)目時(shí),applicationId 會(huì)完全匹配您在設(shè)置時(shí)選擇的 Java 風(fēng)格軟件包名稱。 不過(guò),除了這一點(diǎn),應(yīng)用 ID 和軟件包名稱彼此無(wú)關(guān)。您可以更改代碼的軟件包名稱(代碼命名空間),這不會(huì)影響應(yīng)用 ID,反之亦然(但同樣,您發(fā)布應(yīng)用后不應(yīng)再更改應(yīng)用 ID)
盡管應(yīng)用 ID 看起來(lái)像傳統(tǒng)的 Java 軟件包名稱,但應(yīng)用 ID 的命名規(guī)則有更多限制:
1.必須至少包含兩段(一個(gè)或多個(gè)圓點(diǎn))。
2.每段必須以字母開頭。
3.所有字符必須為字母數(shù)字或下劃線 [a-zA-Z0-9_]。
注意Context.getPackageName() 方法會(huì)返回您的應(yīng)用 ID。 無(wú)論何時(shí)都不需要在應(yīng)用代碼以外分享代碼真實(shí)的軟件包名稱。
ProductFlavor類里面的buildConfigField方法在配置中的使用:
buildConfigField("boolean", "LOG_DEBUG", "true")
buildConfigField "int", "VERSION_TYPE", "1"
這個(gè)方法接收三個(gè)非空的參數(shù),第一個(gè):確定值的類型,第二個(gè):指定key的名字,第三個(gè):傳值。
上面的意思是:LOG_DEBUG = true ;VERSION_TYPE = 1
可以用在代碼中:
if(BuildConfig.LOG_DEBUG){
//Debug,打印日志
Logger.init("AppPlusLog").setLogLevel(LogLevel.FULL);
}else{
//release,關(guān)閉日志
Logger.init("AppPlusLog").setLogLevel(LogLevel.None);
}
String versionType = BuildConfig.VERSION_TYPE;
將Build文件中聲明的變量屬性使用到Manifest中
比如:
1.配置主機(jī)ip地址,名稱
android {
defaultConfig {
manifestPlaceholders = [hostName:"www.example.com",post:"8080"]
}
...
}
然后你可以把其中的key插入到Manifest文件屬性值:
<intent-filter ... >
<data android:scheme="http" android:host="${hostName}" ... />
...
</intent-filter>
你還可以用這些屬性值作為命名空間,比如定義action name
android {
defaultConfig {
applicationId "com.example.myapp"
}
productFlavors {
free {
applicationIdSuffix ".free"
}
pro {
applicationIdSuffix ".pro"
}
}
}
你可以將application ID插入到action name,如下:
<intent-filter ... >
<action android:name="${applicationId}.TRANSMOGRIFY" />
...
</intent-filter>
當(dāng)你運(yùn)行的是free版本的時(shí)候,它就類似于:
<intent-filter ... >
<action android:name="com.example.myapp.free.TRANSMOGRIFY" />
...
</intent-filter>
過(guò)濾變體
Gradle 會(huì)為您配置的產(chǎn)品風(fēng)味與構(gòu)建類型的每個(gè)可能的組合創(chuàng)建構(gòu)建變體。不過(guò),某些特定的構(gòu)建變體在您的項(xiàng)目環(huán)境中并不必要,也可能沒(méi)有意義。您可以在模塊級(jí) build.gradle 文件中創(chuàng)建一個(gè)變體過(guò)濾器,以移除某些構(gòu)建變體配置。
以上一部分中的構(gòu)建配置為例,假設(shè)您計(jì)劃為演示版本的應(yīng)用僅支持 API 級(jí)別 23 和更高級(jí)別。您可以使用 variantFilter {}代碼塊過(guò)濾出組合了“minApi21”和“演示”產(chǎn)品風(fēng)味的所有構(gòu)建變體配置:
android {
...
buildTypes {...}
flavorDimensions "api", "mode"
productFlavors {
demo {...}
full {...}
minApi24 {...}
minApi23 {...}
minApi21 {...}
}
variantFilter { variant ->
def names = variant.flavors*.name
// To check for a certain build type, use variant.buildType.name == "<buildType>"
if (names.contains("minApi21") && names.contains("demo")) {
// Gradle ignores any variants that satisfy the conditions above.
setIgnore(true)
}
}
}
...
在您向構(gòu)建配置添加變體過(guò)濾器并點(diǎn)擊通知欄中的 Sync Now后,Gradle 將忽略滿足您指定的條件的任何構(gòu)建變體,在您點(diǎn)擊菜單欄中的 Build > Select Build Variant(或工具窗口欄中的 Build Variants)時(shí),這些構(gòu)建變體將不會(huì)再顯示在下拉菜單中。
https://developer.android.com/studio/build/manifest-build-variables.html