原文位址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Advanced-Build-Customization
7、 Advanced Build Customization(進階建構定制)
7.1 Build options(建構選項)
7.1.1 Java Compilation options(Java編譯選項)
android {
compileOptions {
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
}
}
預設值是“1.6”。這個設定将影響所有task編譯Java源代碼。
7.1.2 aapt options(aapt選項)
android {
aaptOptions {
noCompress 'foo', 'bar'
ignoreAssetsPattern "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"
}
}
這将影響所有使用aapt的task。
7.1.3 dex options(dex選項)
android {
dexOptions {
incremental false
preDexLibraries = false
jumboMode = false
}
}
這将應用所有使用dex的task。
7.2 Manipulation tasks(操作task)
基礎Java項目有一組有限的task用于互相處理生成一個輸出。
classes是一個編譯Java源代碼的task。可以在build.gradle檔案中通過腳本很容易使用classes。這是project.tasks.classes的縮寫。
在Android項目中,相比之下這就有點複雜。因為Android項目中會有大量相同的task,并且它們的名字基于Build Types和Product Flavor生成。
為了解決這個問題,android對象有兩個屬性:
* applicationVariants(隻适用于app plugin)
* libraryVariants(隻适用于library plugin)
* testVariants(兩個plugin都适用)
這三個都會分别傳回一個ApplicationVariant、LibraryVariant和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 | 混合asset的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是個庫,這個值可以為空。 |
packageApplication | PackageApplication | 打包最終APK的task。如果這個Variant是個庫,這個值可以為空。 |
zipAlign | ZipAlign | zip壓縮APK的task。如果這個Variant是個庫或者APK不能被簽名,這個值可以為空。 |
install | DefaultTask | 負責安裝的task,不能為空。 |
uninstall | DefaultTask | 負責解除安裝的task。 |
LibraryVariant類還有以下附加屬性:
屬性名 | 屬性類型 | 說明 |
buildType | BuildType | Variant的BuildType. |
mergedFlavor | ProductFlavor | The defaultConfig values |
testVariant | BuildVariant | 用于測試這個Variant。 |
packageLibrary | Zip | 用于打包庫項目的AAR檔案。如果是個庫項目,這個值不能為空。 |
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是個庫,這個值可以為空。 |
packageApplication | PackageApplication | 打包最終APK的task。如果這個Variant是個庫,這個值可以為空。 |
zipAlign | ZipAlign | zip壓縮APK的task。如果這個Variant是個庫或者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的輸入都不是單一的,一般都混合了sourceSet、Build Type和Product Flavor中的值。為了保持建構檔案的簡單和可讀性,目标是要讓開發者通過DSL語言修改這些對象來配飾建構的過程,而不是深入修改輸入和task的選項。
另外需要注意,除了ZipAlign這個task類型,其它所有類型都要求設定私有資料來讓它們運作。這意味着不可能自動建立這些類型的新task執行個體。
這些API也可能會被更改。一般來說,目前的API是圍繞着給定task的輸入和輸出入口來添加額外的處理(如果需要的時候)。歡迎回報意見,特别是那些沒有預見過的需求。
對于Gradle的task(DefaultTask,JavaCompile,Copy,Zip),請參考Gradle文檔。
7.3 BuildType and Product Flavor property reference(BuildType和Product Flavor屬性參考)
coming soon。。。。= =
對于Gradle的task(DefaultTask,JavaCompile,Copy,Zip),請參考Gradle文檔。
7.4 Using sourceCompatibility 1.7(使用(JDK)1.7版本的sourceCompatibility)
使用Android KitKat(19版本的buildTools)就可以使用diamond operator,multi-catch,switch中使用字元串,try with resource等等(譯注:都是JDK7的一些新特性,詳情請參考JDK7文檔)。設定使用1.7版本,需要修改你的建構檔案:
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 19
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
注意:你可以将minSdkVersion的值設定為19之前的版本,隻是你隻能使用除了try with resources之外的其它新語言特性。如果你想要使用try with resources特性,你就需要把minSdkVersion也設定為19。
你同樣也需要确認Gradle使用1.7或者更高版本的JDK(Android Gradle plugin也需要0.6.1或者更高的版本)。