一直聽說Gradle神乎其神艺谆,但奈何才疏學淺無法領(lǐng)悟其精髓棵红。
昨天忙里偷閑扒了幾篇大神博客胀糜,有點想法總結(jié)一下祟昭。
心急的同學可以直接拉到最后一個大標題 ** 一些技巧 ** ヾ(≧O≦)〃嗷~
Gradle缕坎?
大概來說,這貨就是一個自動化構(gòu)建工具篡悟,跟ant差不多谜叹,如果沒有它的話,編譯android會是件很麻煩的事情恰力。
如果你用的是AS叉谜,那么他會幫你自動安裝,不用自己操心踩萎。
在使用AS建立 Android 項目的時候,會自動幫你生成Gradle文件很钓,簡單的項目其實可以忽略這東西的存在香府。
如圖1所示,Progect在Android視圖码倦,每次我們新建項目的時候企孩,會出現(xiàn)這三個Gradle文件,第一個是全局Gradle文件袁稽,一般不做修改勿璃,第三個是告訴編譯器需要編譯哪些模塊,一般在Module Setting里修改之后自動更改推汽。我們重點關(guān)注下第二個补疑,也就是我們自己模塊的Gradle文件。
ps:集成codetags的時候歹撒,官方文檔要求修改全局gradle文件莲组,我不知道這么做的必要性是什么。
幾個常見配置
如果整個項目就只有一個module暖夭,那么這個Gradle文件就是最重要的一個锹杈,他關(guān)系到我們整個app的編譯過程,以下是我們項目這個文件的大概樣子
// 使用插件 聲明是Android程序
apply plugin: 'com.android.application'
android {
// 編譯SDK的版本
compileSdkVersion 25
// build tools的版本
buildToolsVersion "24.0.3"
defaultConfig {
// 應(yīng)用包名
applicationId "com.zx.myapplication"
// 最小支持的sdk版本
minSdkVersion 23
// 目標sdk版本
targetSdkVersion 25
// 版本號
versionCode 1
// 版本名稱
versionName "1.0"
}
// 簽名信息
signingConfigs {
release {
storeFile file('D:/Java/test/test.jks')
storePassword "test"
keyAlias "test"
keyPassword "test"
}
debug {
}
}
buildTypes {
release {
// app名稱替換
manifestPlaceholders = [app_name:"@string/app_name"]
//構(gòu)建 release 使用 release簽名
signingConfig signingConfigs.release
// 是否進行混淆
minifyEnabled false
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// 自動判斷是測試環(huán)境還是生產(chǎn)環(huán)境
buildConfigField("boolean", "isRelease", "true")
}
debug {
// app名稱替換
manifestPlaceholders = [app_name:"@string/app_name_debug"]
//構(gòu)建 debug 使用 debug 簽名
signingConfig signingConfigs.debug
// 自動判斷是測試環(huán)境還是生產(chǎn)環(huán)境
buildConfigField("boolean", "isRelease", "false")
}
userdebug {
// app名稱替換
manifestPlaceholders = [app_name:"@string/app_name_userdebug"]
//構(gòu)建 userdebug 使用 release 簽名
signingConfig signingConfigs.release
// 保留debug信息
debuggable true
// 自動判斷是測試環(huán)境還是生產(chǎn)環(huán)境
buildConfigField("boolean", "isRelease", "false")
}
}
// 各種渠道迈着,可以做一些多渠道區(qū)分
productFlavors {
qihu {
}
tengxun {
}
}
// 移除lint檢查的error
lintOptions {
disable "ResourceType"
}
}
// 依賴信息
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.1.0'
testCompile 'junit:junit:4.12'
}
清單文件中被替換的部分長這個樣子
<application
...
android:label="${app_name}"
...
<activity
...
</activity>
<application
這是一個gradle文件的例子竭望,有詳細注釋。
當然咬清,gradle文件也可以通過圖二幾個選項快速更改。
但是需要強調(diào)的是 ** buildTypes ** 節(jié)點。
AS項目在新建之初枫振,在Gradle文件中喻圃,buildTypes節(jié)點下會默認生成一個release節(jié)點,方便用戶配置正式版本的編譯信息粪滤,此時debug雖然沒有寫出來斧拍,但它也是默認存在的,去圖三的位置可以看到存在兩個節(jié)點杖小。
在當前例子中可以注意到肆汹,我在buildTypes中配置了三個節(jié)點,release予权,debug昂勉,userdebug。這三個節(jié)點分別代表了不同的構(gòu)建版本扫腺,發(fā)布版岗照,測試版以及用戶測試版。
而 ** productFlavors ** 節(jié)點笆环,用來配置多渠道信息攒至,兩個節(jié)點相加,就是 BuildVariants(構(gòu)建變種版本)躁劣。
點擊圖2中的 ** select build variant ** 選項迫吐,在 如圖3 彈出窗口選擇后,可以直接通過 綠色箭頭账忘,Run 'app' 得到相應(yīng)版本志膀,或者在構(gòu)建簽名版本的時候,在Build->Generate Signed APK鳖擒,填寫簽名信息之后溉浙,也可以看到Flavors多了我們添加的渠道。
一些技巧
- 在 ** buildTypes ** 的三個節(jié)點中败去,都有兩句代碼:
buildConfigField("boolean", "isRelease", "false")
signingConfig signingConfigs.release
第一句話的作用是在構(gòu)建不同版本的時候(release/debug/userdebug)放航,自動生成一個類型為 boolean ,變量名為 isRelease 的變量圆裕,然后在項目任意位置广鳍,可以通過 BuildConfig.isRelease
取得這個值。我會通過這個值來判斷訪問測試接口還是正式接口吓妆。
另外赊时,上述判斷版本也可以用其他字段實現(xiàn),詳見自己項目中的BuildConfig.class
文件行拢。
第二句話的作用是在構(gòu)建不同版本的時候(release/debug/userdebug)祖秒,使用不同的簽名,比如測試簽名無法調(diào)起 微信分享,必須使用正式簽名竭缝。
在我的配置中房维,有一個 ** userdebug ** 節(jié)點,使用測試接口以及正式簽名抬纸,這樣就可以在測試環(huán)境下咙俩,調(diào)起微信分享。生產(chǎn)環(huán)境的時候使用 ** release ** 節(jié)點湿故,可以防止由于疏忽把測試數(shù)據(jù)帶入生產(chǎn)環(huán)境阿趁。
- 自定義build type節(jié)點,如** userdebug ** 節(jié)點如果需要打印輸出信息坛猪,必須配置
userdebug {
...
// 保留debug信息
debuggable true
}
debug和release為默認節(jié)點脖阵,無需配置。
- 如果想讓測試環(huán)境的APP跟生產(chǎn)環(huán)境的APP同時安裝在手機上墅茉,可以使用
debug {
...
applicationIdSuffix ".debug"
}
這樣可以改變debug包的ApplicationId命黔,這句話的作用是在原有ApplicationId后面追加一個.debug,來達到區(qū)分APP的作用就斤。
PS: 但是這么做的代價是依賴ApplicationId做唯一標識的三方庫會無法使用纷铣,例如微信分享。在三方庫管理平臺上添加一次應(yīng)用即可解決战转,添加的應(yīng)用ApplicationId為 完整包名.debug。
特別感謝 stormzhang 大神以躯,看他的博客收獲良多槐秧。
個人理解,難免有錯誤紕漏忧设,歡迎指正刁标。轉(zhuǎn)載請注明出處。