Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。接下来介绍一下android项目中gradle文件。 1.首先先从gradle-wrapper文件讲起,Wrapper是对Gradle的一层包装,便于在团队开发过程中统一Gradle构建的版本号,这样大家都可以使用统一的Gradle版本进行构建。里面的内容信息分别是
// 下载的Gradle压缩包解压后的主目录
distributionBase=GRADLE_USER_HOME
// 相对于distributionBase的解压后的压缩包的路劲
distributionPath=wrapper/dists
// 同distributionBase,只不过存放着zip压缩包
zipStoreBase=GRADLE_USER_HOME
// 同distributionPath,只不过存放着zip压缩包
zipStorePath=wrapper/dists
// Gradle发行版压缩包的下载地址
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
复制代码
distributionUrl一般下载后文件会存在下列的文件中
这个就是gradle-wrapper的全部内容,有时候如果遇到下载gradle很慢的话可以直接用本地所有的,这样可以极大的节约时间2.介绍完gradle-wrapper接着介绍一下settings.gradle,主要是用于初始化及工程树的配置,存放与根目录之下,设置文件大多数的作用都是为了配置自工程。在Gradle众多工程是通过工程树表示的,相当于我们在Android Studio看到的Project和Module概念一样。根工程相当于Android Studio的Project,一个根工程可以有很多自工程,也就是很多Module,这样就和Android Studio定义的Module概念对应上了。
例如这个工程就添加了一个module3.接下来开始介绍Project的build.gradle,这个直接上代码说明
// buildscript中的声明是gradle脚本自身需要使用的资源。
// 可以声明的资源包括依赖项、第三方插件、maven仓库地址等
// 需要注意的是buildscript中的声明是gradle脚本自身需要使用的资源,
// 而allprojects声明的却是你所有module所需要使用的资源,
// 就是说如果你的每个module都需要用同一个第三库的时候,你可以在allprojects里面声明。
buildscript {
// 顾名思义就是仓库的意思,而jcenter()、maven()和google()就是托管第三方插件的平台,
// 例如我这里就添加了google()和jcenter()
repositories {
google()
jcenter()
}
// 除了配置仓库之外,我们还需要在dependencies里面配置,
// 把需要配置的依赖用classpath配置上,也代表着是Gradle需要的插件
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
}
}
// allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。
// 而子项目可以配置自己的repositories以获取自己独需的依赖包。
allprojects {
repositories {
google()
jcenter()
}
}
// 如果运行gradle clean,则执行此处定义的task。该任务继承自Delete,删除根目录中的build目录。
// 相当于执行Delete.delete(rootProject.buildDir)。
// 其实这个任务的执行就是可以删除生成的Build文件的,跟Android Studio的clean是一个道理。
task clean(type: Delete) {
delete rootProject.buildDir
}
复制代码
4.介绍完(Project)的build.gradle最后介绍一下module下的buil.gradle,也是直接贴代码,如下:
// apply 引入Gradle插件,而 Gradle 插件大致分为分为两种:
// apply plugin:'×××':叫做二进制插件,二进制插件一般都是被打包在一个jar里独立发布的,
// 比如我们自定义的插件,再发布的时候我们也可以为其指定plugin id,
// 这个plugin id最好是一个全限定名称,就像你的包名一样;
// Android Gradle插件的分类其实是根据Android工程的属性分类的。
// 在Andriod中有3类工程,
// 一类是App应用工程,工程名是 com.android.application. ,它可以生成一个可运行的apk应用:
// 一类是Library库工程,工程名是 com.android.library. ,它可以生成AAR包给其他的App工程公用,
// 就和我们的Jar一样,但是它包含了Android的资源等信息,是一个特殊的Jar包;
// 最后一类是Test测试工程,工程名是 com.android.test. ,用于对App工程或者Library库工程进行单元测试。
// apply from:'×××':叫做应用脚本插件,其实这不能算一个插件,它只是一个脚本。
// 应用脚本插件,其实就是把这个脚本加载进来,和二进制插件不同的是它使用的是from关键字.
// 后面紧跟的坫一个脚本文件,可以是本地的,
// 也可以是网络存在的,如果是网络上的话要使用HTTP URL.
// 虽然不是一个真正的插件,但是不能忽视它的作用.
// 它是脚本文件模块化的基础,我们可以把庞大的脚本文件.
// 进行分块、分段整理.拆分成一个个共用、职责分明的文件,然后使用apply from来引用它们
apply plugin: 'com.android.application'
apply from:'config.gradle'
// Android插件提供的一个扩展类型,可以让我们自定义Android Gradle工程,是Android Gradle工程配置的唯一入口。
android {
// 编译所依赖的Android SDK的版本,这里是API 28。
compileSdkVersion sdkVersion
// defaultConfig是默认的配置,它是一个ProductFlavor。
// ProductFlavor允许我们根据不同的情况同时生成多个不同的apk包。
defaultConfig {
// 配置我们的包名,包名是app的唯一标识,
// 其实他跟AndroidManifest里面的package是可以不同的,他们之间并没有直接的关系。
//package指的是代码目录下路径;
//applicationId指的是app对外发布的唯一标识,会在签名、申请第三方库、发布时候用到。
applicationId "${apkName}"
// 支持的Android系统的api level,这里是15,也就是说低于Android 15版本的机型不能使用这个app。
minSdkVersion 15
// 表明我们是基于哪个Android版本开发的,这里是28
targetSdkVersion sdkVersion
// 表明我们的app应用内部版本号,一般用于控制app升级,
// 当然我在使用的bugly自动升级能不能接受到升级推送就是基于这个。
versionCode versionCode
// 表明我们的app应用的版本名称,一般是发布的时候写在app上告诉用户的
versionName "${versionName}"
// 用于配置该BuildType是否启用自动拆分多个Dex的功能。
// 一般用程序中代码太多,超过了65535个方法的时候。
multiDexEnabled true
// 多平台编译,生成有so包的时候使用,
// 包括四个平台'armeabi', 'x86', 'armeabi-v7a', 'mips'。
// 一般使用第三方提供的SDK的时候,可能会附带so库。
ndk {
abiFilters "armeabi","x86"
}
}
// 源代码集合,是Java插件用来描述和管理源代码及资源的一个抽象概念,
// 是一个Java源代码文件和资源文件的集合,
// 我们可以通过sourceSets更改源集的Java目录或者资源目录等。
// 如下就是告诉了Gradle我的关于jni so包的存放路径就在app/libs上了,叫他编译的时候自己去找
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
// 签名文件的配置
signingConfigs {
release {
// 签名文件的存放地址
storeFile file('D:/project/xxxx/xxxx.jks')
// 签名证书文件的密码
storePassword '密码'
// 签名证书中秘钥别名
keyAlias 'key文件名'
// 签名证书中改密钥的密码
keyPassword 'key密码'
}
}
buildTypes {
release {
// 是否开启混淆,默认不混淆
minifyEnabled true
// 是否使用zipAlign工具压缩
zipAlignEnabled true
// 是否去除未利用的资源,默认false,表示不去除。需要开启了混淆才可以使用
shrinkResources true
// 混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfigs.release
}
// debug模式的签名已经被配置好了,使用的就是Android SDK自动生成的debug证书,
// 它一般位于$HOME/.android/debug.keystore,其key和密码是已经知道的
// 不过有时候为了开发调试的方便我们会重新配置debug模式的签名
debug {
signingConfigs.release
}
}
// Gradle的多渠道打包,你可以在不同的包定义不同的变量,实现自己的定制化版本的需求。
productFlavors {
}
}
dependencies {
// 第一句implementation fileTree(include: ['*.jar'], dir: 'libs'),
// 这样配置之后本地libs文件夹下的扩展名为jar的都会被依赖,非常方便。
// 如果要引入某个本地module的话,那么需要用implementation project('×××')。
// 如果引入网上仓库里面的依赖,
//我们需要这样写 implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:+'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
}
复制代码
本文发自:https://blog.csdn.net/qq_34829270/article/details/88377381