天天看點

gradle 詳解——你真的了解Gradle嗎?Gradle簡介Gradle安裝與環境變量配置Gradle腳本建構(build.gradle)Gradle常用指令local.properties檔案:settings.gradle檔案gradle-wrapper.properties 檔案default.properties檔案project.properties檔案參考資料

版權聲明:本文為部落客原創文章,轉載請注明出處http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/52355915

前段時間忽然發現自己對于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檔案:

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

wrapper,在9GAG/gradle/wrapper/gralde-wrapper.properties檔案中聲明了它指向的目錄和版本。隻要下載下傳成功即可用grdlew

wrapper的指令代替全局的gradle指令。z了解了gradlewrapper的概念,下面一些常用指令也就容易了解了。

·      ./gradlew-v版本号

·      ./gradlewclean清除9GAG/app目錄下的build檔案夾

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

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

·      ./gradlewassembleDebug編譯并打Debug包

·      ./gradlewassembleRelease編譯并打Release的包

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

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

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

local.properties檔案:

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

settings.gradle檔案

include ‘:app’

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

這個檔案是全局的項目配置檔案,裡面主要聲明一些需要加入gradle的module,如:

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

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

gradle-wrapper.properties 檔案

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

default.properties檔案

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

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

project.properties檔案

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

參考資料

http://avatarqing.github.io/Gradle-Plugin-User-Guide-Chinese-Verision/basic_project/general_tasks.html http://wiki.jikexueyuan.com/project/GradleUserGuide-Wiki/using_ant_from_gradle/importing_an_ant_build.html http://www.2cto.com/kf/201501/366464.html https://segmentfault.com/a/1190000002439306 http://doc.okbase.net/tanlon/archive/125036.html http://www.android100.org/html/201507/12/164312.html