Android下gradle編譯代碼及混淆

一、什麼是Gradle?

百度百科說:Gradle 是以 Groovy 語言爲基礎,面向Java應用爲主,基於DSL語法的自動化構建工具。html

功能:
  • 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.

二、gradle的安裝java

  gradle的官網下載:https://gradle.org/downloadsandroid

  若是上面的下載慢或訪問不了能夠在這下載:http://www.androiddevtools.cn/app

  androidStudio的話,直接解壓,而後把目錄導進去就ok了。框架

  eclipse的要,解壓後要配置環境變量,具體的百度就行了,網上大把資料。dom

 

三、分析eclipse

  下面舉個例子:這個是gradle2.0以前的語法(2.0之後語法改了)maven

 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 21
19     buildToolsVersion "21.1.2"
20 
21     defaultConfig {
22         minSdkVersion 9
23     }
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 21
21     buildToolsVersion "21.1.2"
22 
23     defaultConfig {
24         minSdkVersion 9
25     }
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 }
相關文章
相關標籤/搜索