操作task之applicationVariants


一般的 Java 項目中有一組 task 用於協同處理並最終生成一個輸出。
classes task 用於編譯 Java 源代碼。
可以在 build.gradle 文件中使用 classes 訪問 classes task 。classes 是 project.tasks.classes 的縮寫。

+

 

相比之下在 Android 項目中這就有點復雜。因為 Android 項目中會有大量相同的 task,並且它們的名字基於Build Types 和 Product Flavor 生成。

+

 

為了解決這個問題,android 對象有三個屬性:

+

 

  • applicationVariants(只適用於 app plugin)
  • libraryVariants(只適用於 library plugin)
  • testVariants(app、library plugin 均適用)

這三個屬性會分別返回一個 ApplicationVariantLibraryVariant 和 TestVariant 對象的DomainObjectCollection

+

 

注意,使用這三個 collection 中的其中一個都會觸發生成所有對應的 task。這意味着使用 collection 之后不需要重新配置。

+

 

DomainObjectCollection 可以直接訪問所有對象,或者通過過濾器進行篩選。

+

 

android.applicationVariants.each { variant ->
    ....
}

這三個 variant 類都擁有下面的屬性:

+

 

屬性名 屬性類型 說明
name String Variant 的名字,唯一
description String Variant 的描述說明
dirName String Variant 的子文件夾名,唯一。可能有不止一個子文件夾,例如 “debug/flavor1”
baseName String Variant 輸出的基礎名字,必須唯一
outputFile File Variant 的輸出,該屬性可讀可寫
processManifest ProcessManifest 處理 Manifest 的 task
aidlCompile AidlCompile 編譯 AIDL 文件的 task
renderscriptCompile RenderscriptCompile 編譯 Renderscript 文件的 task
mergeResources MergeResources 合並資源文件的 task
mergeAssets MergeAssets 合並 assets 的 task
processResources ProcessAndroidResources 處理並編譯資源文件的 task
generateBuildConfig GenerateBuildConfig 生成 BuildConfig 類的 task
javaCompile JavaCompile 編譯 Java 源代碼的 task
processJavaResources Copy 處理 Java 資源的 task
assemble DefaultTask Variant 的標志性 assemble task

ApplicationVariant 類還有以下附加屬性:

+

 

屬性名 屬性類型 說明
buildType BuildType Variant 的 BuildType
productFlavors List<ProductFlavor> Variant 的 ProductFlavor,一般不為空但允許為空
mergedFlavor ProductFlavor android.defaultConfig 和 variant.productFlavors 的組合
signingConfig SigningConfig Variant 使用的 SigningConfig 對象
isSigningReady boolean 如果是 true 則表明該 Variant 已經具備了所有需要簽名的信息
testVariant BuildVariant 將會測試該 Variant 的 TestVariant
dex Dex 將代碼打包成 dex 的 task。如果該 Variant 是 Library,該值可為空
packageApplication PackageApplication 打包最終 APK 的 task。如果該 Variant 是 Library,該值可為空
zipAlign ZipAlign 對 APK 進行 zipalign 的 task。如果該 Variant 是 Library 或者 APK 不能被簽名時,該值可為空
install DefaultTask 負責安裝的 task,可為空
uninstall DefaultTask 負責卸載的 task

LibraryVariant 類還有以下附加屬性:

+

 

屬性名 屬性類型 說明
buildType BuildType Variant 的 BuildType
mergedFlavor ProductFlavor 只有 android.defaultConfig
testVariant BuildVariant 用於測試 Variant
packageLibrary Zip 用於打包 Library 項目的 AAR 文件。如果是 Library 項目,該值不能為空

TestVariant 類還有以下屬性:

+

 

屬性名 屬性類型 說明
buildType BuildType Variant 的 Build Type
productFlavors List<ProductFlavor> Variant 的 ProductFlavor。一般不為空但允許為空
mergedFlavor ProductFlavor android.defaultConfig 和 variant.productFlavors 的組合
signingConfig SigningConfig Variant 使用的 SigningConfig 對象
isSigningReady boolean 如果是 true 則表明該 Variant 已經具備了所有需要簽名的信息
testedVariant BaseVariant TestVariant 測試的 BaseVariant
dex Dex 將代碼打包成 dex 的 task。如果該 Variant 是 Library,該值可為空
packageApplication PackageApplication 打包最終 APK 的 task。如果該 Variant 是 Library,該值可為空
zipAlign ZipAlign 對 APK 進行 zipalign 的 task。如果該 Variant 是 Library 或者 APK 不能被簽名時,該值可為空
install DefaultTask 負責安裝的 task,可為空
uninstall DefaultTask 負責卸載的 task
connectedAndroidTest DefaultTask 在連接設備上執行 Android 測試的 task
providerAndroidTest DefaultTask 使用擴展 API 執行 Android 測試的 task

Android task 特有類型的 API:

+

 

  • ProcessManifest
    • File manifestOutputFile
  • AidlCompile
    • File sourceOutputDir
  • RenderscriptCompile
    • File sourceOutputDir
    • File resOutputDir
  • MergeResources
    • File outputDir
  • MergeAssets
    • File outputDir
  • ProcessAndroidResources
    • File manifestFile
    • File resDir
    • File assetsDir
    • File sourceOutputDir
    • File textSymbolOutputDir
    • File packageOutputFile
    • File proguardOutputFile
  • GenerateBuildConfig
    • File sourceOutputDir
  • Dex
    • File outputFolder
  • PackageApplication
    • File resourceFile
    • File dexFile
    • File javaResourceDir
    • File jniDir
    • File outputFile
      • 直接在 Variant 對象中使用 “outputFile” 可以改變最終的輸出文件夾。
  • ZipAlign
    • File inputFile
    • File outputFile
      • 直接在 Variant 對象中使用 “outputFile” 可以改變最終的輸出文件夾。

每個 task 類型的 API 都受 Gradle 的工作方式和 Android plugin 的配置方式限制。
首先,Gradle 中存在的 task 只能配置輸入輸出的路徑以及部分可能使用的可選標識。因此,這些 task 只能定義一些輸入或者輸出。

+

 

其次,這里面大多數 task 的輸入都不是單一的,一般都混合了 sourceSetBuild Type 和 Product Flavor 中的值。所以為了保持構建文件的簡潔和可讀性,目標自然是讓開發者通過 DSL 修改這些對象來影響構建的過程,而不是深入修改輸入和 task 的選項。

+

 

另外需要注意,上面的 task 中除了 ZipAlign,其它都要求設置私有數據進行工作。這意味着不能手動創建這些類型的 task 實例。

+

 

這些 API 也可能會被修改。一般來說,目前的 API 是圍繞着 task 的輸出和輸入(如果可能)來添加額外的處理(必要時)。歡迎反饋意見,特別是那些沒有考慮過的需求。

+

 

對於 Gradle 的 task(DefaultTask,JavaCompile,Copy,Zip),請參考 Gradle 文檔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM