grade那些事

我的gradle配置參數


在gradle.properties中會配置這些參數
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx2048m

構建初始化的很多工作是關於java虛擬機的啓動,加載虛擬機環境,加載class文件等,如果這些動作交給一個d單獨的後臺進程去做,那麼,第一次初始化之後的修改代碼再構建是不是可以節省很多時間呢?答的,通過在gradle.properties加入這樣一句來開啓,如果想讓修改全局所有項目都生效,那麼修改這個文件~/.gradle/gradle.properties
org.gradle.daemon=true
項目開發過程中,難免需要用到三方庫,這就形成了項目之間的依賴關係,GRADLE提供了多種集成三方庫的方式,提供了很方便的項目依賴管理,本地庫,庫工程,maven庫全支持。既然用到庫,就會遇到庫版本的問題和升級問題,其中maven庫的依賴管理支持一種動態版本的方式,也就是說,GRADLE可以做到不依賴具體某個版本的庫,而是每次從repo拉取最新的庫到本地做編譯。具體使用是這樣的:

拿gson庫舉例,如果依賴2.2.1這個版本,可以在build.gradle文件裏這樣寫

dependencies {
compile ‘com.google.code.gson:gson:2.2.1’
}
如果不想依賴具體的庫,想每次從maven repo中拉取最新的庫,那麼,可以寫成這樣:

dependencies {
compile ‘com.google.code.gson:gson:2.2.+’
}
也可以寫成這樣

dependencies {
compile ‘com.google.code.gson:gson:2.+’
}
甚至可以這樣

dependencies {
compile ‘com.google.code.gson:gson:+’
}

其中含義相信不用我解釋,大家也看得明白吧。
用”+”來通配一個版本族,這樣有個好處是maven上有新庫了,不用你操心升級,GRADLE編譯的時候自動升級了,但是帶來了兩個壞處,一是,有可能新版庫的接口改了,導致編譯失敗,這個時候需要修改代碼做升級適配;更大的壞處是,每次GRADLE編譯完整的項目,都會去maven上試圖拉取最新的庫,這樣,拖慢了編譯速度,尤其在網絡非常差的時候,所以,爲了構建速度,建議寫死依賴庫的版本號。

有一個很通俗的道理是,發展的東西會越來越好,最新版的GRADLE和JDK往往是性能最好,運行最流暢最快的,所以,升級吧,JDK的升級這裏不說了,具體看Oracle的官方文檔。這裏說說GRADLE的版本升級,GRALDE採用了一種叫做wrapper的方式,可以做到每個項目獨立使用其自己的GRADLE版本,這樣做的好處不言而喻,每個項目的構建環境獨立,互不影響。但爲什麼會出現這個東西,我的猜想是因爲GRADLE發展太快,新舊版本之間很難兼容。如果你有多個項目都採用GRADLE構建,假設都用同一個全局的GRADLE,那麼當這個GRADLE升級後,所有的項目可能都會編譯失敗,你得一個一個改配置,那麼,下次再升級,同樣的流程的再走一遍,是不是很煩。採用wrapper的方式很好的解決了這個問題,每個項目採用獨立的GRADLE版本,互不影響,如果你只想升級其中一個,你改這一個項目的GRADLE wrapper就好了。在你的項目目錄下找到這個文件gradle/wrapper/gradle-wrapper.properties並修改distributionUrl=https://services.gradle.org/distributions/gradle-2.11-all.zip到你想升級的版本就可以了。

將你的項目拆分成多個子項目並開啓並行構建也是一個不錯的主意,比如將相對獨立的模塊拆分成獨立的庫工程(Library projects),主工程(Application project)依賴這些庫工程,這樣的話,開啓並行構建纔會發揮作用。並行構建開啓方式是修改文件gradle.properties,加入如下行:
org.gradle.parallel=true.

如果編程過程中採用了新版JDK(比如1.7)才支持的特性(比如new HashMap<>這樣的寫法),而編譯的時候默認是舊版的JDK(比如1.6),這個時候編譯會報錯,採用如下方式可以指定用哪個版本的編譯器編譯,前提是JAVA_HOME指定的JDK是大於等於新版JDK的哦,其他和java編譯器相關的也可以在這裏配置
如果不想全局生效,可以將tasks.withType(JavaCompile)放入某個子項目中。
android {

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

762550.png

也可以在頂層build.gradle腳本中定義一些全局變量,提供給子腳本引用,其實在德邦快遞的項目中我們使用的就是這個方式,但是其實在很多網上我也看到有的這些變量是配置在gradle.properties配置信息中。這樣作爲一個全局的域給整個項目使用。
624518.png
然後給子腳本引用,
578415.png

compileSdkVersion rootProject.ext.deppon_compileSdkVersion
buildToolsVersion rootProject.ext.deppon_buildToolsVersion
也可以寫成:
compileSdkVersion deppon_compileSdkVersion
buildToolsVersion deppon_buildToolsVersion

有時候引用第三方的庫會帶有一些配置文件(.txt,license)的信息,打包的時候想要去掉這些信息於是我們要添加這些
packagingOptions {
exclude ‘META-INF/DEPENDENCIES.txt’
exclude ‘META-INF/LICENSE.txt’
exclude ‘META-INF/NOTICE.txt’
exclude ‘META-INF/NOTICE’
exclude ‘META-INF/LICENSE’
exclude ‘META-INF/DEPENDENCIES’
exclude ‘META-INF/notice.txt’
exclude ‘META-INF/license.txt’
exclude ‘META-INF/dependencies.txt’
exclude ‘META-INF/LGPL2.1’
exclude ‘META-INF/ASL2.0’
}

208834.png

在公司這個項目中還會有這個配置
lintOptions {
disable ‘InvalidPackage’,’TypographyFractions’,’TypographyQuotes’
checkReleaseBuilds false //設置在release版本的時候也關閉錯誤
abortOnError false //設置是否在lint發生錯誤時終止構建爲false
}
149579.png

Lint默認選項會對項目中的代碼進行嚴格的檢查,假如出現包錯誤會終止構建過程,可以通過這個配置關閉這個選項,不過最好關注下Lint輸出,有問題就及時處理,避免潛在問題。

配置簽名信息,簽名信息屬於敏感的信息,儘量最好不要寫在gradle中,而是寫在一個單獨的配置文件中,這樣配置文件不用同步到版本控制工具中,而是又本地維護,爲了防止版本控制平臺泄漏信息,建議把簽名信息寫到gradle.properties或者local.properties文件中維護,這樣grale中的腳本信息從本地這些配置信息中引用即可,如果放在一個自定義的文件中,gradle需要提供相應的代碼來讀取文件中的簽名信息,文件內容無非:
RELEASE_KEY_PASSWORD=android
RELEASE_KEY_ALIAS=androidreleasekey
RELEASE_STORE_PASSWORD=android
RELEASE_STORE_FILE=../resources/release.keystore
DEBUG_KEY_PASSWORD=android
DEBUG_KEY_ALIAS=androiddebugkey
DEBUG_STORE_PASSWORD=android
DEBUG_STORE_FILE=../resources/debug.keystore
gradle腳本信息
gradle腳本引用代碼參考
android {
signingConfigs {
debug {
storeFile file(DEBUG_STORE_FILE)
storePassword DEBUG_STORE_PASSWORD
keyAlias DEBUG_KEY_ALIAS
keyPassword DEBUG_KEY_PASSWORD
}

    release {
        storeFile file(RELEASE_STORE_FILE)
        storePassword RELEASE_STORE_PASSWORD
        keyAlias RELEASE_KEY_ALIAS
        keyPassword RELEASE_KEY_PASSWORD
    }
}

}
如果我們的簽名信息沒有放到到gradle.properties或者local.properties文件中維護
而是寫在自定義的文件中,假設簽名信息寫到了signing.properties文件中,文件內容可以參考上面寫的,讀取文件代碼放倒gradle腳本中既可以了,參考代碼如下
def File propFile = new File(‘signing.properties’)
if (propFile.canRead()) {
def Properties props = new Properties()
props.load(new FileInputStream(propFile))

if (props != null && props.containsKey('RELEASE_STORE_FILE') && props.containsKey('RELEASE_STORE_PASSWORD') &&
        props.containsKey('RELEASE_KEY_ALIAS') && props.containsKey('RELEASE_KEY_PASSWORD')) {

    android.signingConfigs.release.storeFile = file(props['RELEASE_STORE_FILE'])
    android.signingConfigs.release.storePassword = props['RELEASE_STORE_PASSWORD']
    android.signingConfigs.release.keyAlias = props['RELEASE_KEY_ALIAS']
    android.signingConfigs.release.keyPassword = props['RELEASE_KEY_PASSWORD']
    println 'all good to go'
} else {
    android.buildTypes.release.signingConfig = null
    println 'signing.properties found but some entries are missing'
}

} else {
println ‘signing.properties not found’
android.buildTypes.release.signingConfig = null
}
但是在我們德邦的項目中在隱私方面並沒有做的那麼全面直接寫到gradle腳本中,
//配置簽名信息
signingConfigs {
debug {
keyAlias ‘DEBUG’
keyPassword ‘123456’
storeFile file(‘../keystore/debug/debug.jks’)
storePassword ‘123456’
}
release {
storeFile file(‘../keystore/release/yuLocal.jks’)
storePassword “deppon”
keyAlias “ent”
keyPassword “www.deppon.com”
}
}

但是這裏還有個得特別注意的是下面的構建類型和產品種類需要用到上面的簽名信息,所有簽名信息的定義得放到引用它的對象之前,否則會報找不到簽名信息。gradle的語法都是先定義後引用的。

如何設置第三方的maven倉庫地址
模版代碼是這樣:
allprojects {
repositories {
maven {
url ‘url’
name ‘maven name’
credentials {
username = ‘username’
password = ‘password’
}
}
}
}
但是這個name和credentials是可選項。視具體情況而定,譬如我們項目中的項目就沒有定義後兩個

gradle腳本的分拆與引用,
如果gradle腳本太大我們可以根據功能給它分拆成幾個子腳本,然後引入到主腳本中
apply from:”../resource/config.gradle”
這個在我們公司項目中沒有用到,你們可以以後用。

設置支持語言:
利用這個可以去掉,第三方庫中的無用語言,
android {
defaultConfig {
resConfigs “zh”
}
}

刪除無用的apk中間產物
android.libraryVariants.all { variant ->
variant.outputs.each { output ->
if (output.zipAlign != null) {
output.zipAlign.doLast {
output.zipAlign.inputFile.delete()
}
}
}
}

AndroidManifest佔位符,BuildConfig以及資源配置

根據版本類型和構建變種定義不同的變量值供程序引用
manifestPlaceholders = [APP_KEY:”release”]
buildConfigField “String”, “EMAIL”, “\”[email protected]\””
resValue “string”, “content_main”, “Hello world from release!”
buildConfigField支持Java中基本數據類型,如果是字符串,記得加轉義後的雙引號 resValue支持res/values下的資源定義,字符串無需加轉義後的雙引號

manifestPlaceholders = [
DB_MD5_VALUE : deppon_db_business_md5,
DATABASE_DB_MD5_VALUE : deppon_db_database_md5,
ROOT_DIR_VALUE: “deppon_ecs”,
APPLICATION_ID_VALUE : defaultConfig.applicationId,
SERVER_BUILD_VALUE : server_build,
APP_PROPERTIES_MD5_VALUE : deppon_app_properties_md5
]
跳轉到這裏:

發佈了35 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章