Android Gradle插件開發

Gradle

Gradle簡介

Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建開源工具,支持maven、 Ivy倉庫,支持傳遞性依賴管理,而不須要遠程倉庫或者是pom.xml和ivy.xml配置文件。 Gradle使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,目前也增長了基於Kotlin語言的kotlin-based DSL,拋棄了基於XML的各類繁瑣配置。html

當前,Gradle其支持的語言有Java、Kotlin、Groovy 和 Scala,將來將支持更多的語言。在平時Android開發中,Android項目就是使用Gradle來構建的,以下所示。java

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.xzh.gradleplugin"
        minSdkVersion 15
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}

複製代碼

同時,Android Studio也集成了Gradle的構建工具,例以下面是咱們項目構建的常見場景。 android

在這裏插入圖片描述

經常使用命令

命令 說明
-v, --version 查看當前 Gradle 版本信息
-h: 查看幫助信息
-s, --stacktrace / -S, --full-stacktrace 若是發生異常則輸出異常棧信息
-i, --info / -d, --debug 控制日誌級別
--stop 中止正在運行的 Daemon
-D, --system-prop / -P, --project-prop 傳入特定參數
-m, --dry-run / -x, --exclude-task 運行構建,但不執行任務的實際操做
--offline / --refresh-dependencies 離線模式構建,強制刷新依賴構建
b, --build-file / -c, --settings-file 指定 build 腳本,指定 settings 腳本
Ctrl + c 終止當前運行
./gradlew aFR > log.txt 2>&1 輸出全部內容到 log.txt

Gradle Wrapper

Gradle Wrapper的做用是簡化Gradle自己的安裝、部署。不一樣版本的項目可能須要不一樣版本的Gradle,手工部署的話比較麻煩,並且可能產生衝突,因此須要Gradle Wrapper幫你搞定這些事情。Gradle Wrapper是Gradle項目的一部分。bash

在Android應用開發中,咱們常常會看到以下一段代碼:服務器

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

複製代碼

它的做用就是爲了簡化Gradle的配置。具體能夠參考:完全搞懂Gradle、Gradle Wrapper與Android Plugin for Gradle的聯繫閉包

Gradle Task

在Android打包和apk構建時,常常會用到Gradle的Task命令,常見的有以下一些。併發

命令 說明
tasks [--all] 列出全部可運行的 task
help --task <task> 查看指定 task 的幫助信息
androidDependencies 查看當前 project 的 android 依賴樹
dependencies --configuration <config> 查看 configuration 的 依賴樹
clean 清除構建產出物
assemble, assemble{BuildVariant} 構建 apk,構建指定 Variant 的 apk
install 構建 apk 並安裝
uploadArchives 構建 aar 並上傳到指定依賴管理服務器

在一次Android項目構建過程當中,assembleRelease依賴了許多task,以下是一些比較關鍵的task。app

命令 說明
compileReleaseJavaWithJavac 編譯Java文件
mergeReleaseAssets 收集全部的assets
mergeReleaseResources 收集全部的resources
processReleaseManifest 生成最終的AndroidManif.xml文件
transformClassesAndResourcesWithPro guardForRelease 混淆
transformClassesWithDexForRelease 生成dex
packageRelease 打包生成apk

構建生命週期

根據Build phases 文檔Settings file 文檔能夠知道,Gradle 構建週期能夠分爲:初始化(Initialization)、配置(Configuration)和執行(Execution)。maven

  • 初始化(Initialization) Gradle能夠構建一個和多個項目。在初始化階段,Gradle會肯定哪些項目參與構建,而且爲這些項目建立一個Project實例。ide

  • 配置(Configuration) 在這個階段,會配置project對象。將執行構建的全部項目的構建腳本。也就是說,會執行每一個項目的build.gradle文件。

  • 執行(Execution) Gradle肯定要在執行期間建立和配置的任務子集。子集由傳遞給gradle命令和當前目錄的任務名稱參數肯定。 Gradle而後執行每一個選定的任務。

Android apk構建過程

大概分爲如下幾個步驟 一、使用aapt工具將res資源文件生成R.java文件 二、使用aidl工具將aidl文件生成對應java文件 三、使用javac命令編譯工程源代碼和上面兩步生成的文件,生成class文件 四、經過dex工具將class文件和第三方jar包打成dex文件 五、用aapt工具將res下的資源文件編譯成二進制文件,而後將其和上一步中的dex文件以及assets中的文件經過apkbuilder工具打包成apk文件 六、經過jarsigner對apk進行簽名 七、利用zipalign工具對apk進行字節對齊優化操做

能夠用下面的圖來描述Android apk的構建過程,以下所示。

在這裏插入圖片描述

Gradle 插件開發

建立Gradle插件

建立Gradle插件項目比較簡單,若是你是macOS,能夠先安裝gradle插件,安裝的命令以下:

brew install gradle
複製代碼

安裝完成以後,新建一個空的項目工程,而後在項目目錄下使用gradle init便可建立項目,建立時會讓你選擇不少的東西,以下圖。

在這裏插入圖片描述
等待工程構建完成,會發現示例項目爲咱們構建了一個示例代碼,以下所示:

public class GradlePlugin implements Plugin<Project> {
    public void apply(Project project) {
        // Register a task
        project.tasks.register("greeting") {
            doLast {
                println("Hello from plugin 'xzh.plugin.greeting'")
            }
        }
    }
}
複製代碼

該命令會向Gradle註冊GradlePlugin插件,代碼以下:

gradlePlugin {
    // Define the plugin
    plugins {
        greeting {
            id = 'xzh.plugin.greeting'
            implementationClass = 'xzh.plugin.GradlePlugin'
        }
    }
}
複製代碼

而後,在命令行中執行gradle copy命令,該命令對應的代碼爲:

task copy(type: Copy, group:"Custom", description:"task description") {
    from "src"
    into "dest"
}
複製代碼

上面的代碼做用是將src的文件拷貝到dest目錄。

開發插件併發布到本地

有時候,咱們須要開發一些Gradle插件,並將插件發佈到Maven或者Jcenter倉庫,給其餘人使用。此處爲了方便,咱們先發到本地,而後拉取時也拉取本地的插件。

假如咱們已經開發好了一個插件項目,如今想將它發佈到本地倉庫(遠端Maven倉庫),以下圖所示。

在這裏插入圖片描述
而後,咱們在插件的build.gradle文件中,新增以下上傳腳本:

apply plugin: 'maven'

uploadArchives{
    repositories.mavenDeployer{
        // 配置本地倉庫路徑,項目根目錄下的repository目錄中
        repository(url: uri('/Users/xiangzhihong/Maven/repository'))
        pom.groupId = "com.xzh.viewlib"// 惟一標識(一般爲模塊包名,也能夠任意)
        pom.artifactId = "OXViewLib" // 項目名稱(一般爲類庫模塊名稱,也能夠任意)
        pom.version = "1.0.0"      // 版本號
    }
}
複製代碼

配置完成後點擊【Sync Now】從新構建項目,而後在Gradle projects窗口會多出一個upload目錄,裏面就有一個名爲uploadArchives的task,這個uploadArchives就是將類庫發佈到倉庫的task。

在這裏插入圖片描述
而後,執行上面的Task便可,執行完後,會在對應的地址中生成repository目錄,目錄結構就是上面再build.gradle中的配置。repository目錄文件結構以下圖。

在這裏插入圖片描述
而後就能夠在Android項目中引入這個Gradle插件了。打開項目工程的build.gradle,而後在repositories閉包中添加以下本地地址(後期換成Maven地址)。

allprojects {
    repositories {
        google()
        jcenter()
        //本地Maven倉庫地址
        maven {
            url'/Users/xiangzhihong/Maven/repository'
        }
    }
}
複製代碼

而後,在app下build.script中添加依賴便可。

implementation 'com.xzh.viewlib:OXViewLib:1.0.0'
複製代碼

而後點擊【Sync Now】從新構建項目,接下來能夠在Android項目中使用Gradle插件的代碼了。固然,若是要發佈到遠端的Maven倉庫,還須要進行Maven倉庫的配置,不過流程都差很少。

相關文章
相關標籤/搜索