標籤:
1、什麼是Gradle?
百度百科說:Gradle 是以 Groovy 語言為基礎,面向Java應用為主,基於DSL文法的自動化構建工具。
功能:
- gradle對多工程的構建支援很出色,工程依賴是gradle的第一公民。
- gradle支援局部構建。
- 支援多方式依賴管理:包括從maven遠程倉庫、nexus私服、ivy倉庫以及本地檔案系統的jars或者dirs
- gradle是第一個構建整合工具(the first build integration tool),與ant、maven、ivy有良好的相容相關性。
- 輕鬆遷移:gradle適用於任何結構的工程(Gradle can adapt to any structure you have.)。你可以在同一個開發平台平行構建原工程和gradle工程。通常要求寫相關測試,以保證開發的外掛程式的相似性,這種遷移可以減少破壞性,儘可能的可靠。這也是重構的最佳實務。
- gradle的整體設計是以作為一種語言為導向的,而非成為一個嚴格死板的架構
gradle提供了什麼
- 一種可切換的,像maven一樣的基於約定的構建架構,卻又從不鎖住你(約定優於配置)
- 強大的支援多工程的構建
- 強大的依賴管理(基於Apache Ivy),提供最大的便利去構建你的工程
- Language for dependency based programming
- 全力支援已有的Maven或者Ivy倉庫基礎建設
- 支援傳遞性依賴管理,在不需要遠程倉庫和pom.xml和ivy設定檔的前提下
- 基於groovy指令碼構建,其build指令碼使用groovy語言編寫
- 具有廣泛的領域模型支援你的構建A rich domain model for describing your build.
2、gradle的安裝
gradle的官網下載:https://gradle.org/downloads
如果上面的下載慢或訪問不了可以在這下載:http://www.androiddevtools.cn/
androidStudio的話,直接解壓,然後把目錄導進去就ok了。
eclipse的要,解壓後要配置環境變數,具體的百度就好了,網上大把資料。
3、分析
下面舉個例子:這個是gradle2.0之前的文法(2.0以後文法改了)
1 apply plugin: ‘android‘ 2 3 buildscript { 4 repositories { 5 mavenCentral() 6 } 7 dependencies { 8 classpath ‘com.android.tools.build:gradle:0.7.3‘ 9 classpath ‘net.sf.proguard:proguard-gradle:4.10‘10 }11 }12 13 dependencies {14 compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])15 }16 17 android {18 compileSdkVersion 2119 buildToolsVersion "21.1.2"20 21 defaultConfig {22 minSdkVersion 923 }24 }25 26 //type:可以當做要使用什麼工具, dependsOn:執行該動作的在compileReleaseJava執行後執行27 task copyAssets(type: Copy, dependsOn: ‘compileReleaseJava‘) {28 from ‘assets‘29 into ‘build/classes/release/assets‘30 }31 32 task genJar(type: Jar, dependsOn: ‘copyAssets‘) {33 from fileTree(dir: ‘build/classes/release‘)34 archiveName = ‘gp_android_sdk_unproguard.jar‘35 }36 37 task progJar(type: proguard.gradle.ProGuardTask, dependsOn: genJar) {38 outjars ‘build/gp_android_sdk.jar‘39 libraryjars System.getenv("ANDROID_HOME")+"/platforms/android-19/android.jar"40 41 // 具體需要keep住的類42 configuration ‘sdk_proguard.pro‘43 }
在26行講到的type:gradle的文法中有很多:什麼Copy、Delete、Jar都是。具體的可看Gradle的開來源文件:https://gradle.org/docs/current/javadoc/index.html
如Copy:從 src/main/doc 目錄拷貝到 build/target/doc
task copyDocs(type: Copy) { from ‘src/main/doc‘ into ‘build/target/doc‘ }
是不是很簡單。。其他的基礎的百度看看別人的文檔,這裡推薦一篇:http://www.stormzhang.com/android/2014/02/28/android-gradle/
下面說說混淆:
buildTypes { release { runProguard false proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.txt‘ } }
官方把混淆寫在上面代碼的位置,但如果同時混淆並匯出jar包,可用:(還有沒有別的方法還沒試過)
task genJar(type: Jar, dependsOn: ‘copyAssets‘) { from fileTree(dir: ‘build/classes/release‘) archiveName = ‘gp_android_sdk_unproguard.jar‘}task progJar(type: proguard.gradle.ProGuardTask, dependsOn: genJar) { outjars ‘build/gp_android_sdk.jar‘ libraryjars System.getenv("ANDROID_HOME")+"/platforms/android-19/android.jar" // 具體需要keep住的類 configuration ‘sdk_proguard.pro‘}
其實gradle編譯的時候會產生jar包的:在build目錄的exploded-aar下(不同版本的gradle會不一樣的)回產生:classes.jar就是項目的jar包,這樣你把module用gradle編譯產生的classes.jar就是你要的jar包。
這裡給個gradle2.0之後的例子:
1 //該指令碼請使用gradle2.0以上編譯 2 3 apply plugin: ‘com.android.application‘ 4 5 buildscript { 6 repositories { 7 jcenter() 8 } 9 dependencies {10 classpath ‘com.android.tools.build:gradle:1.0.0‘11 classpath ‘net.sf.proguard:proguard-gradle:4.10‘12 }13 }14 15 dependencies {16 compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])17 }18 19 android {20 compileSdkVersion 2121 buildToolsVersion "21.1.2"22 23 defaultConfig {24 minSdkVersion 925 }26 }27 28 task copyAssets(type: Copy, dependsOn: ‘compileReleaseJava‘) {29 from ‘src/main/assets‘30 into ‘build/intermediates/classes/release/assets‘31 }32 33 task genJar(type: Jar, dependsOn: ‘copyAssets‘) {34 from fileTree(dir: ‘build/intermediates/classes/release‘)35 archiveName = ‘gp_android_sdk_unproguard.jar‘36 }37 38 task progJar(type: proguard.gradle.ProGuardTask, dependsOn: genJar) {39 outjars ‘build/gp_android_sdk.jar‘40 libraryjars System.getenv("ANDROID_HOME")+"/platforms/android-19/android.jar"41 42 // 具體需要keep住的類43 configuration ‘sdk_proguard.pro‘44 }45 46 task deleteOldJar(dependsOn: ‘progJar‘) {47 delete ‘../app/libs/gp_android_sdk.jar‘48 }49 50 task copyJar(type: Copy, dependsOn: ‘deleteOldJar‘) {51 from ‘build/gp_android_sdk.jar‘52 into ‘../app/libs‘53 }54 55 task sdk(dependsOn: ‘copyJar‘) {56 }
Android下gradle編譯代碼及混淆