Gradle for Android應用

概述

我們都已經知道Gradle是基於JVM的一種構建工具。它是基於Groovy語言的聲明式構建,還支持java,C,C++等項目。我們在進行Android開發時,需要在Android Studio中對build.gradle文件進行配置。但是AS與Gradle並沒有直接的關係,這只是Google在AS中選擇了Gradle作爲項目的構建工具,爲了Gradle能在AS上應用,Google實現了AS上支持Gradle的插件,叫做Andorid Gradle Plugin。因爲AS應用了這個插件,所以能夠支持Gradle構建項目。我們可以在項目根目錄下的build.gradle文件中,看到:
classpath ‘com.android.tools.build:gradle:2.2.2’
這就是依賴gradle插件的代碼,後面的版本號代表的是android gradle plugin的版本,並不是Gradle的版本,與Gradle官方沒有關係。

Gradle 文件

一個項目中,會有一個setting.gradle,根目錄有build.gradle文件,每個Module都有自己的一個build.gradle文件。
setting.gradle:這個文件定義了哪些module應該被加入編譯過程,對於單個module的項目可以不用這個文件,但是對於multimodule的項目我們就需要這個文件,否則gradle不知道加載哪些項目,該文件的代碼在初始化階段就會被執行。
根目錄的build.gradle:根目錄的build.gradle文件配置最終會被應用到所有項目中。典型配置如下:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

● buildscript :定義了Android編譯工具的類路徑,repositories 中,jcenter是一個著名的Maven倉庫。
● allprojects:定義的屬性會被應用到所有moudle中,但是爲了保證每個項目的獨立性,我們一般不需要修改。
● 每個module中的build.gradle:針對每個moudle的配置。

下面針對module中build.gradle文件配置信息說明

apply plugin:聲明瞭項目的類型,這裏只Android。

android:設置編譯Andorid項目的參數,接下來,構建的android項目的所有配置都在這裏完成。
● defaultConfig:程序的默認配置,如果在AndroidMainfest.xml裏面定義了與這裏相同的屬性,會以這裏的爲主。
applicationId:我們曾經在AndroidMainfest.xml中,定義的包名有兩個用途:一個是作爲程序唯一識別的ID,防止在同一個手機裝兩個一樣的程序;另一個就是作爲R資源類的包名。以前修改這個包名,會導致所有引用R資源類的地方都要修改。但是現在我們修改applicationId屬性只會修改當前程序的ID,而不會修改源碼中資源的引用。
resConfig:針對app的本地化開發進行資源過濾,當工程依賴v7和Google服務時,非常有效。
resConfigs “zh”,”en” //定義包含的語言資源
resConfigs “mdpi”, “hdpi” //定義包含的尺寸資源

● lintOptions:配置lint檢查,一般設置:abortOnError false
● sourceSets:配置本地.so庫,如下:

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']  //jniLibs 表示.so存放的目錄
        }
    }

● signingConfigs:配置簽名信息。
● buildTypes:定義了編譯類型,針對每個類型我們可以有不同的編譯配置,不同的配置對應有不同的編譯命令。默認有debug,release的類型。可以在不同類型中,設置各自的配置要求,如下。
applicationIdSuffix:與applicationId相關,給applicationId添加後綴,用來配置不同的程序 ID,使得在同一部設備中可以安裝多個相同的應用。

versionNameSuffix:與上同理,給versionName添加後綴,定義不同的版本名稱。獲得當 前渠道版本的的名稱,通過variant.getVersionName()。

buildConfigField:根據編譯版本的不同,動態的控制代碼的處理邏輯。設置後會在BuildConfig類中,動態生成對應的屬性值。如下:

buildTypes {
        debug {
            buildConfigField("String","UPDATE_URL","\"http://****/\"")
            ...
        }
        release {
            buildConfigField("String","UPDATE_URL","\"https://****/\"")
            ...
        }
        }

manifestPlaceholders:我們可以在AndroidManifest中定義一個變量,在build.gradle中動 態的替換掉。例如,動態替換友盟的appkey。
首先在AndroidManifest中定義一個變量:

<meta-data
                android:name="UMENG_APPKEY"
                android:value="${umeng_app_key}"/>

然後,在build.gradle文件中根據不同的環境,生成不同的appkey的apk。

buildTypes {
        debug {
         manifestPlaceholders = [umeng_app_key: "你替代的內容"]
        }
        release {
       manifestPlaceholders = [umeng_app_key: "你替代的內容"]
        }
        develop {
       manifestPlaceholders = [umeng_app_key: "你替代的內容"]
        }
       }

替換多個變量的方法:
AndroidManifest中:

<meta-data
            android:name="UMENG_APPKEY"
            android:value="${umeng_app_key}"/>
<meta-data
            android:name="UMENG_SECRET"
            android:value="${umeng_app_secret}"/>

build.gradle文件中:

buildTypes {
        debug {
        manifestPlaceholders = [umeng_app_key: "XXX",umeng_app_secret:"XXX"]
        }
        ...
 }

● defaultPublishConfig: 通過它可以配置項目在構建時,編譯的版本類性,默認是“release”,當在module B 中build文件上配置defaultPublishConfig “debug”時,在發A的release版本時,b的版本仍爲debug版本,這點需要注意。
● publishNonDefault:相對於上面defaultPublishConfig,它可以根據編譯的版本類型來選擇編譯版本。如在module B中配置publishNonDefault true,表示b的版本根據module A的編譯類型來選擇打包版本。

dependencies:定義了項目的依賴庫,我們在引用庫的時候,每個庫名稱包含三個元素:組名:庫名稱:版本號,如下:

dependencies {
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.jakewharton:butterknife:8.1.0'
}

還可以引用本地的jar包,如下:

dependencies {
    //單文件依賴
    compile files('libs/umeng-analytics-v6.0.1.jar')
    //某個文件夾下面全部依賴
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //依賴某個項目
    compile project(path: ':pickerview')
    //依賴某個項目對應的版本
    releaseCompile project(path:':repository',configuration:'release')
    debugCompile project(path:':repository',configuration:'debug')
}

六種依賴類型:
Compile
compile是對所有的build type以及favlors都會參與編譯並且打包到最終的apk文件中。
Provided
Provided是對所有的build type 以及favlors只在編譯時使用,類似eclipse中的external-libs,只參與編譯,不打包到最終的apk。
APK
只會打包到apk文件中,而不參與編譯,所以不能在代碼中直接調用jar中的類或方法,否則在編譯時會報錯。
Test compile
Test compile 僅僅是針對單元測試代碼的編譯以及最終打包測試apk時有效,而對正常的debug或者release apk 包不起作用。
Debug compile
Debug complie 僅僅針對debug模式的編譯和最終的debug apk 打包
Release compile
Release compile 僅僅針對Release 模式的編譯和最終的Release apk打包。

Gradle Wrapper
Gradle不斷的在發展,新的版本難免會出現對以前的項目兼容性的問題,爲了避免安裝所有的版本gradle,於是推出了Gradle Wrapper。gradlw wrapper包含一些腳本文件和針對不同系統下面的運行文件。wrapper有版本區分,但是並不需要你手動下載,當你運行腳本的時候,如果本地沒有會自動下載對應版本文件。通過它每個項目你可以支持不同的Gradle版本來構建項目。我們可以在終端中測試版本好,首先切換到項目所在的目錄,然後輸入gradlew -v,就可以查看當前項目所用的gradle版本,如果是第一次執行該命令,會去下載對應的版本。
關於gradlew 的幾個命令:
● ./gradlew -v 版本號
● ./gradlew clean 清除所有的編譯輸出文件,比如apk。
● ./gradlew build 檢查依賴並編譯打包,這裏注意的是 ./gradlew build 命令把 debug、release 環境的包都打出來。
● ./gradlew assembleDebug 編譯並打Debug包
● ./gradlew assembleRelease 編譯並打Release的包
以上命令都是在終端裏執行,並且必須要切換到所在項目的根目錄下執行。

參考博客:http://www.flysnow.org/2015/03/30/manage-your-android-project-with-gradle.html

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