学习笔记_Gradle和Proguard

Gradle官网: https://gradle.org/
Proguard官网:https://www.guardsquare.com/en/proguard

易百教程:通用Gradle知识

http://www.yiibai.com/gradle/

  • Gradle是一个基于Apache Ant和Apache
    Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。
  • 按约定声明构建和建设;强大的支持多工程的构建;强大的依赖管理(基于Apache Ivy),提供最大的便利去构建工程;全力支持已有的Maven或者Ivy仓库基础建设;支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下;基于groovy脚本构建,其build脚本使用groovy语言编写;具有广泛的领域模型支持构建;深度API;易迁移;自由和开放源码,Gradle是一个开源项目,基于ASL许可。
  • Gradle使用Groovy语言写的,build.gradle实际上就是Groovy代码。
  • Gradle构建脚本定义了构建项目的过程;每个项目包含一些依赖项和一些发表项。依赖性意味着支持构建项目的东西,例如来自其他项目的所需JAR文件以及类路径中的外部JAR(如JDBCJAR或Eh-cache JAR)。发布表示项目的结果,如测试类文件和构建文件,如war文件。Gradle负责构建和发布结果。发布基于定义的任务。可能希望将文件复制到本地目录,或将其上传到远程Maven或lvy存储库,或者可以在同一个多项目构建中使用另一个项目的文件。发布的过程称为发布。
  • 外部依赖:
dependencies { 
    compile group: 'org.hibernate', 
    name: 'hibernate-core', 
    version: '3.6.7.Final' 
}
  • 存储库:
repositories {
    mavenCentral()
}
repositories {
   maven {
      url "http://repo.mycompany.com/maven2"
   }
}
  • 发布文件:
apply plugin: 'maven'
uploadArchives {
   repositories {
      mavenDeployer {
         repository(url: "file://localhost/tmp/myRepo/")
      }
   }
}
  • Gradle插件:
apply plugin: HelloPlugin
class HelloPlugin implements Plugin<Project> {
   void apply(Project project) {
      project.task('hello') << {
         println "Hello from the HelloPlugin."
      }
   }
}

Android Gradle详解:

教程:http://www.infoq.com/cn/articles/android-in-depth-gradle

  • Gradle基于Groovy,Groovy又基于Java。
  • Groovy是在 java平台上的、 具有像Python, Ruby 和 Smalltalk 语言特性的灵活动态语言,Groovy保证了这些特性像 Java语法一样被 Java开发者使用。实际上,由于GroovyCode在真正执行的时候已经变成了Java字节码,所以JVM根本不知道自己运行的是Groovy代码。
  • Groovy注释标记和Java一样,支持//或者/**/。Groovy语句可以不用分号结尾。Groovy中支持动态类型,即定义变量的时候可以不指定其类型。Groovy中,变量定义可以使用关键字def。注意,虽然def不是必须的,但是为了代码清晰,建议还是使用def关键字
  • 闭包Closure,是一种数据类型,它代表了一段可执行的代码。闭包是一段代码,所以需要用花括号括起来。Closure的定义格式是:
    def xxx = {paramters -> code} 或者 def xxx = {无参数,纯code}
    这种case不需要->符号。如果闭包没定义参数的话,则隐含有一个参数,这个参数名字叫it,和this的作用类似。it代表闭包的参数。
  • Groovy中,当函数的最后一个参数是闭包的话,可以省略圆括号。故而doLast {println ‘Hello world!’},实际上完整应为doLast ({println ‘Hello world!’})。
  • Gradle是一个工具,同时它也是一个编程框架。从网上学习到的资料来看,几乎全是从脚本的角度来介绍Gradle,结果学习一通下来,只记住参数怎么配置,却不知道它们都是函数调用,都是严格对应相关API的。而从API角度来看待Gradle的话,有了SDK文档,你就可以编程。
  • 在Android中,Gradle用来完成app的编译打包等工作。当然你也可以用它干其他的事情。
  • 每一个Library和每一个App都是单独的Project。根据Gradle的要求,每一个Project在其根目录下都需要有一个build.gradle。build.gradle文件就是该Project的编译脚本。而Multi-Projects Build则可以则配置子Project,其build.gradle在最外层(根目录),并且要有settings.gradle用来告诉Gradle包含多少个子Project(使用include,多个可用逗号隔开,也可以分开逐个include)。
  • 如果你确实只有一个Project需要编译,也建议你在目录下添加一个settings.gradle,以便后面的扩展等。
  • Gradle主要有三种对象。Gradle对象:当我们执行gradle xxx或者什么的时候,gradle会从默认的配置脚本中构造出一个Gradle对象。在整个执行过程中,只有这么一个对象。Gradle对象的数据类型就是Gradle。我们一般很少去定制这个默认的配置脚本。Project对象:每一个build.gradle会转换成一个Project对象。Settings对象:显然,每一个settings.gradle都会转换成一个Settings对象。
  • Project包含若干Tasks。一个Project包含多少Task往往是插件决定的。在Project中,我们要:加载插件;不同插件有不同的行话,即不同的配置,我们要在Project中配置好,这样插件就知道从哪里读取源文件等;设置属性。
  • apply是一个函数。注意,Groovy支持函数调用的时候通过 参数名1:参数值2,参数名2:参数值2的方式来传递参数。
    因此apply plugin: ‘com.android.library’ <==如果是编译Library,则加载此插件。
    apply plugin: ‘com.android.application’ <==如果是编译Android APP,则加载此插件。
  • 对于Android来说,local.properties文件是必须的,sdk.dir和ndk.dir是Android
    Gradle必须要指定的。
  • 特别提示:当你下次看到一个不认识的SB(Script Block)的时候,就去看API吧。
  • Gradle 不断的在发展,新的版本难免会对以往的项目有一些向后兼容性的问题,这个时候,gradle wrapper就应运而生了。gradlw wrapper 包含一些脚本文件和针对不同系统下面的运行文件。wrapper 有版本区分,但是并不需要你手动去下载,当你运行脚本的时候,如果本地没有会自动下载对应版本文件。
  • Android tasks有四个基本的task。assemble:对所有的 buildType 生成 apk
    包。clean:移除所有的编译输出文件,比如apk。check:执行lint检测编译。build:同时执行assemble和check命令。除此之外还有一些常用的新增的其他命令,比如
    install命令,会将编译后的apk 安装到连接的设备。

Android官网Gradle相关:

Android定义的DSL(领域特定语言):https://developer.android.com/tools/building/plugin-for-gradle.html
Android官网build相关:https://developer.android.com/studio/build/index.html

Proguard:

官网:https://www.guardsquare.com/en/proguard
文章:http://www.cnblogs.com/cr330326/p/5534915.html
http://www.jianshu.com/p/ce04e31639ee

  • 官网上的翻译:Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。(无法混淆Native代码,资源文件drawable、xml等)
  • 因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,但还有4个功能,1、压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。2、优化(Optimize):对字节码进行优化,移除无用的指令。3、混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。4、预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。
  • 编写一个ProGuard文件:基本混淆,针对APP的量身定制,针对第三方jar包的解决方案。
  • 通配符匹配规则:?匹配单个字符;匹配类名中的任何部分,但不包含额外的包名;匹配类名中的任何部分,并且可以包含额外的包名;%匹配任何基础类型的类型名;匹配任意类型名,包含基础类型/非基础类型;..匹配任意数量、任意类型的参数;匹配任何构造器;匹配任何字段名;匹配任何方法;(当用在类内部时)匹配任何字段和方法;$指内部类(用来分割内嵌类与其母体的标志)。
  • 不能混淆:在AndroidManifest中配置的类比如四大组件;JNI调用的方法;反射用到的类;WebView中JavaScript调用的方法;Layout文件引用到的自定义View;一些引入的第三方库(一般都会有混淆说明的)。
  • ProGuard的输出文件说明,混淆后,会在/build/proguard/目录下输出下面的文件 (Eclipse使用Export
    Android Application会在项目根目录下产生proguard目录。dump.txt
    描述apk文件中所有类文件间的内部结构。mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。seeds.txt
    列出了未被混淆的类和成员。usage.txt 列出了从apk中删除的代码。

Proguard官网相关:

https://www.guardsquare.com/en/proguard/manual/usage

你可能感兴趣的:(Android)