扫盲系列 - build.gradle 的基本介绍
project 和task
每一次构建,至少得有一个 project 完成,每一个 project 至少有一个 task ,每一个build.gradle 文件代表一个 project , task 定义在build.gradle中,当初始化构建的时候, gradle 会基于 build 文件,集合所有的 project 和 tasks ,一个 taks 包含一系列动作,然后他们将会按照顺序执行,一个动作就是一段代码块,很像 java 中的方法,
构建声明周期
一旦一个 task 被执行,那么它就不会被再次执行了,不包含依赖的 tasks 总是优先执行,一次构建将会经历以下三个阶段
- 初始化阶段 project 实例在这里创建,如果有多个模块,即有多个build.gradle文件,多个 project 实例被创建,
- 配置阶段 该阶段,build.gradle脚本被执行,为每个 project 创建和配置所有的tasks
- 执行阶段 这一阶段, gradle 会决定哪一个 task 被执行,哪一个 task 会被执行完全依赖开始构建时传入的参数和当前所在文件夹的位置
基本的构建命令
- assemble 针对每个版本创建一个apk
- build 是 check 和 assemble 的集合体
- clean 删除所有的构建任务,包含 apk 文件
- check 执行 Lint 检查并且能够在 Lint 检测到错误后停止执行脚本
gradlew assemble
Android Stuido task
Android Studio 面板右侧 Gradle Project 栏目,就能看到,双击就可以了
使用aar
- 在目录中建立一个文件 例如在根目录下面,和 app 同一级目录,建立一个 aars 文件夹
- project 中的build.gradle 中添加下面代码,就可以
allprojects {
repositories {
...
flatDir {
dirs '../aar'
}
}
}
3.然后就可以在具体的 module 的build.gradle中的 dependencies 中使用了
dependencies{
compile(name: 'libraryname', ext: 'aar')
}
这个会告诉 Gradle 在 aars 文件夹下,添加一个叫做 libraryname 的文件,且其后缀是 aar 的作为依赖。
项目根目录下面的build.gradle
//Project 的build.gradle文件,也就是根目录的build.gradle文件
buildscript {
repositories {//代表仓库的下载来源,这里的来源是 jcenter 和google
jcenter()
google()
}
dependencies {//项目以来的 Gradle 构建工具,但是更加具体的版本信息却是在gradle-wrapper.properties这个文件中
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
allprojects {
//指所有参与构建项目的来源,也就是说我们工程里面所有模块的通用配置,这里只规定了所有模块的都要用的 jar 包是从 jcenter 和 google 中获取
// 在 allprojects 标签下配置的好处就是你不需要在每个模块下的build.gradle中单独配置了。
repositories {
jcenter()
google()
}
}
buildscript 和 allprojects 的区别
-
allprojects 用于多个项目构建,在 Android 中,使用多项目构建,其实就是使用多个 Moudle 构建,在settings.gradle中通过 inclue 的 Moudle , 从根目录开始,一直到 include 进来的所有 Moudle 都会执行 allprojects 内容 我们也可以通过 subprojects 来指定 moudle 和根目录的不同,也可以通过project(‘:moduldName’){}指定该 Module 自己的行为
-
buildscript 主要是为了 Gradle 脚本自身的执行,获取脚本依赖插件,在 Android 中,我们构建脚本就是Gradle
respositories 也可以是根级别的,为当前项目提供所需要的依赖包,但是在 Android 中,这个跟 allprojects 中的 repositories 一致 同样, dependencies 也可以是根级别的
app下面的build.gradle
apply plugin: 'com.android.application'
//语法介绍, apply 是一个方法名, 接受一个 map 类型参数, key 是 plugin , value 是com.android.application
//apply plugin 表明插件类型,这里是com.android.application类型,库工程是com.android.libary,如果是 java 项目,则是java
//这里的 android 表明是 Android 插件相关的配置
android { //该方法包含了 Android 所有的属性,而唯一必须的属性就是 compileSdkVersion 和buildToolsVersion
compileSdkVersion 26 //编译的sdk
buildToolsVersion "26.0.2"//编译的 tools 版本
dataBinding {//开启 dagtaBanding
enabled = true
}
defaultConfig { //默认配置,里面的属性会重写AndroidManifest.xml中对应的属性
//applicationId 重写了AndroidManifest.xml的包名 package name ,但是关于package name
applicationId "top.hoyouly.framework" //应用程序的包名, //在 eclipse 上是配置在AndroidManifest.xml文件中的,在 AS 中配置在build.gradle中了
//注意,如果这个模块是一个 library 的时候,应该删掉这个 applicationId 不然会报错的,
// Error:Library projects cannot set applicationId. applicationId is set to '****' in default config.
minSdkVersion 14 //支持的最低版本号
targetSdkVersion 26//支持的目标版本号
//上面这两个属性和AndroidManifest.xml中的<uses-sdk>很像
versionCode 1//版本号
versionName "1.0" //版本名 这个显示到应用程序列表中应用详情里面
}
sourceSets {//目录指向位置
main {
manifest.srcFile 'src/main/AndroidManifest.xml'//指定AndroidManifest.xml路径
java.srcDirs = ['src/main/java']//指定 source 目录
// resources.srcDirs = ['src']//指定 source 目录 和下面相等
resources{
srcDir 'src/main/' //指定 source 目录
exclude '/test/**' //不包含 test 文件路径
}
aidl.srcDirs = ['src/main']//指定 aidl 目录
renderscript.srcDirs = ['src']//指定 source 目录
res.srcDirs = ['src/main/res']//指定资源目录
assets.srcDirs = ['assets']//指定 assets 目录
jniLibs.srcDirs = ['libs']//指定 lib 目录
}
debug.res.srcDirs=['src/main/res-debug']//指定 debug 版本的资源目录是res-debug
release.manifest.srcFile 'src/main/release/AndroidManifest.xml'//指定 release 版本的AndroidManifest.xml路径是android/AndroidManifest.xml
}
signingConfigs {
releaseConfig {//release 版本签名配置 .名字可以随便起的,
storeFile file("../signfile/hoyouly.jks")//秘钥文件路径
storePassword '7419568'// 秘钥文件密码
keyAlias 'hoyouly_app'//秘钥别名
keyPassword '1234567' // 秘钥别名密码
}
debugConfig {//debug 版本签名配置
storeFile file("../signfile/hoyouly.jks")//秘钥文件路径
storePassword '7419568'// 秘钥文件密码
keyAlias 'hoyouly_app'//秘钥别名
keyPassword '1234567' // 秘钥别名密码
}
}
buildTypes {//编译类型,这里只有一种编译类型,但是可以添加例如 debug 等其他编译类型,
release {
buildConfigField "String", "BaseUrl","\"http://app.cn/api/pad/\"" //设置正式环境下的网络访问路径
minifyEnabled false //minifyEnabled 控制是否开启混淆
//proguardFiles 指定混淆文件,就是proguard-rules.pro
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
zipAlignEnabled true //内存对齐
shrinkResources false //移除无用的资源文件
applicationIdSuffix "test" //
signingConfig signingConfigs.releaseConfig//设置 release 签名
}
debug.initWith(release)//复制 release 内容到debug
debug {
buildConfigField "String", "BaseUrl","\"http://app.cn/apitest/pad/\"" //设置正式环境下的网络访问路径
minifyEnabled false //minifyEnabled 控制是否开启混淆
//proguardFiles 指定混淆文件,就是proguard-rules.pro
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debugConfig //设置 debug 签名信息
}
// 如果想要编译 releas 版本,在命令行输入 ./gradlew buildRelease 注意, release 首字母大写
}
lintOptions {
abortOnError false //lint 时候终止上报,防止编译的时候莫名失败
}
}
dependencies {//和build.gradle中的一样,
//想要编译工程,可以compile project(':projectName'
//编译 aar 包,可以compile(name: 'aarName', ext: 'aar')。
//表明编译 libs 文件下面的 jar 文件,所以如果有新的 jar 文件,都放到 libs 目录下面,如果 make 工程没反应,可以在 Gradle 哪里点击同步
compile fileTree(dir: 'libs', include: ['*.jar'])
// 从 maven库中获取库文件
compile 'com.squareup.retrofit2:retrofit:2.1.0'//retrofit
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile 'com.google.code.gson:gson:2.6.2'//Gson 库
//下面两个是 RxJava 和RxAndroid
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'//转换器,请求结果转换成Model
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'//配合 Rxjava 使用
//添加打印 log 的拦截器
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
compile 'com.squareup.picasso:picasso:2.71828'
implementation 'com.android.support:appcompat-v7:26.0.0'
implementation 'com.android.support:support-v4:26.0.0'
implementation 'com.android.support:recyclerview-v7:26.0.0'
compile 'com.android.support:design:26.0.0'
// 排除第三方库中重复的库
/*compile('org.eclipse.paho:org.eclipse.paho.android.service:1.0.2') {
exclude(group: 'com.google.android', module: 'support-v4')
}*/
// compile project(':Easylink')//编译附加的项目 ()内的内容要与settings.gradle文件中写的模块名一直,也是以冒号开头,并且用单引号括起来
}
applicationId和 Package name 不同
在 gradle 被用来作为 Android 构建工具之前,package name 在AndroidManifest.xml有两个作用:其作为一个 app 的唯一标示,并且其被用在了 R 资源文件的包名。
implementation 和 compile 区别
待整理
搬运地址:
Gradle入门学习—认识 buildeTypes 和dependencies
Android Studio 中build.gradle文件的详细解析
既已览卷至此,何不品评一二: