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的整体设计是以作为一种语言为导向的,而非成为一个严格死板的框架
- 一种可切换的,像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 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。