Android下gradle编译代码及混淆

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 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 }


 
原文地址:https://www.cnblogs.com/KennyXia/p/4331923.html