Gradle(補充Android插件配置)

Gradle定義:Gradle是以Groovy語言爲基礎,面向Java應用爲主,基於DSL(領域特定語言)語法的自動化構建工具

Gradle構建流程(生命週期):初始化(加載settings腳本,創建Project對象,建立projects層級結構)、配置(根據gradle腳本配置各個Project,並生成TaskGraph),配置結束後,會調用Project的afterEvaluate方法、執行(根據Gradle命令執行Task)

Gradle依賴管理:聲明依賴有三種方式:compile Maven庫的地址、compile files、compile本地工程,依賴管理還涉及資源、清單條目、ProGuard 排除規則和自定義 Lint 規則等的合併

// rootModule
buildscript {
    repositories {
        maven {
            url 'http://maven.byted.org/repository/android_public/'
        }
        maven {
            url "http://maven.byted.org/nexus/content/repositories/ttplayer/"
        }
    }
    dependencies {
        classpath 'com.squareup.wire:wire-compiler:3.1.0-ec.5-SNAPSHOT'
        classpath "com.edu.classroom:pb-process-plugin:0.3.0-alpha.3"
        // 此處不能配置project依賴
    }
}

allprojects {
    repositories {
        maven {
            url 'http://maven.byted.org/repository/android_public/'
        }
    }
}

// subModule
dependencies {
    api project(':classroom:base')
    implementation project(':classroom:courseware-api')
    kapt STRING_TYPE_ADAPTER_AP
}

Gradle依賴類型:implementation、api、compileOnly、runtimeOnly

傳遞依賴:可以採用指定 transitive = false 的方式來關閉依賴傳遞特性

排除依賴:可以採用exclude的方式來排除指定的引用

Gradle構建變體:BuildVariant(productFlavor、BuildType)

productFlavors {

    branchOne {

        applicationId "com.example.branchOne"

        buildConfigField "String", "CONFIG_ENDPOINT", "http://branchOne.com/android"

    }

    branchTwo {

        applicationId "com.example.branchTwo"

        buildConfigField "String", "CONFIG_ENDPOINT", "http://branchTwo.org"

    }

}

你可以在代碼中使用它們:BuildConfig.FIELD_NAME(上面的的例子就是BuildConfig.CONFIG_ENDPOINT)

一個有用的技巧:你可以單獨只爲某一個variants添加一些依賴,只需要在Compile加上對應的variant名字前綴就可以了

dependencies {

    compile 'com.android.support:support-v4:22.2.0'

    branchOneCompile 'com.android.support:appcompat-v7:22.2.0'//只爲branchOne添加這個依賴

}

和productFlavors類似,還有buildTypes(debug和release是默認的),它們都也可以爲你的應用程序生成variants,合併一起形成buildVariant,brancheOne和debug會生成branchOneDebug

差別在於改變buildType不會改變應用程序的代碼,它們只是處理的東西不同,你可以通過buildType來獲取更多的技術細節(例如:build optimization,log level等),但是app的內容不會改變,相反的,使用productFlavor配置可以改變app的內容(ps:內容可以設想成package理解,buildType沒法改applicationId)

配置階段:可以定義Task任務(默認繼承Default Task),定義並執行Gradle插件,通過ext關鍵字定義Property,聲明Extension

基本語法:Groovy語句可以不用分號結尾,Groovy中支持動態類型,即定義變量的時候可以不指定其類型,groovy最後一行代碼的執行結果就是本函數的返回值,Groovy對字符串支持相當強大,單引號''中的內容嚴格對應Java中的String,雙引號""的內容則和腳本語言的處理有點像,如果字符中有$號的話,則它會$表達式先求值,三個引號'''xxx'''中的字符串支持隨意換行,Groovy中函數調用的時候可以不加括號,Groovy是無類型的Java,閉包,bean概念(getter、setter),delegate機制(可以設置閉包執行的對象),Task增量構建

// TODO 熟悉Android插件各種配置

Gradle自定義Task:繼承DefaultTask,執行函數需要通過TaskAction標註

Gradle自定義Plugin:在src/main/groovy中實現Plugin接口,在目錄plugin/src/main/resources/META-INF/gradle-plugins/下創建properties文件用來指定插件實現類。在apply方法裏,我們可以通過project.extensions.create和project.tasks.create創建extension和task

Gradle創建Task的幾種方式:通過Project的task方法、通過TaskContainer的create方法

Android構建流程:aapt生成arsc文件和R文件、aidl文件生成對應的Java文件、Javac編譯、Annotation Processor處理、Dex生成、打包apk、jarSign、ZipAlign

productFlavors:風味維度:風味類型;

buildTypes:構建類型

風味類型 + 構建類型 = 構建變體

https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration?

應用和庫之前的關係:對於應用中存在,庫中不存在的風味類型和構建類型,使用matchingFallbacks來指定替代的類型(順序排列);對於應用中沒有,庫中存在的風味維度,使用missingDimensionStrategy來指定默認的類型(順序排列)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章