1. 程式人生 > >gradle 詳解——你真的瞭解Gradle嗎

gradle 詳解——你真的瞭解Gradle嗎

前段時間忽然發現自己對於Android studio的Gradle打包並不瞭解,這篇部落格參考網上眾多教程,為大家詳細介紹Gradle。

Gradle簡介

We would like to introduce Gradle to you, a build system that we think is a quantum leap for build technology in the Java (JVM) world. Gradle provides:

  1. A very flexible general purpose build tool like Ant.
  2. Switchable, build-by-convention frameworks a la Maven. But we never lock you in!
  3. Very powerful support for multi-project builds.
  4. Very powerful dependency management (based on Apache Ivy).
  5. Full support for your existing Maven or Ivy repository infrastructure.
  6. Support for transitive dependency management without the need for remote repositories or pom.xml and ivy.xml files.
  7. Ant tasks and builds as first class citizens.
  8. Groovy build scripts.
  9. A rich domain model for describing your build。
上面這段是grade官方介紹的grade的特性:
  • 一個像 Ant 一樣的靈活的構建工具
  • 一種可切換的, 像 maven 一樣的基於合約構建的框架
  • 支援強大的多工程構建
  • 支援強大的依賴管理(基於 ApacheIvy )
  • 支援已有的 maven 和 ivy 倉庫
  • 支援傳遞性依賴管理, 而不需要遠端倉庫或者 pom.xml 或者 ivy 配置檔案
  • 優先支援 Ant 式的任務和構建
  • 基於 groovy 的構建指令碼
  • 有豐富的領域模型來描述你的構建

gradle屬於任務驅動型構建工具,它的構建過程是基於

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

Gradle安裝與環境變數配置

。。。。。。。。。略!!!

網上有好多關於Windows,Linux,MAC的grade安裝與配置的教程這裡就不寫了。

Gradle指令碼構建(build.gradle)

Gradle中的所有東西都是圍繞兩個基本概念:專案和任務。

每個Gradle構建都是由一個或多個專案組成。一個專案代表什麼,取決於你用Gradle正在做的。比如,一個專案可能代表一個庫或一個網路應用。它可能代表一個由其他專案產生的一個或多個jar包打包d一個zip包。一個專案不需要代表一個事物而被構建。它可以代表一個事物而被做出來,比如部署你的應用到暫存區或產品環境。不要擔心這個現在是否好像有一點含糊。Gradle的通過約定來構建的功能支援為一個專案新增一個更加具體的定義。

下面介紹一下build.gradle檔案:

[java] view plain copy print?
  1. apply plugin: 'com.android.application'//說明module的型別,com.android.application為程式,com.android.library為庫  
  2. android {  
  3. compileSdkVersion 22//編譯的SDK版本  
  4. buildToolsVersion "22.0.1"//編譯的Tools版本  
  5. defaultConfig {//預設配置  
  6. applicationId "com.nd.famlink"//應用程式的包名  
  7. minSdkVersion 8//支援的最低版本  
  8. targetSdkVersion 19//支援的目標版本  
  9. versionCode 52//版本號  
  10. versionName "3.0.1"//版本名  
  11. }  
  12. sourceSets {//目錄指向配置  
  13. main {  
  14. manifest.srcFile 'AndroidManifest.xml'//指定AndroidManifest檔案  
  15. java.srcDirs = ['src']//指定source目錄  
  16. resources.srcDirs = ['src']//指定source目錄  
  17. aidl.srcDirs = ['src']//指定source目錄  
  18. renderscript.srcDirs = ['src']//指定source目錄  
  19. res.srcDirs = ['res']//指定資源目錄  
  20. assets.srcDirs = ['assets']//指定assets目錄  
  21. jniLibs.srcDirs = ['libs']//指定lib庫目錄  
  22. }  
  23. debug.setRoot('build-types/debug')//指定debug模式的路徑  
  24. release.setRoot('build-types/release')//指定release模式的路徑  
  25. }  
  26. signingConfigs {//簽名配置  
  27. release {//釋出版簽名配置  
  28. storeFile file("fk.keystore")//金鑰檔案路徑  
  29. storePassword "123"//金鑰檔案密碼  
  30. keyAlias "fk"//key別名  
  31. keyPassword "123"//key密碼  
  32. }  
  33. debug {//debug版簽名配置  
  34. storeFile file("fk.keystore")  
  35. storePassword "123"  
  36. keyAlias "fk"  
  37. keyPassword "123"  
  38. }  
  39. }  
  40. buildTypes {//build型別  
  41. release {//釋出  
  42. minifyEnabled true//混淆開啟  
  43. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'//指定混淆規則檔案  
  44. signingConfig signingConfigs.release//設定簽名信息  
  45. }  
  46. debug {//除錯  
  47. signingConfig signingConfigs.release  
  48. }  
  49. }  
  50. packagingOptions {  
  51. exclude 'META-INF/ASL2.0'//排除一些檔案  
  52. exclude 'META-INF/LICENSE'  
  53. exclude 'META-INF/NOTICE'  
  54. exclude 'META-INF/MANIFEST.MF'  
  55. }  
  56. lintOptions {  
  57. abortOnError false//lint時候終止錯誤上報,防止編譯的時候莫名的失敗  
  58. }  
  59. }  
  60. dependencies {  
  61. compile fileTree(dir: 'libs', exclude: ['android-support*.jar'], include: ['*.jar'])   //編譯lib目錄下的.jar檔案  
  62. compile project(':Easylink')//編譯附加的專案  
  63. compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'//編譯來自Jcenter的第三方開源庫  
  64. }  
apply plugin: 'com.android.application'//說明module的型別,com.android.application為程式,com.android.library為庫
android {
compileSdkVersion 22//編譯的SDK版本
buildToolsVersion "22.0.1"//編譯的Tools版本
defaultConfig {//預設配置
applicationId "com.nd.famlink"//應用程式的包名
minSdkVersion 8//支援的最低版本
targetSdkVersion 19//支援的目標版本
versionCode 52//版本號
versionName "3.0.1"//版本名
}
sourceSets {//目錄指向配置
main {
manifest.srcFile 'AndroidManifest.xml'//指定AndroidManifest檔案
java.srcDirs = ['src']//指定source目錄
resources.srcDirs = ['src']//指定source目錄
aidl.srcDirs = ['src']//指定source目錄
renderscript.srcDirs = ['src']//指定source目錄
res.srcDirs = ['res']//指定資源目錄
assets.srcDirs = ['assets']//指定assets目錄
jniLibs.srcDirs = ['libs']//指定lib庫目錄
}
debug.setRoot('build-types/debug')//指定debug模式的路徑
release.setRoot('build-types/release')//指定release模式的路徑
}
signingConfigs {//簽名配置
release {//釋出版簽名配置
storeFile file("fk.keystore")//金鑰檔案路徑
storePassword "123"//金鑰檔案密碼
keyAlias "fk"//key別名
keyPassword "123"//key密碼
}
debug {//debug版簽名配置
storeFile file("fk.keystore")
storePassword "123"
keyAlias "fk"
keyPassword "123"
}
}
buildTypes {//build型別
release {//釋出
minifyEnabled true//混淆開啟
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'//指定混淆規則檔案
signingConfig signingConfigs.release//設定簽名信息
}
debug {//除錯
signingConfig signingConfigs.release
}
}
packagingOptions {
exclude 'META-INF/ASL2.0'//排除一些檔案
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/MANIFEST.MF'
}
lintOptions {
abortOnError false//lint時候終止錯誤上報,防止編譯的時候莫名的失敗
}
}
dependencies {
compile fileTree(dir: 'libs', exclude: ['android-support*.jar'], include: ['*.jar'])   //編譯lib目錄下的.jar檔案
compile project(':Easylink')//編譯附加的專案
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'//編譯來自Jcenter的第三方開源庫
}

Gradle常用命令


直接執行gradle build會生成debug包和release如果不想要debug包可以使用gradleasR命令。

上面大家接觸了一些命令如./gradlew -v./gradlew clean./gradlew build, 這裡注意是./gradlew./代表當前目錄,gradlew代表 gradlewrapper,意思是gradle的一層包裝,大家可以理解為在這個專案本地就封裝了gradle,即gradle wrapper9GAG/gradle/wrapper/gralde-wrapper.properties檔案中聲明瞭它指向的目錄和版本。只要下載成功即可用grdlew wrapper的命令代替全域性的gradle命令。z理解了gradlewrapper的概念,下面一些常用命令也就容易理解了。

·      ./gradlew-v版本號

·      ./gradlewclean清除9GAG/app目錄下的build資料夾

·      ./gradlewbuild檢查依賴並編譯打包

這裡注意的是./gradlew build命令把debugrelease環境的包都打出來,如果正式釋出只需要打Release的包,該怎麼辦呢,下面介紹一個很有用的命令assemble,

·      ./gradlewassembleDebug編譯並打Debug

·      ./gradlewassembleRelease編譯並打Release的包

除此之外,assemble還可以和productFlavors結合使用,具體在下一篇多渠道打包進一步解釋。

·      ./gradlewinstallRelease Release模式打包並安裝

·      ./gradlewuninstallRelease解除安裝Release模式包

local.properties檔案:


這個檔案主要是配置sdk ndk路徑,格式必須符合要求。

settings.gradle檔案

include ‘:app’

該檔案中就僅僅只包含了一句話,在你的專案中如果有多個Model存在的時候,就可以選擇包含哪些進行編譯。

這個檔案是全域性的專案配置檔案,裡面主要宣告一些需要加入gradlemodule,如:

include':app', ':extras:ShimmerAndroid'

檔案中的 appextras:ShimmerAndroid 都是module,如果還有其他module都需要按照如上格式加進去。

gradle-wrapper.properties 檔案


可以看到裡面聲明瞭gradle的目錄與下載路徑以及當前專案使用的gradle版本,這些預設的路徑我們一般不會更改的,這個檔案裡指明的gradle版本不對也是很多導包不成功的原因之一。

default.properties檔案


我們看紅色框中圈的兩句,第一句說:不要修改這個檔案,您的修改將被清除。第二句說:這個檔案必須被版本控制系統檢查。

意思就說這個檔案我們不能動。這個檔案的內容是配置混淆檔案及android系統版本。

project.properties檔案


這個檔案和上個檔案一樣,我們不能修改。

參考資料