Android开发Android开发Android开发经验谈

<总结>Gradle简单总结及Android相关

2019-04-15  本文已影响13人  玉圣

本文主要总结的内容如下:


0、Groovy介绍:

Gradle 选择了GroovyGroovy基于Java并拓展了Java

Gradle选择了Groovy的原因:
Groovy基于Java并拓展了Java。 Java程序员可以无缝切换到使用Groovy开发程序。Groovy说白了就是把写Java程序变得像写脚本一样简单。写完就可以执行,Groovy内部会将其编译成Javaclass然后启动虚拟机来执行。

快速学习攻略:Groovy脚本基础全攻略

一、Gradle简介

1、定义

2、特性:

二、Gradle使用

1、Multi-Projects Build

将多个Project进行统一编译,类似这种操作,在Gradle中,可以称之为Multi-Projects Build

1.1、使用方式:
1.2、.gradle 内容:

2、gradle命令:

2.1、查看工程信息:
gradle projects命令
2.2、查看任务信息:
gradle:tasks命令
2.3、执行任务(task)

3、gradle的工作流程:

gradle工作流程

包含三个阶段:

4、Gradle编程模型

Gradle基于Groovy,Groovy又基于Java。所以,Gradle执行的时候和Groovy一样,会把脚本转换成Java对象。

Gradle主要有三种对象,这三种对象和三种不同的脚本文件对应,在gradle执行的时候,会将脚本转换成对应的对端:

各种类型Gradle对应的对象类型:

脚本类型 关联对象类型
Build script Project
Init script Gradle
Settings script Settings
4.1、Gradle对象:

gradle对象的属性如图,其中的几个属性说明如下:

Gradle对象属性
4.2、Project对象:

三、Android中的Gradle

Android自己定义了好多Script Block。Android定义的DSL参考文档在
https://developer.android.com/tools/building/plugin-for-gradle.html下载。

Android的DSL参考信息

1、相关文件

1.1、local.properties

对于Android来说,local.properties 是必须的,下面两个配置sdk.dir和ndk.dir是Android Gradle必须要指定的。

   #设置sdk目录
   sdk.dir=xxx
   #设置ndk目录
   ndk.dir=yyy
1.2、项目根目录(顶层)的build.gradle

一般情况下,这个build.gradle 是做一些全局配置,其配置最终会被应用到所有项目中。它典型的配置如下:

   apply from: 'dependencies.gradle'
   
   buildscript {
       repositories {
           jcenter()
           mavenCentral()
       }
       dependencies {
           classpath 'com.android.tools.build:gradle:3.2.1'
       }
   }
   
   allprojects {
       repositories {
           jcenter()
           google()
       }
   }
   
   task clean(type: Delete) {
       delete rootProject.buildDir
   }
1.3、每个子项目中的build.gradle

针对每个module 的配置,如果其build.gradle中定义的选项和顶层build.gradle定义的相同,则顶层中的配置会被覆盖。典型的配置内容如下:

      apply plugin: 'com.android.application'
      
      android {
          compileSdkVersion 28
          buildToolsVersion "28.0.3"
      
          defaultConfig {
              applicationId "com.demo.testapp"
              minSdkVersion 14
              targetSdkVersion 28
      
              versionCode 1.1.1
              versionName "111"
          }
      
          signingConfigs {
              debug {
                  storeFile file("../debug.jks")
      
                  storePassword "123456"
                  keyAlias "haha"
                  keyPassword "123456"
              }
      
              release {
                  storeFile file("../release.jks")
      
                  storePassword "123456"
                  keyAlias "haha"
                  keyPassword "123456"
              }
          }
      
          buildTypes {
              debug {
                  minifyEnabled false      //是否混淆
                  shrinkResources false    //去除没有用到的资源文件
              }
      
              release {
                  minifyEnabled true
                  shrinkResources true
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro"
                  signingConfig signingConfigs.release
              }
          }
      
          repositories {
              //添加aar
              flatDir {
                  dirs 'libs'
              }
          }
      
      }
      
      dependencies {
          api fileTree(include: ['*.jar'], dir: 'libs')
          api "com.android.support:appcompat-v7:27.1.1"
      }
1.4、Gradle Wrapper

gradle wrapper 是针对gradle新版本对旧版本的向后兼容性问题而使用的。

gradlw wrapper 包含一些脚本文件和针对不同系统下面的运行文件。wrapper 有版本区分,但是并不需要你手动去下载,当你运行脚本的时候,如果本地没有会自动下载对应版本文件。

在不同操作系统下面执行的脚本不同,在 Mac 系统下执行./gradlew ...,在windows 下执行gradle.bat进行编译。

2、Android tasks

2.1、基本的tasks:

这些基本的task,在实际项目中会根据不同的配置,会对这些task 设置不同的依赖。如默认的 assmeble 会依赖 assembleDebugassembleRelease,如果直接执行assmeble,最后会编译debugrelease 的所有版本出来。如果我们只需要编译debug 版本,我们可以运行assembleDebug

2.2、新增task:

3、相关配置

3.1、BuildConfig

这个类是由gradle根据配置文件生成的,通过配置一些key-value 的键值对,可以用BuildConfig获取相应的字段。例如:

    //module下的build.gradle
    buildTypes {
        debug {
            //配置网络请求根地址
            buildConfigField 'String', 'API_URL', '"http://test.com/api/debug/"'
            //配置app名称
            resValue "string", "app_name", "测试版"
        }

        release {
            //配置网络请求根地址
            buildConfigField 'String', 'API_URL', '"http://test.com/api/release/"'
            //配置app名称
            resValue "string", "app_name", "上线版"
        }
    }

在使用时,只需要调用BuildConfig.API_URL,就能获得当前环境(debug或release)下的值。
而用resValue配置的,则不需要再strings.xml中配置相应名称的值,否则会报错。

3.2、Repositories

repositories中配置的是代码仓库。在dependencies 中配置的一些依赖库都是从这里下载的。
Gradle 支持三种类型的仓库:MavenIvy和一些静态文件或者文件夹。在编译的执行阶段,gradle 将会从仓库中取出对应需要的依赖文件,当然,gradle 本地也会有自己的缓存,不会每次都去取这些依赖。

3.3、Dependencies

依赖库的配置。

   //module下的build.gradle
   dependencies {
       api fileTree(include: ['*.jar'], dir: 'libs')
   }
   //module下的build.gradle
   //其中的aarname是打包的aar文件的名称,后面的ext是固定的
   dependencies {
       api(name: 'aarname', ext: 'aar')
   }
3.4、Source sets

封装所有变体的源集配置。

   //方式一:
    android {
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs', , 'src/main/jni']
            }
        }
    }

    //方式二
    android {
        sourceSets.main {
            jni.srcDirs 'libs'
        }
    }
jni目录示意图
3.5、Product flavors:

关于构建不同的Product flavors,可以参考如下:
Build Variants
技术:Android打包签名总结

4、Gradle模板举例

相关链接:
Android Plugin DSL Reference
Gradle Android插件用户指南翻译

深入理解Android之Gradle
史上最全Android build.gradle配置详解
Gradle 完整指南(Android)
Gradle 提速:每天为你省下一杯喝咖啡的时间

上一篇 下一篇

猜你喜欢

热点阅读