Android build.gradle之productFlavors { }

封裝產(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容