Android Studio 中关于Gradle的配置

Gradle 是一个项目构建工具,不仅可以构建Android,还可以构建java,C++等。

Android studio 就是采用 Gradle 来构建项目的。

不同于 ANT(https://mp.csdn.net/console/editor/html/85699922) 和 Maven 采用的XML,Gradle 是采用一个语言来声明项目设置,一种基于 Groovy 的领域特定语言(DSL,Demain Specific Language)。

Groovy:是一种基于JVM虚拟机的动态语言,它的语法和Java非常相似,由Java入门学习Groovy基本没有障碍。Groovy完全兼容Java,又在此基础上增加了很多动态类型和灵活的特性,比如支持密保,支持DSL,可以说它就是一门非常灵活的动态脚本语言。

Gradle就是工程的管理,帮我们做了依赖,打包,部署,发布,各种渠道的差异管理等工作。

安装

安装了android studio 就自带 gradle了。

否则需要先安装JDK,并配置JAVA_HOME环境变量。因为Gradle是用Groovy编写的,而Groovy基于JAVA。另外,Java版本要不小于1.5。然后下载gradle 地址是:http://www.gradle.org/downloads。在这里下载你要的版本

工具:AndroidStudio 或者 单独下载 Gradle

下面是AndroidStudio工程中的Gradle的配置的介绍

gradle-wrapper

Wrapper是对Gradle的一层包装,便于在团队开发过程中统一Gradle构建的版本号,这样大家都可以使用统一的Gradle版本进行构建。
Gradle提供内置的Wrapper task生成以下几个:


gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
//下载Gradle的路径,它下载到本地的C:\Users\XXXX\.gradle\wrapper\dists 文件夹下。
//如果本地没有就会去下载了,如果网速不好,可以修改这里配置为一个本地有的就不用重新下载了
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

.gradle文件

最少有三个,分别介绍:
1个settings.gradle,在根目录下

2个或者多个 build.gradle 文件,一个在根目录下,一个在 app 目录下以及其他模块下。

如果切换到 Android 模式下则全部在 Gradle Scripts。介绍下面三种类型的具体配置项目:

  • 根目录下的settings.gradle
  • 根目录下的build.gradle顶级配置文件
  • 模块目录下的(比如默认的app)模块配置文件build.gradle

根目录下的settings.gradle

定义哪些module(关于 Module的概念 https://blog.csdn.net/sinat_30949835/article/details/79636212) 应该被加入到编译过程,对于单个module 的项目可以不用需要这个文件。这个文件的代码在初始化阶段就会被执行,用于初始化以及工程树的配置。

比如下面添加了2个模块:

include':app',':lib'

根目录下的build.gradle顶级配置文件

顶级构建文件,为所有子项目/模块添加常见的配置选项。边看本地的这个文件边看这个注释

1.buildscript{ }——gradle脚本自身需要使用的资源

repositories{ }——仓库,配置Gradle代码托管库,设置之后可以在项目中轻松引用仓库上的开源项目了。Gradle预先配置了远程支持JCenter、Maven、Central和lvy等存储区,当然也可以指定本地自定义的远程存储库。

google()——google的官方仓库

jcenter(),mavenCentral()——出名的公共中央仓库

dependencies{ }——依赖,默认设置了项目依赖Gradle的插件版本路径;

指的是gradle脚本自身执行所需依赖(Gradle插件) 所以如果你没有引入远程的Gradle插件,那么就不用在buildscript {}下的dependencies下添加依赖。

2.allprojects{ }——配置所有模块中都需要使用的依赖项

这个是项目本身需要的依赖(普通代码库);
buildscript是gradle这个工具本身需要的依赖。

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

运行gradle clean时,执行此处定义的task。该任务继承自Delete,删除根目录中的build目录。相当于执行Delete.delete(rootProject.buildDir)。其实这个任务的执行就是可以删除生成的Build文件的,跟Android Studio的clean是一个道理。

模块目录下的(比如默认的app)模块配置文件build.gradle

简单默认的就是一个模块app。多个模块,就是多个配置文件,分别在模块文件夹的根目录下。

https://blog.csdn.net/niuba123456/article/details/81074171
介绍以下四个部分:

  • apply plugin:
  • android{ }
  • productFlavors {}
  • dependencies{ }
1.apply plugin:插件id——引入插件

App插件id:com.android.application.——App应用工程,生成一个可运行的apk应用
Library插件id:com.android.library.——Library库工程,它可以生成AAR包给其他的App工程公用,就和我们的Jar一样,但是它包含了Android的资源等信息,是一个特殊的Jar包
Test插件id:com.android.test.——Test测试工程,用于对App工程或者Library库工程进行单元测试

apply plugin:'com.android.application'——此模块是应用程序的时候,引入这个
apply plugin:'com.android.library'——此模块是库模块,引入这个。

apply plugin:’×××’ vs apply from:’×××’
apply plugin:’×××’:叫做二进制插件,二进制插件一般都是被打包在一个jar里独立发布的,比如我们自定义的插件,再发布的时候我们也可以为其指定plugin id,这个plugin id最好是一个全限定名称,就像你的包名一样;

apply from:’×××’:叫做应用脚本插件,其实这不能算一个插件,它只是一个脚本。本地的话就填针对这个build.gradle的相对路径。可以把庞大的脚本文件.进行分块、分段整理.拆分成一个个共用、职责分明的文件,然后使用apply from来引用它们,比如我们可以把常用的函数放在一个Utils.gradle脚本里,供其他脚本文件引用。比如我们把 App的版本名称和版本号单独放在一个version.gradle脚本里,可以使用自动化对该文件自动处理,生成版本。

2.android{ }——android构建的特定配置;

compileSdkVersion——指定项目编译需要的SDK API版本,即编译时用的api。

ps:如果您代码中有使用api 16功能,但是compileSdkVersion到15,您将得到一个编译错误。

ps:compileSdkVersion是应用程序所针对的API的版本,而targetSdkVersion指示应用程序被测试的版本。

一般这个targetSdkVersion 小于等于你编译用的sdk level api。理想情况是使用最新的sdk进行编译:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)

但是也经常会看到维护良好的/已建立的应用程序

targetSdkVersion > compileSdkVersion

buildToolsVersion——指定SDK build-tools构建工具的版本,包括了打包工具aapt、dx等等,位于sdk目录下的build-tools目录下对应的版本;

defaultConfig{}——applicationId:用于指定项目的包名,如果包名进行修改这样也需要修改;minSdkVersion:项目最小兼容版本;targetSdkVersion:项目的目标版本,在此版本进过充分测试,如果高版本提供了新功能,就不会启用;versionCode:项目的版本编号;versionName:项目的版本名称;multiDexEnabled用于配置该BuildType是否启用自动拆分多个Dex的功能。一般用程序中代码太多,超过了65535个方法的时候;ndk{}多平台编译,生成有so包的时候使用,包括四个平台’armeabi’, ‘x86’, ‘armeabi-v7a’, ‘mips’。一般使用第三方提供的SDK的时候,可能会附带so库。

ps:versionCode vs versionName
versionName是给人看的,字符串类型。
versionCode是给机器看的,INT类型。更新的时候,机器根据versionCode判断是升级还是降级,即使versionName(版本号)比以前的高,但是versionCode比以前的低,机器还是会判断是降级。)

sourceSets{}
源代码集合,是Java插件用来描述和管理源代码及资源的一个抽象概念,是一个Java源代码文件和资源文件的集合,我们可以通过sourceSets更改源集的Java目录或者资源目录等。

    sourceSets{
        main{
            jniLibs.srcDirs = ['libs']
        }
    }

通过sourceSets告诉Gradle,关于jni so包的存放路径就在app/libs上了。

buildTypes{}——构建类型,内置了release{}和debug{}
两种模式主要车别在于,能否在设备上调试以及签名不一样,其他代码和文件资源都是一样的。一般设置代码混淆,minifyEnabled=true就会开启混淆:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

signingConfigs
默认情况下,debug模式的签名已经被配置好了,使用的就是Android SDK自动生成的debug证书,它一般位于$HOME/.android/debug.keystore,其key和密码是已经知道的,一般情况下我们不需要单独配置debug模式的签名信息。

3.productFlavors {}——可选,配置多渠道打包工具,根据配置不同的逻辑、构建部分来实现版本的差异化

方法一

下面定义了两个渠道,一个是free,一个是paid。

productFlavors {

free {

applicationId 'com.example.myapp.free'

}

paid {

applicationId 'com.example.myapp.paid'

}

}

另外,manifestPlaceholders是使用Gradle Android插件里的另一个功能,manifestPlaceholders占位符,比如如下定义了 APP_ICON 和 APP_NAME,然后就可以在 AndroidManifest.xml 文件中使用这两个占位符了(在 AndroidManifest.xml 文件中通过 "${APP_ICON}" 这种方式来调用)

productFlavors {

    free {

        applicationId 'com.example.myapp.free'

        **manifestPlaceholders **= [**APP_ICON**: "@drawable/ic_launcher",

            APP_NAME: appName]

    }

}

所以在AndroidManifest.xml 中看到占位符${XXXX}",就可以在build.gradle中看看有没有定义productFlavors以及**manifestPlaceholders **

方法二

在build.gradle中配置如下:

android {

// 这里是你的其他配置

productFlavors{

    free {  }

    paid {  }

}

......

}

然后在app/src下面,分别创建和main同级目录的文件夹free, paid, 这两个文件夹里面都各只有一个AndroidManifest.xml文件,free下的AndroidManifest.xml文件只需要如下(猜的):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.myapp.free">

<application>

</application>

</manifest>

4.dependencies{ }——指定当前模块的依赖关系,本地依赖库、远程依赖库和库模块依赖

指定当前模块的依赖关系,本地依赖库、远程依赖库和库模块依赖

本地依赖——本地依赖是对本地的Jar包目录添加依赖关系。**implementation **fileTree(,ext jar)是一个本地依赖的声明,它表示将libs目录下所有的.jar后缀文件添加到项目的构建路径当中。

库依赖——对项目中的库模块添加依赖关系

远程依赖——对jcenter库上的开源项目添加依赖关系。appcompat和constraint属于远程依赖.

.properties文件

gradle.properties——位于项目根目录下,主要设置Gradle后台进程JVM内存大小;日记级别;设置全局常量,可以供 gradle.property中使用;

local.properties——为Gradle配置环境变量,例如sdk、ndk路径;

Gradle版本 vs Android Gradle Plugin版本

Gradle版本的配置:gradle\wrapper\gradle-wrapper.properties文件distributionUrl=https://services.gradle.org/distributions/gradle-5.4.1-all.zip

Android Gradle Plugin版本的配置:项目目录下的build.gradle文件
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
}


微信图片_20200309114901.png

参考

https://blog.csdn.net/niuba123456/article/details/81073639

https://blog.csdn.net/yechaoa/article/details/80484468

推荐阅读更多精彩内容