美文网首页
Gradle学习笔记

Gradle学习笔记

作者: smart_yang | 来源:发表于2018-05-12 11:39 被阅读6次

    Gradle2.0用户指南
    gradle学习教程

    Gradle的一些特性列表

    • 一个像 ant 一样,通用的灵活的构建工具
    • 一种可切换的,像 maven 一样的基于约定约定优于配置的构建框架
    • 声明式的构建以及基于约定的构建;
    • 基于编程的依赖语言;
    • 结构化构建:能够大显著的效率提升;
    • 多项目构建:项目依赖,Gradle对多项目构建的支持非常出色。
    • 多种方式去管理依赖:远程Maven和Ivy仓库、本地文件系统上的jar包或目录
    • 支持传递性依赖管理,而不需要远程仓库或者 pom.xml 或者 ivy 配置文件
    • ant 式的任务和构建是 gradle 的第一公民
    • 基于 groovy,其 build 脚本使用 groovy dsl 编写
      具有广泛的领域模型支持你的构建

    每一个项目都由一个或多个任务组成。一个任务表示构建执行的一些原子工作,比如编译一些类,创建一个JAR包,生成javadoc,或者是把一些档案发布到仓库中。
    Gradle 的核心在于基于 Groovy 的丰富而可扩展的域描述语言(DSL)。

    构建基础

    projects 和 tasks是 Gradle 中最重要的两个概念。每个 project 都由多个 tasks 组成。每个 task 都代表了构建执行过程中的一个原子性操作。如编译,打包,生成 javadoc,发布到某个仓库等操作。

    快速定义任务:

    task hello << {
        println 'Hello world!'
    }
    
    > gradle -q hello
    Hello world!
    

    一个基本 Java 项目

    apply plugin: 'java'
    
    
    > gradle build
    :compileJava
    :processResources
    :classes
    :jar
    :assemble
    :compileTestJava
    :processTestResources
    :testClasses
    :test
    :check
    :build
    BUILD SUCCESSFUL
    Total time: 1 secs
    

    其他tasks

    • clean:删除 build 目录以及所有构建完成的文件。
    • assemble:编译并打包 jar 文件,但不会执行单元测试。
    • check:编译并测试代码。

    其他

    1.添加maven库
    repositories {
        mavenCentral()
    }
    
    2.添加依赖
    dependencies {
        compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
        testCompile group: 'junit', name: 'junit', version: '4.+'
    }
    3.发布jar包
    uploadArchives {
        repositories {
           flatDir {
               dirs 'repos'
           }
        }
    }
    执行 gradle uploadArchives 以发布 jar 包。
    
    4.多项目构建配置settings.gradle:
    include "shared", "api", "services:webservice", "services:shared"
    
    • 依赖配置
    compile :编译范围依赖在所有的 classpath 中可用,同时它们也会被打包
    runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。
    testCompile:测试期编译需要的附加依赖
    使用 Maven 中央仓库:
    repositories {
        mavenCentral()
       // 可以添加其他库
       google()
    }
    
    

    其他

    • 创建目录:使用 mkdir 创建目录
    classesDir = new File('build/classes')
    task resources << {
        classesDir.mkdirs()
        // do something
    }
    
    • 使用 gradle.properties 文件设置属性
    gradlePropertiesProp=gradlePropertiesValue
    systemProjectProp=shouldBeOverWrittenBySystemProp
    envProjectProp=shouldBeOverWrittenByEnvProp
    systemProp.system=systemValue  
    
    使用hasProperty('propertyName') 来进行检查属性是否存在
    

    缓存
    为了提高响应速度,默认情况下 Gradle 会缓存所有已编译的脚本。这包括所有构建脚本,初始化脚本和其他脚本。你第一次运行一个项目构建时, Gradle 会创建 .gradle 目录,用于存放已编译的脚本。下次你运行此构建时, 如果该脚本自它编译后没有被修改,Gradle 会使用这个已编译的脚本。否则该脚本会重新编译,并把最新版本存在缓存中。如果您通过 --recompile-scripts 选项运行 Gradle ,会丢弃缓存的脚本,然后重新编译此脚本并将其存在缓存中。通过这种方式,您可以强制 Gradle 重新生成缓存。

    gradle 日志输出:

    • --stacktrace
      输出截断的栈跟踪。我们推荐使用这一个选项而不是打印全栈的跟踪信息。Groovy 的全栈跟踪非常冗长 (由于其潜在的动态调用机制,然而他们通常不包含你的的代码中哪里错了的相关信息。)
    • --full-stacktrace
      打印全栈的跟踪信息。

    通过 gradle.properties 配置构建环境

    • org.gradle.daemon
      当设置为 true 时,Gradle 守护进程会运行构建。对于本地开发者的构建而言,这是我们最喜欢的属性。开发人员的环境在速度和反馈上会优化,所以我们几乎总是使用守护进程运行 Gradle 作业。
    • org.gradle.java.home 为 Gradle 构建进程指定 java home 目录。
    • org.gradle.jvmargs 指定用于该守护进程的 jvmargs。该设置对调整内存设置特别有用。目前的内存上的默认设置很大方。
    • org.gradle.parallel
      如果配置了这一个,Gradle 将在孵化的并行模式下运行。

    android简单配置

    • 1.apply节点
      apply所标识的用以区分了application以及library。这个节点的作用就是用来区分当前module是可以作为应用程序还是作为一个应用程序的支持库module。
    作为应用程序Application
    apply plugin:'com.android.application'
    作为库module使用
    apply plugin: 'com.android.library'
    
    • 2.android节点
    packagingOptions:
    
    packagingOptions {
          pom.properties'
          exclude 'project.properties'
          exclude 'META-INF/LICENSE.txt'
          exclude 'META-INF/LICENSE'
          exclude 'META-INF/NOTICE.txt'
          exclude 'META-INF/NOTICE'
          exclude 'META-INF/DEPENDENCIES.txt'
          exclude 'META-INF/DEPENDENCIES'
      }
    lintOptions lint选项:
     lintOptions {
          disable 'MissingTranslation' //是否支持国际化
          abortOnError false //lint检查时如果出现error是否需要中断
          ignoreWarnings true //忽略警告
      }
    signingConfigs:签名配置
    signingConfigs {
          debug { //debug包签名
              keyAlias 'android'
              keyPassword 'android'
              storeFile file('E:/debug.jks')
              storePassword 'android'
          }
          release { //release包签名
              keyAlias 'psw'
              keyPassword 'psw'
              storeFile file('keystore addresss')
              storePassword 'psw'
          }    
         }
    compileSdkVersion 26  //编译SDk的版本号
    buildToolsVersion "26.0.2" // 使用的编译工具版本号指定
    defaultConfig {
          applicationId "com.xxx"//app的唯一标识符,一般使用包名
          minSdkVersion 14 //app要求最低的SDK版本号 对于应android可使用的最低系统版本
          targetSdkVersion 26 //目标版本SDK版本号
          versionCode 1 // app版本号
          versionName "1.0.0" // app版本名称
    
          // 多渠道打包默认渠道(以umeng为例)
          manifestPlaceholders = [UMENG_CHANNEL_VALUE: "GF"]
      }
    
    buildTypes设置编译对应的版本时所需的一些配置设置,
    可以针对调试版和发布版进行不同的设置是否需要混淆、
    是否需要压缩、是否需要删减无用资源等。
    buildTypes {
          debug {
              minifyEnabled false
              zipAlignEnabled false
              shrinkResources false
          }
          release {
              minifyEnabled true
              zipAlignEnabled true
              shrinkResources true
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
      }
    
    sourceSets用来设置项目对应文件资源的路径位置,比如
    习惯平常的把jni文件so包存放在libs目录下
    sourceSets {
            main {
                manifest.srcFile 'src/main/AndroidManifest.xml'
                java.srcDirs = ['src/main/java']
                renderscript.srcDirs = ['src/main']
                res.srcDirs = ['src/main/res']
                assets.srcDirs = ['src/main/assets']
                jniLibs.srcDirs = ['src/main/jniLibs']
                jni.srcDirs = [] //不使用AS编译jni
            }
        }
    
    productFlavors:提供了多渠道打包的渠道设置,成列了可生产的取到列表,
    
    dependencies下面是项目的依赖第三方支持库存放,包括libs目录及目录树下子目录所有的jar包,以及按照jcenter仓库库命名的的三方支持库:
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.android.support:appcompat-v7:23.3.0'
        compile 'com.android.support:design:23.3.0'
    
        compile 'com.squareup.picasso:picasso:2.5.2' //picasso
        compile 'com.squareup.okio:okio:1.6.0' //okio
        compile 'com.squareup:otto:1.3.8' //otto
        compile 'com.alibaba:fastjson:1.2.7' //fastjson
    }
    
    
    

    2018-5-19 新增

    六种依赖(Compile,Provided,APK,Test compile,Debug compile,Release compile)

    • Compile:compile是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中。
    • Provided:Provided 是对所有的 build type 以及 favlors 只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终apk
    • APK:只会打包到 apk 文件中,而不参与编译,所以不能再代码中直接调用 jar 中的类或方法,否则在编译时会报错
    • Test compile,Debug compile,Release compile分别是在不用环境使用

    其实除了上面提供的6中依赖方式,还有一些支持的方式:android-apt、annotationProcessor 。

    gradle升级3.0后替代:

    • api 指令:完全等同于compile指令,没区别,你将所有的compile改成api,完全没有错。
    • implementation指令:就是使用implementation指令的依赖不会传递只能在当前module使用,外部module引用不到

    在Google IO 相关话题的中提到了一个建议,就是依赖首先应该设置为implementation的,如果没有错,那就用implementation,如果有错,那么使用api指令。使用implementation会使编译速度有所增快。

    相关文章

      网友评论

          本文标题:Gradle学习笔记

          本文链接:https://www.haomeiwen.com/subject/qhrerftx.html