Gradle常见概念讲解&版本问题报错的处理方案

原文链接:
http://www.jianshu.com/p/0e680428a745
http://www.jianshu.com/p/c7983274c510

1、Gradle

项目的构建工具,管理一个项目的依赖架包,性质和maven相似

一个基于groovy的项目打包工具能复用很多的打包过程(tasks)有一个中央仓库能找到你打包过程中需要依赖的库,并且声明使用很简单

2、Gradle wrapper

用于统一项目所使用的gradle版本,保证了所有开发人员在该项目使用同一个版本的编译工具进行编译(统一项目所使用的gradle版本)

在android studio中,选中你的项目,切换到project files视图,在项目根目录下就能看到gradle/wrapper/gradle-wrapper.properties 文件,配置大体如下:

#Mon Dec 28 10:00:20 PST 2015
#规定了解压后的gradle包放在哪里
distributionBase=GRADLE_USER_HOME 
distributionPath=wrapper/dists
#规定了gradle的zip包放在哪里
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#规定了使用哪个版本的gradle编译项目,这个地址可以配置成服务器地址或者本地地址
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

根据此配置Gradle Wrapper会自动为我们下载合适的Gradle版本。默认情况下,下载位置是在$USER_HOME/.gradle/wrapper/dists,如果设置了GRADLE_USER_HOME环境变量,那么就会下载到GRADLE_USER_HOME/wrapper/dists下.

3、Gradle plugin

Gradle plugin ,俗称gradle插件,是android studio为了方便使用gradle进行配置和编译而开发的插件,它跟随gradle版本的变迁而变迁.

在android studio中,项目的根目录下的build.gradle中会配置如下代码:

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

这个dependencies中的gradle:2.1.0代表的就是使用gradle 插件版本 2.1.0. 在编译过程中,如果gradle插件版本与gradle版本不匹配,编译就会失败.
目前在使用的gradle与gradle插件版本的对应关系如下

Gradle常见概念讲解&版本问题报错的处理方案_第1张图片
屏幕快照 2019-07-11 下午4.26.40.png

Gradle plugin的版本通常随Android Studio的安装包,目录位置在

/Applications/Android\ Studio.app/Contents/gradle/m2repository/com/android/tools/build/gradle

4、gradlew

gradlew: W意思是wrapper,它是一个用bash命令包装过的gradle编译启动脚本,里面会进行环境变量检测和设置,最终进行编译的还是gradle.常见命令如:gradlew -v 查看当前项目下gradle版本

在工程目录下执行 gradlew build --info,即可编译工程。Android Studio对gradle配置问题错误输出不明显,用这种方式能看到具体的出错原因。


报错信息

分析:

“Gradle version 2.2 is required. Current version is 2.10.try editing the distributionUrlin/MyApplication/gradle/wrapper/gradle-wrapper.properties to gradle-2.2-all.zip.”

这到底是啥意思呢?

简单解释一下:“根据你的AS的Gradle插件版本,与你匹配的Gradle版本是2.2,但是你当前的Gradle版本是2.10.请尝试将Gradle系统版本改为gradle-2.2-all.zip”

先理清下Gradle版本的概念:

Gradle version: Gradle是一种自动化建构工具(例如Ant 、Maeven也是构建工具),Gradle version就是指这种构建工具的版本号。可以在你项目根目录的gradle/wrapper/gradle-wrapper.properties里指定。指定后AS会自动去下载或者你也可以去Gradle官网下载相应的版本放到/Users/你的用户名/.gradle/wrapper/dists目录下

Android Plugin Version : 是指你Android Studio里的gradle插件版本。在你项目根目录下的build.gradle文件中的dependencies节点下设置。

Gradle常见概念讲解&版本问题报错的处理方案_第2张图片

Paste_Image.png

而我的AS Gradle插件版本我设置的是1.2.3,Gradle构建工具的版本是2.10.Android Plugin Version和Gradle version是有对应关系的,Plugin版本太低了,所以gradle 2.10是不支持 1.2.3版本的plugin。

三种解决方案:

一 根据报错信息里建议的:降低 Gradle版本到2.2

  1. 下载gradle-2.2-all.zip如果让 AS自动去下载 gradle-2.2-all.zip实在是太慢了!所以将https://services.gradle.org/distributions/gradle-2.2-all.zip 这个网址拖到迅雷把它下载好,然后放到/Users/你的用户名/.gradle/wrapper/dists目录下

  2. 进入AS的设置中,设置使用默认的gradle wrapper来管理gradle


    Gradle常见概念讲解&版本问题报错的处理方案_第3张图片

    Paste_Image.png

  3. 进入项目根目录的gradle/wrapper/gradle-wrapper.properties里


    Gradle常见概念讲解&版本问题报错的处理方案_第4张图片

    Paste_Image.png
    修改为

distributionUrl=https://services.gradle.org/distributions/gradle-2.2-all.zip

  1. 选择 File—>invalidate and restart
  2. 耐心等待一会


    Paste_Image.png

发现会弹框提醒你升级 插件版本Android Gradle Plugin


Gradle常见概念讲解&版本问题报错的处理方案_第5张图片

Paste_Image.png

先忽略。然后就可以运行程序了。
修改后各版本匹配关系:
Android Studio版本是 2.1
Plugin version 是 1.2.3
Gradle version是 2.2

二 提高 plugin 版本

  1. 修改根目录下 build.gradle文件中的plug 版本,改为>=1.5.0:classpath 'com.android.tools.build:gradle:1.5.0’或者2.0.0或2.1.0
  2. 修改gradle wrapper中的

distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip

3 .这时候不要点击Sync Now
4 .选择 File—>invalidate and restart

让它加载1分钟左右就好了。

修改后各版本匹配关系:
Android Studio版本是 2.1
plugin version 是 >=1.5.0
gradle version是 2.10

三 灵活配置

比如我们团队用的版本是:plugin1.2.3 , gradle构建工具2.4为了保持一致,所以我又不得不

  1. 下载gradle-2.4-all.zip扔到/Users/你的用户名/.gradle/wrapper/dists/目录下
  2. 修改gradle wrapper.properties 文件,将url改为gradle-2.4-all.zip
  3. File—> invalidate and restart
  4. 进入AS的设置中,设置use default gradle wrapper来管理gradle

修改后各版本匹配关系:
Android Studio版本是 2.1
plugin version 是 1.2.3
gradle version是 2.4


重新打开项目,出现

Error:null value in entry: incrementalFolder=null

或者

Could not create service of type CachingFileHasher using TaskExecutionServices.createFileSnapshotter().

解决方法:

  1. 删除 .gradle 目录
  2. 重启 Android Studio

换了新手机,app安装不上或一运行就crash

关掉Instant Run


gradle vs gradlew

gradlew是gradle的包装器,它的主要用处是保证编译环境一致。
不同人电脑安装了不同Android Studio,gradlew必要时会去网络下载所需要的gradle版本。


Suggestion: use tools:overrideLibrary="android.support.v17.leanback" to force usage

在manifest中添加,不要忘了也要包含xmlns:tools="http://schemas.android.com/tools"

Gradle常见概念讲解&版本问题报错的处理方案_第6张图片
image

编译太慢

Gradle编译特别慢,一直在 resolve dependency

一般是Android Studio升级后,没有找到相应的gradle版本。鉴于国内的网络环境,下载过程会非常长。可以尝试用本地离线模式


Gradle常见概念讲解&版本问题报错的处理方案_第7张图片
i

Gradle常见概念讲解&版本问题报错的处理方案_第8张图片
j

离线模式需要曾经编译成功过的,才能使用

Gradle sync failed: Could not run build action using Gradle distribution 'https://services.gradle.org/distributions/gradle-3.3-all.zip’

gradle下载不下来,建议用本地gradle。将https://services.gradle.org/distributions/gradle-3.3-all.zip下载,解压,设置gradle home为解压目录(有bin的那个就是)

Gradle常见概念讲解&版本问题报错的处理方案_第9张图片
local gradle

更改后,如果还是很慢,需要检查一下 gradle plugin 版本是否对应

你可能感兴趣的:(Gradle常见概念讲解&版本问题报错的处理方案)