当前位置: 首页 > news >正文

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

相关文章:

  • C/C++将一个整型数组拼接成一个字符串
  • Haskell 差点儿无痛苦上手指南
  • [转] AC自动机详解
  • JVM调优总结(四)-垃圾回收面临的问题
  • Android代码报错:setContentView(R.layout.activity_main)
  • ccf 门禁系统
  • Swing学习总结
  • VB - 变量
  • 图片压缩,别问我是谁,请叫我雷锋
  • C++单例模式实例
  • Action(8):Error -27728:Step download timeout(120 seconds)has expired when downloading
  • 千位数减百位数不退位 区间代换
  • C# 第三次作业
  • Maven常用命令总结
  • ecshop开发日志之手机端虚拟商品自动发货
  • @angular/forms 源码解析之双向绑定
  • 【mysql】环境安装、服务启动、密码设置
  • 【剑指offer】让抽象问题具体化
  • HashMap剖析之内部结构
  • ReactNative开发常用的三方模块
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 分类模型——Logistics Regression
  • 简单基于spring的redis配置(单机和集群模式)
  • 码农张的Bug人生 - 初来乍到
  • 让你的分享飞起来——极光推出社会化分享组件
  • 我从编程教室毕业
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • ​Linux·i2c驱动架构​
  • ​批处理文件中的errorlevel用法
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (2)nginx 安装、启停
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (学习日记)2024.02.29:UCOSIII第二节
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net(C#)中String.Format如何使用
  • .Net环境下的缓存技术介绍
  • /etc/fstab和/etc/mtab的区别
  • ;号自动换行
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [CTO札记]盛大文学公司名称对联
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [Deep Learning] 神经网络基础