構(gòu)建配置文件

參考鏈接:google官方文檔

創(chuàng)建自定義構(gòu)建配置需要您對一個或多個構(gòu)建配置文件(或build.gradle文件)進(jìn)行更改。這些純文本文件使用域特定語言(DSL)以Groovy語言描述和操作構(gòu)建邏輯,后者是一種適用于Java虛擬機的動態(tài)語言。您無需了解Groovy便可開始配置構(gòu)建,因為Android Plugin for Gradle引入了您需要的大多數(shù)DSL元素。

有幾個Gradle構(gòu)建配置文件是Android應(yīng)用標(biāo)準(zhǔn)項目結(jié)構(gòu)的組成部分。您必須料及其中每一個文件的范圍和用途及其應(yīng)定義的基本DSL元素,才能著手配置構(gòu)建。

1_Gradle設(shè)置文件

settings.gradle文件位于項目根目錄,用于指示Gradle在構(gòu)建應(yīng)用時應(yīng)將哪些模塊包括在內(nèi)。對大多數(shù)項目而言,該文件很簡單,只包括以下內(nèi)容:

include ':app'

不過,多模塊項目需要制定應(yīng)包括在最終構(gòu)建之中的每個模塊。

2_頂級構(gòu)建文件

頂級build.gradle文件位于項目根目錄,用于定義適用于項目中所有模塊的構(gòu)建配置。默認(rèn)情況下,這個頂級構(gòu)建文件使用buildscriot()代碼塊來定義項目中所有模塊共用的Gradle存儲區(qū)和依賴項。

以下代碼示例描述的默認(rèn)設(shè)置和DSL元素可在新建項目后的頂級build.gradle文件中找到。

    /**
     * buildscript {}塊是您為Gradle本身配置存儲庫和依賴項的地方 - 這意味著,您不應(yīng)在此處包含模塊的依賴項。
     * 例如,此塊包含Gradle的Android插件作為依賴項,
     * 因為它提供了Gradle構(gòu)建Android應(yīng)用程序模塊所需的其他指令。
     */
    buildscript {
        /**
         * 存儲庫{}塊配置Gradle用于搜索或下載依賴項的存儲庫。
         * Gradle預(yù)配置對JCenter,Maven Central和Ivy等遠(yuǎn)程存儲庫的支持。
         * 您還可以使用本地存儲庫或定義自己的遠(yuǎn)程存儲庫。
         * 下面的代碼將JCenter定義為Gradle應(yīng)該用來查找其依賴項的存儲庫。
         */
        repositories {
            google()
            jcenter()
        }
    
        /**
         * dependencies {}塊配置Gradle需要用于構(gòu)建項目的依賴項。
         * 以下行將Gradle版本3.1.2的Android插件添加為類路徑依賴項。
         */
        dependencies {
            classpath 'com.android.tools.build:gradle:3.1.2'
            classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    /**
     * allprojects {}塊是您配置項目中所有模塊使用的存儲庫和依賴項的位置,例如第三方插件或庫。
     * 應(yīng)在模塊級build.gradle文件中配置項目中所有模塊不需要的依賴項。
     * 對于新項目,Android Studio將JCenter配置為默認(rèn)存儲庫,但它不配置任何依賴項。
     */
    allprojects {
        repositories {
            google()
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }

3_模塊級構(gòu)建文件

模塊級 build.gradle 文件位于每個 <project>/<module>/ 目錄,用于配置適用于其所在模塊的構(gòu)建設(shè)置。我們可以通過配置這些構(gòu)建設(shè)置來提供自定義打包選項,以及替換main/應(yīng)用清單或頂級build.gradle文件中的設(shè)置。

以下這個示例 Android 應(yīng)用模塊 build.gradle 文件概述了您應(yīng)該了解的部分基本 DSL 元素和設(shè)置。

    /**
     * 構(gòu)建配置中的第一行將Gradle的Android插件應(yīng)用于此構(gòu)建,并使android {}塊可用于指定特定于Android的構(gòu)建選項。
     */
    apply plugin: 'com.android.application'
    
    /**
     * android {}塊是您配置所有Android特定構(gòu)建選項的地方。
     */
    android {
    
        /**
         * compileSdkVersion指定Gradle用于編譯應(yīng)用程序的Android API級別。
         * 這意味著您的應(yīng)用可以使用此API級別中包含的API功能。
         *
         * buildToolsVersion指定Gradle用于構(gòu)建應(yīng)用程序的SDK構(gòu)建工具,命令行實用程序和編譯器的版本。
         * 您需要使用SDK Manager下載構(gòu)建工具。
         * 在文件夾build-tools里面
         */
        compileSdkVersion 27
        buildToolsVersion '27.0.3'
    
        /**
         * defaultConfig {}塊封裝了所有構(gòu)建變體的默認(rèn)設(shè)置和條目,并且可以從構(gòu)建系統(tǒng)動態(tài)覆蓋main / AndroidManifest.xml中的某些屬性。
         * 您可以配置產(chǎn)品風(fēng)格以覆蓋應(yīng)用程序的不同版本的這些值。
         */
        defaultConfig {
            // applicationId唯一標(biāo)識要發(fā)布的包。 但是,您的源代碼仍應(yīng)引用main / AndroidManifest.xml文件中package屬性定義的包名稱。
            applicationId "com.example.app_network"
    
            // 定義運行應(yīng)用程序所需的最低API級別。
            minSdkVersion 21
    
            // 指定用于測試應(yīng)用程序的API級別。
            targetSdkVersion 27
    
            // 定義應(yīng)用的版本號。
            versionCode 1
    
            // 為您的應(yīng)用定義用戶友好的版本名稱。
            versionName "1.0"
    
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
        }
    
        /**
         * 您可以在buildTypes {}塊中配置多個構(gòu)建類型。
         * 默認(rèn)情況下,構(gòu)建系統(tǒng)定義了兩種構(gòu)建類型:debug和release。
         * 調(diào)試構(gòu)建類型未在默認(rèn)構(gòu)建配置中顯式顯示,但它包含調(diào)試工具并使用調(diào)試密鑰進(jìn)行簽名。
         * 發(fā)布版本類型應(yīng)用Proguard設(shè)置,默認(rèn)情況下不簽名。
         */
        buildTypes {
    
            debug {
    
            }
    
            // 默認(rèn)情況下,Android Studio使用minifyEnabled配置發(fā)布版本類型以啟用代碼收縮,并指定Proguard設(shè)置文件。
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
        /**
         * productFlavors {}塊是您可以配置多種產(chǎn)品風(fēng)格的地方。
         * 這允許您創(chuàng)建可以使用自己的設(shè)置覆蓋defaultConfig {}的應(yīng)用程序的不同版本。
         * 產(chǎn)品flavor是可選的,默認(rèn)情況下構(gòu)建系統(tǒng)不會創(chuàng)建它們。
         * 此示例創(chuàng)建免費且付費的產(chǎn)品風(fēng)格。
         * 然后,每種產(chǎn)品風(fēng)格都指定自己的應(yīng)用程序ID,以便它們可以同時存在于Google Play商店或Android設(shè)備上。
         */
        productFlavors {
            free {
                applicationId 'com.example.app-network.free'
            }
            paid {
                applicationId 'com.example.app-network.paid'
            }
        }
    
        /**
         * splits {}塊是您可以配置不同APK構(gòu)建的地方,每個APK構(gòu)建僅包含支持的屏幕密度或ABI的代碼和資源。
         * 您還需要配置構(gòu)建,以便每個APK具有不同的versionCode。
         */
        splits {
            // 屏幕密度分割設(shè)置
            density {
                // 啟用或禁用密度分割機制
                enable false
                // 從分裂中排除這些密度
                // exclude "ldpi","tvdpi","xxxhdpi","400dpi","560dpi"
            }
        }
    }
    
    /**
     * 模塊級構(gòu)建配置文件中的依賴項{}塊僅指定構(gòu)建模塊本身所需的依賴項。
     */
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    
        implementation 'com.android.support:appcompat-v7:27.1.1'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    }

4_Gradle屬性文件

Gradle 還包括兩個屬性文件,位于項目根目錄,可用于指定適用于Gradle 構(gòu)件工具包本身的設(shè)置:

  • gradle.properties 您可以在其中配置項目范圍Gradle設(shè)置,例如 Gradle 后臺進(jìn)程的最大堆大小。
  • local.properties 為構(gòu)建系統(tǒng)配置本地環(huán)境屬性,例如 SDK 安裝路徑。由于該文件的內(nèi)容由 Android Studio 自動生成并且專用于本地開發(fā)者環(huán)境,因此您不應(yīng)手動修改該文件,或?qū)⑵浼{入您的版本控制系統(tǒng)。

5_將項目與Gradle文件同步

當(dāng)您在項目中對構(gòu)建配置文件進(jìn)行更改時,Android Studio 會要求您同步項目文件,以便其導(dǎo)入您的構(gòu)建配置更改并執(zhí)行一些檢查來確保您的配置不會造成構(gòu)建錯誤。

要同步項目文件,您可以點擊做出更改后出現(xiàn)的通知欄中的 Sync Now,或者點擊菜單欄中的 Sync Project。如果 Android Studio 通知配置出現(xiàn)錯誤,例如:您的源代碼使用了只有在 compileSdkVersion 以上的 API 級別中才會提供的 API 功能,會顯示 Messages 窗口,具體描述該問題。

6_源集

Android Studio 按邏輯關(guān)系將每個模塊的源代碼和資源分組為源集。模塊的 main/ 源集包括其所有構(gòu)建變體共用的代碼和資源。其他源集目錄為可選項,在您配置新的構(gòu)建變體時,Android Studio 不會自動為您創(chuàng)建這些目錄。不過,創(chuàng)建類似于 main/ 的源集有助于讓 Gradle 只應(yīng)在構(gòu)建特定應(yīng)用版本時使用的文件和資源井然有序:

  • src/main/
    此源集包括所有構(gòu)建變體共用的代碼和資源。
  • src/<buildType>/
    創(chuàng)建此源集可加入特定構(gòu)建類型專用的代碼和資源。
  • src/<productFlavor>/
    創(chuàng)建此源集可加入特定產(chǎn)品風(fēng)味專用的代碼和資源。
  • src/<productFlavorBuildType>/
    創(chuàng)建此源集可加入特定構(gòu)建變體專用的代碼和資源。

例如,要生成應(yīng)用的“完整調(diào)試”版本,構(gòu)建系統(tǒng)需要合并來自以下源集的代碼、設(shè)置和資源:

  • src/fullDebug/(構(gòu)建變體源集)
  • src/debug/(構(gòu)建類型源集)
  • src/full/(產(chǎn)品風(fēng)味源集)
  • src/main/(主源集)

如果不同源集包含同一文件的不同版本,Gradle 將按以下優(yōu)先順序決定使用哪一個文件(左側(cè)源集替換右側(cè)源集的文件和設(shè)置):
構(gòu)建變體 > 構(gòu)建類型 > 產(chǎn)品風(fēng)味 > 主源集 > 庫依賴項
這樣一來,Gradle 便可使用專用于您試圖構(gòu)建的構(gòu)建變體的文件,同時對與其他應(yīng)用版本共用的 Activity、應(yīng)用邏輯和資源加以重復(fù)利用。在合并多個清單時,Gradle 使用同一優(yōu)先順序,這樣每個構(gòu)建變體都能在最終清單中定義不同的組件或權(quán)限。

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,881評論 25 709
  • 文章來源:Google 此頁面以配置構(gòu)建概覽為基礎(chǔ),向您介紹如何配置構(gòu)建變體,以便從同一個項目中創(chuàng)建應(yīng)用的不同版本...
    文文太遠(yuǎn)了閱讀 855評論 0 1
  • 文章來源:Google Android 構(gòu)建系統(tǒng)編譯應(yīng)用資源和源代碼,然后將它們打包成可供您測試、部署、簽署和分發(fā)...
    文文太遠(yuǎn)了閱讀 319評論 0 0
  • 文章摘要1、 Gradle 構(gòu)建流程2、自定義構(gòu)建配置3、構(gòu)建配置文件4、Gradle 設(shè)置文件5、頂級構(gòu)建文件6...
    Android那些事兒閱讀 1,397評論 0 51
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139

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