Android中gradle使用教程

在我们编写Android代码的时候,引入第三方库,配置Android插件,打包apk命名,配置仓库地址,都需要在build.gradle中编写相应代码,我们可能对dependencies中做第三方依赖,发版本更改versionCode与versionName知道如何处理,但是具体详细使用该如何呢?那就让我们一起来探究吧。

背景

gradle语法是基于Groovy语言,Groovy是一种敏捷的动态语言,既可以面向对象编程,又可以用作纯粹的脚本语言,其运行在JVM上,能够与java代码很好的结合,也能扩展现有代码。

Gradle wrapper

当我们打开gradle-wrapper.properties文件,查看配置信息:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

通过配置项我们可以发现,当前项目使用的gradle版本,配置目录,它会根据以上配置目录下载到user/.gradle/wrapper/dists目录下,
Gradle Wrapper作用是允许你在没有安装 Gradle 的机器上执行 Gradle 构建,对客户端计算机零配置,减少兼容性问题。

build.gradle

build.gradle文件分别在项目目录下和对应module目录都存在,它们的存在承担不同的功能。

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在project目录下的文件主要是配置仓库地址,配置插件,当我们新建项目时,可能我们会疑惑为什么会有两个repositories配置项,它们有什么区别吗?下面我们来解惑。

首先,buildscript{}闭包声明是gradle脚本自身需要使用的资源,包含插件所在的仓库地址,插件依赖。例如:

classpath 'com.android.tools.build:gradle:3.2.0

这是我们Android执行task任务所必需的插件地址。

  • 打开现有应用模块的 build.gradle 文件

      	apply plugin: 'com.android.application  
    

    以上代码作为Android应用程序入口,我们需要plugin提供的编译、测试、打包所有tasks。

  • 打开libray中的build.gradle文件

       apply plugin: 'com.android.library'
    

    这个是将当前module打包成aar文件的任务,不是打包成一个apk文件,当我们打开Android studio右侧面板的gradle,可以清晰的看见,每个module的task任务,作为入口module和library,在执行gradle assembleRelaese 时,入口modlue会打包成apk文件,而library会打包成aar文件。

  • allprojects

    在这个节点下定义的属性会被运用到所有的module中,包含依赖的仓库,依赖地址。

    当我们出现重复的support包,我们可以在此强制依赖,例如:

      allprojects {
      repositories {
          google()
          jcenter()
      }
      configurations.all {
          resolutionStrategy.eachDependency { DependencyResolveDetails details ->
              def requested = details.requested
              if (requested.group == 'com.android.support') {
                  if (!requested.name.startsWith("multidex")) {
                      details.useVersion rootProject.ext.supportVersion
                  }
              }
          }
          resolutionStrategy{
              force 'com.google.code.gson:gson:2.8.5'
          }
      }
     	 }
    

    当我们看完project下的build.gradle文件,那我们再来看看项目入口module下的build.gradle文件。

      apply plugin: 'com.android.application'
      
      android {
      
           compileSdkVersion 28
           defaultConfig{
              applicationId "com.bestpay.android.myapplication"
              minSdkVersion 15
              targetSdkVersion 28
              versionCode 1
              versionName "1.0"
           }
      
           buildTypes {
              release {
                  minifyEnabled true
                  zipAlignEnabled true
                  shrinkResources true
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
              }
              debug{
                  minifyEnabled false
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
              }
          }
          signingConfigs {
              keyAlias '******'
              keyPassword '******'
              storeFile file('Key.jks')
              keyPassword '******'
          }
          productFlavors{
              
          }
      
      }
      
      dependencies{
          implementation fileTree(dir: 'libs', include: ['*.jar'])
          implementation 'com.android.support:appcompat-v7:28.0.0'
      }
    

通过以上代码,我们查看Android主要设置。

  • defaultConfig 默认配置
  • signingConfig 签名相关
  • buildTypes 构建变体
  • productFlavors 产品风格
  • sourceSets 源集配置

接下来我们来查看这些属性使用方式:

sourceSets

Android studio默认创建(app/src/main)作为代码,资源配置目录,也可以制定给其他目录为配置项
Android中gradle使用教程_第1张图片

    sourceSets{
        main{
            res.srcDirs = ['src/custom/res','src/main/res']
            java.srcDirs = ['src/main/java']
            manifest.srcFile 'src/main/AndroidManifest.xml'
            assets.srcDirs=['src/custom/assets']
            jniLibs.srcDirs = ['libs']//指定lib库目录
        }
    }

配置 jniLibs.srcDirs = ['libs'],可以在Android studio的Android视图下生成jniLibs文件夹,可以方便我们存放jar包和库文件,其中Android视图下的jniLibs和project视图下的libs指向同一文件夹app->libs

packagingOptions

packagingOptions{

 //pickFirsts做用是 当有重复文件时 打包会报错 这样配置会使用第一个匹配的文件打包进入apk 
 // 表示当apk中有重复的META-INF目录下有重复的LICENSE文件时 只用第一个 这样打包就不会报错 
 pickFirsts = ['META-INF/LICENSE'] 
 
 //merges何必 当出现重复文件时 合并重复的文件 然后打包入apk
  //这个是有默认值得 merges = [] 这样会把默默认值去掉 所以我们用下面这种方式 在默认值后添加 
  merge 'META-INF/LICENSE'

 //这个是在同时使用butterknife、dagger2做的一个处理。同理,遇到类似的问题,只要根据gradle的提示,做类似处理即可。
  exclude 'META-INF/services/javax.annotation.processing.Processor' 
}

productFlavors

配置多渠道,设置不同包名和应用名

android { 
    productFlavors {
        wandoujia {
            //豌豆荚渠道包配置
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
            //manifestPlaceholders的使用在后续章节(AndroidManifest里的占位符)中介绍
        }
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
            applicationId "com.wiky.gradle.xiaomi" //配置包名

        }
        _360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
        }
        //...
    } 
}

lintOptions

代码扫描分析,Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案。通常会配置以下方式

 lintOptions {
        abortOnError false //即使报错也不会停止打包
        checkReleaseBuilds false  //打包release版本的时候进行检测
    }

gradle.properties

这个是一个本地文件,存储一些个人配置,例如gradle运行是否并行,gradle的jvmargs大小、是否开启daemon

local.properties

本地文件,存储个人信息,sdk,ndk路径等。

setting.gradle

通过include相应module名称。

Android自带Task命令

打开Android studio右侧面板,查看gradle命令,让我们来查看具体命令使用场景。

Android中gradle使用教程_第2张图片

  • AndroidDependencies 查看app module下所依赖得第三方库,以及库中依赖得子库

图3

  • siningReport 显示渠道包得签名信息
  • sourceSets 查看项目java ,res ,jni所在得资源位置
  • assembleDebug 打包所有应用程序debug包
  • assembleRelease 打包所有应用程序release包
  • build 打包所有,包括测试项内容
  • clean 删除构建build目录
  • cleanBuildCache 删除构建的缓存目录
  • buildEnvironment app module中声明的所有buildscript依赖项。
  • installDebug 安装Debug版本
  • uninstallDebug - 卸载Debug版本

Android gradle插件与gradle版本关系

当我们在根build.gradle引入gradle任务执行得插件时,插件对应gradle最低版本,以下是具体对应关系:

Android中gradle使用教程_第3张图片

参考文献:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Why-Gradle-

你可能感兴趣的:(Android中gradle使用教程)