当我们在讨论 Gradle 时,我们在说什么

关于 Android Gradle 的模糊点

当我们在讨论 Gradle 时,除了猜测,我们还能知道些什么。

前几天参加一个面试,被问到关于 Gradle 的问题,毫无准备当然让面试官失望,对 Gradle 处于会用的状态,但被问到一些细节的东西只能猜测,所以就有了这篇,除了 Gradle 这个名词,我们还知道什么。

一、什么是 Gradle

官网说明

Gradle is an open-source build automation tool focused on flexibility and performance. Gradle build scripts are written using a Groovy or Kotlin DSL.

翻译过来,Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它能根据我们定义的脚本规则构建项目。

二、Android 中关于 Gradle 几个易混淆的问题
1. Gradle,gradle-wrapper,gradle-plugin 分别是什么

我们都知道,创建或者拷贝项目,大多数会去修改关于 gradle 的几个版本号,为什么要修改,下面了解一下我们到底改了什么。基本概念:

  1. Gradle 是一个项目构建工具,用于简化项目的编译、打包、测试等,与使用什么语言开发无关,即 Android 是 Gradle 应用的其中一个例子
  2. gradle-wrapper.properties 是一个简化 Gradle 安装部署的配置文件,因为 Gradle 存在不同版本,所以需要在项目中指定使用哪个版本的 Gradle 进行项目构建,表明该 Gradle 去哪里下载,这是这个文件的职责
  3. gradle-plugin 是 Google 开发适用于 Android 的插件集合,使得用 Gradle 构建 Android 更加简单,它与 Gradle 存在版本对应关系,gradle-plugin 的配置信息在项目根目录的 build.gradle 中 buildscript{} 定义,描述了插件的版本和插件的下载地址

注:gradle-plugin 4.1+ 要在 google() 中下载

总结:gradle-wrapper.properties 是用于下载 Gradle 版本的,项目根目录的 build.gradle 是用于下载插件 gradle-plugin,目的都是简化项目的构建,而不同的 gradle-plugin 对应不同的 Gradle,所以我们在 clone 他人 Android 项目有时会为避免下载 gradle 而修改版本号为本地已有的 gradle 版本,对应的关系在下图,官网链接在最下面。
所以我们修改版本号,是改为我们已有的 gradle,当然不改也没什么问题,现在直接下载已经不再是什么问题(GFW)
gradle-plugin 和 Gradle 对应

2. Android 中的 build.gradle,settings.gradle 分别是做什么的

我们知道,.gradle 文件有三个,项目根目录两个,模块目录下一个,大概意思是根目录是对整个项目的配置,模块下(如默认app)是针对模块的配置。

  1. settings.gradle
    Gradle 设置文件,位于项目根目录,用于指示 Gradle 构建项目时应该包括哪些模块,一般是 include ‘:app’
  2. 顶级 build.gradle,与 settings.gradle 同一目录下
    位于项目根目录,用于定义适用于项目所有模块的构建配置,使用 buildscript {} 来定义项目中所有模块共用的 Gradle 存储区依赖项,如新建项目后的默认配置
    buildscript {
        // gradle-plugin 下载的地址
        repositories {
            maven() { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
            google()
        }
    	//插件 gradle-plugin 版本
        dependencies {
            classpath 'com.android.tools.build:gradle:3.1.4'
        }
    }
    
    //所有模块配置,如远程仓库地址
    allprojects {
       repositories {
           jcenter()
       }
    }
    
  3. 模块级构建文件 build.gradle
    用于提供所在模块的构建配置。 android {} 用于构建当前模块/项目特殊的配置,如编译版本compileSdkVersion,构建工具版本buildToolsVersion,以及项目中常见的依赖库 dependencies {}
3. Android 中的 Gradle 配置的compileSdkVersion,targetSdkVersion 代表什么,如果不一致有什么影响

这三个基本都熟悉,强行复习

  • minSdkVersion 应用支持最小版本
  • targetSdkVersion 目标版本,最终把这里定义版本的 api 编译进应用
  • compileSdkVersion 编译版本,即在编译过程使用该版本api进行代码的检查,不会将这个版本的 api 编译进应用,主要功能做代码检查
  • targetSdkVersion 与 compileSdkVersion 不一致有什么问题?
    compileSdkVersion 应用的编译版本,主要用于代码检查,如在android 6之前不会检查权限,之后版本会调用动态权限检查,这样我们在编写代码时编译器能及时让我们知道哪里代码可能存在问题,如调用相机时,编译版本为26会出现红色波浪线提示我们要做动态权限申请
    targetSdkVersion 是应用的目标版本,最后应用打包会将对应的版本api打包进apk,一般来说 minSdkVersion <= targetSdkVersion <= compileSdkVersion,即使不一致也不会有太大影响,只是版本不一致存在api差异,会有一些方法可能无法找到或者过时不能及时在编码阶段发现,造成应用不稳定,所以尽量使两个版本保持一致,尽可能覆盖测试。

想一下,假设项目中 compileSdkVersion 设置为 19,targetSdkVersion 设置为 26,打包后应用有可能出现什么问题?

三、Android 模块下的 build.gradle 注释

除了默认配置,还能直接定义一些常量到 strings.xml 文件,全局变量 BuildConfig,多渠道打包,添加依赖,自定义 task 等,下面仅仅是一些常规设置,更多特性可以访问官方链接(文末)

//插件,声明为应用/库(com.android.library)
apply plugin: 'com.android.application'

android { //项目配置
    compileSdkVersion 27 //编译版本
    defaultConfig {//默认配置
        applicationId "com.xxx.xxx" //应用包名
        minSdkVersion 19 //适配最小版本
        targetSdkVersion 27 //适配目标版本,支持最高特性版本
        versionCode 1 //应用版本号
        versionName "1.0" //版本名
        resValue "string", "version", versionName //添加 version 字段到 strings 文件
    }
    sourceSets {//修改资源位置
        main {
            jniLibs.srcDir 'libs' //动态库位置指定 libs,这时我们可以将 so 文件放在 libs 中
            //还可以指定其他,如源码目录位置 srcDirs
            java.srcDirs = ['other/java'] //默认在 src/main/java
            //res 资源位置
            res.srcDirs = ['other/res1', 'other/res2'] //默认 src/main/res

            //替换文件 srcFile
            manifest.srcFile 'other/AndroidManifest.xml' //默认 src/main/

        }
    }
    compileOptions { //指定编译 jdk 为 1.8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildTypes {//构建配置
        release { //正式版本
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "boolean","Debug","false" //生成 BuildConfig.Debug
			buildConfigField "String","server","\"https://server/release/\"" //正式服务器地址
        }

        debug { //调试版本
            applicationIdSuffix ".debug" //在 applicationId 后加 .debug
            minifyEnabled false //是否混淆代码
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "boolean","Debug","true"
			buildConfigField "String","server","\"https://server/debug/\"" //测试服务器地址
        }

        dev { //其他
            //...
        }
    }
    productFlavors { //构建不同版本,如多渠道打包
        flavors_tencent { //不同版本的设置,如版本号
            versionNameSuffix "-tencent"
        }
        flavors_360 {
            versionNameSuffix "-360"
        }
        flavors_xxx{
            //xxx
        }
    }

    signingConfigs { //签名配置
        release {
            storeFile file('keys/release.keystore')
        }
        debug {
            storeFile file('keys/debug.keystore')
        }
    }

}
repositories {
	//这个是把依赖的 aar 包添加在 libs 中,加该指令后能识别出本地 aar
    flatDir {
        dirs 'libs'
    }
}
//依赖库/模块
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
}

几个常用链接:

Android Plugin DSL Reference 插件支持的扩展类型(extension type)

http://google.github.io/android-gradle-dsl/current/index.html

模块 build.gradle 更多配置官方说明

https://developer.android.google.cn/studio/build/gradle-tips?hl=zh_cn

gradle-plugin 和 Gradle 版本对应信息

https://developer.android.google.cn/studio/releases/gradle-plugin.html?hl=zh_cn

已开通微信公众号码农茅草屋,有兴趣可以关注,一起学习
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值