天天看點

Android Gradle Plugin指南(六)——進階建構定制7、 Advanced Build Customization(進階建構定制)

原文位址: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或者更高的版本)。

繼續閱讀