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