Android之gradle相关

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010144805/article/details/81950117

简述

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主,当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。

注意:gradle和android gradle插件是有区别的,android gradle插件依赖于gradle。

AndroidStudio中gradle配置

在setting下gradle下设置gradle选择“use defalut gradle wrapper(recommended)”时,AS就会根据{project.dir}\gradle\wrapper\gradle-wrapper.properties文件中的配置去gradle。

配置的gradle必须在缓存目录( “用户主目录/.gradle/wrapper/dists/gradle-..*”)或者在as安装目录下的gradle目录下存在对应的版本。

例如:我的项目中gradle-wrapper.properties

#Tue Aug 14 15:22:35 CST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-3.5-all.zip

这个配置的gradle如果在目录“用户主目录/.gradle/wrapper/dists/..”存在的话,as就不会去https://services.gradle.org/distributions/gradle-3.5-all.zip去下载了,as就会利用该目录下的缓存,如果该目录下不存在gradle的话as就会去站点根据gradle的版本去下载到“用户主目录/.gradle/wrapper/dists/gradle-3.5-all”目录下。

我的gradle位置:

C:\Users\chaos\.gradle\wrapper\dists\gradle-3.5-all

如果选择的是“use local gradle distribution”的话表示用的是本地的gradle,本地的gradle是在as的主目录下的gradle目录下,比如我的电脑D:\Program Files\Android\Android Studio\gradle\gradle-4.4,而不会去缓存目录 “用户主目录/.gradle/wrapper/dists/gradle-..*”中去找。

AndroidStudio中gradle插件的配置

上面讨论的是gradle的配置,下面我们来说说android gradle 插件的配置,我们通过工程顶级的build.gradle(不是module的build.gradle)来设置android gradle插件。

dependencies {
    classpath 'com.android.tools.build:gradle:2.2.3'

这里配置的android gradle插件的版本是2.2.3,而gradle版本是3.5。

下面是android studio版本,android gralde 插件,gradle版本的版本关系对应表

android studio version Plugin version Required Gradle version
1.0.0 1.0.0 - 1.1.3 2.2.1 - 2.3
1.2.0 - 1.3.1 2.2.1 - 2.9
1.5.0 2.2.1 - 2.13
2.0.0 - 2.1.2 2.10 - 2.13
2.1.3 - 2.2.3 2.14.1+
2.3.0+ 3.3+

官方的文档:http://tools.android.com/tech-docs/new-build-system/version-compatibility

Redirecting to https://developer.android.com/studio/releases/gradle-plugin.html#updating-gradle

所有android gradle 插件版本以及特征见 http://tools.android.com/tech-docs/new-build-system

邓凡平详细介绍groovy特定领域语言:http://www.infoq.com/cn/articles/android-in-depth-gradle/

配置gradle环境变量

GRADLE_PATH=C:\Users\chaos\.gradle\wrapper\dists\gradle-3.5-all\exhrs6ca08n232b14ue48lbye\gradle-3.5\bin
%GRADLE_PATH%;再添加到path中

注意:

  • cmd运行gradle,如果JAVA_HOME没有配置,会提醒配置。
  • 如果升级了gradle,需要修改gradle的环境变量。

gradlew命令

在bin目录下新建GradleW目录,使用cmd输入gradle wrapper,在\bin\GradleW\gradle\wrapper中可以看到gradlew.bat文件。

这样就可以在GradleW目录中使用gradlew命令了,效果和gradle相同,那么区别是什么呢?

gradle版本会不断更新,每个人使用的版本可能会不同,而gradlew(wrapper)可以算是gradle的一层包装。

gradle进行构建,在wrapper目录中会生成gradle-wrapper.properties文件;

gradlew命令会根据gradle-wrapper.properties文件来使用对应的gradle进行构建,没有则会下载。

参考文章

如果发生如下错误:

Execution failed for task 'processReleaseManifest'.
Caused by: java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs

可以使用命令来查看详细原因:

gradlew processReleaseManifest --stacktrace

gradlew常用命令

./gradlew -v  版本号
./gradlew clean  clean项目,清除工程目录下的build文件夹
./gradlew build  构建项目,检查依赖并编译打包
./gradlew assembleDebug or /gradlew aD 编译并打Debug包
./gradlew assembleRelease or /gradlew aR 编译并打Release的包
打渠道包:
./gradlew assembleBaiduRelease 编译并打Release的百度渠道包(Baidu字段可以任意替换)
可以和productFlavors结合使用,比如定义了installRelease,uninstallRelease两个productFlavors,则可以如下命令:
./gradlew installRelease or /gradlew iR Release 模式打包并安装
./gradlew uninstallRelease or ./gradlew uR 卸载Release模式包
同样地:
./gradlew installDebug or /gradlew iD Debug 模式打包并安装
./gradlew uninstallDebug or ./gradlew uD 卸载Debug模式包
命令可以叠加使用,例如:
./gradlew clean build --info > bugtags.log
./gradlew uD iD

gradle编译指定模块

方法一:

1、gradle tasks看看有哪些task,能不能找到对应的task
2、如果找到对应的task,则gradle xxxTask
3、如果没有找到,建议copy要编译的模块,单独打包

参考链接

方法二:

gradle :子模块名:任务名

例如报错 Execution failed for task ‘:videopatrol:processReleaseManifest’,可以通过如下方法排查:

gradle :videopatrol:processReleaseManifest --info

发现了编译library时的一个问题原因:

AndroidManifest.xml Error:tools:replace specified line:6 for attribute tools:label, but no new value specified.

这里指的是,在manifest中中设置tools:replace时,不能加入没有在设置的属性名。

AS创建项目中的gradle.properties默认配置

android.useDeprecatedNdk=true
# 编译时使用守护进程
org.gradle.daemon=true
#JVM最大允许分配的堆内存,按需分配
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m  -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#使用并行编译
org.gradle.parallel=true

如果是多个module会发现并行编译4个module,推测默认并行编译数为4,而且编译完一个才会在剩余的module中编译下一个。

Unsupported major.minor version 52.0问题处理

gradle命令编译时报错:com/android/build/gradle/LibraryPlugin: Unsupported major.minor version 52.0

为什么出现Unsupported major.minor version 52.0?

stackoverflow找到了本质原因

You get this error because a Java 7 VM tries to load a class compiled for Java 8
Java 8 has the class file version 52.0 but a Java 7 VM can only load class files up to version 51.0
In your case the Java 7 VM is your gradle build and the class is com.android.build.gradle.AppPlugin

简单来说,就是java的编译环境版本太低,java 8 class file的版本是52,Java 7虚拟机只能支持到51。所以需要升级到java 8 vm才行。

为什么gradle命令和android studio按钮运行结果不一样?

按如下路径查找AS的JDK位置:

Android Studio -> Project Structure -> SDK Location -> JDK location

Android Studio使用了自带的JDK环境,其地址为:D:\Program Files\Android\Android Studio\jre

而gradle命令的执行环境是配置在项目工程中的gradle.properties中的,默认指向为JAVA_HOME环境变量的位置。

解决的办法如下:

如果gradle.properties中没有org.gradle.java.home则默认JAVA_HOME,需要新增:

org.gradle.java.home=D:\\Program Files\\Android\\Android Studio\\jre

如果有则将其修改为上面的值。

注意:如果写成org.gradle.java.home=D:\Program Files\Android\Android Studio\jre,会提示Invalid Directory。

参考链接

gradle指定相应JDK编译

电脑中装有多个jdk版本,可能默认的jdk是1.6,如果不想更改的你的JAVA_HOME,下面有几种解决办法:

1.IDEA编译器:比如Android studio.可以在File->Project structure->SDK Location中去指定你的jdk路径

2.build.gradle中添加

compileOptions {  
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}   

compileOptions添加在build.gradle的android闭包中

3.在gradle.properties中添加

org.gradle.java.home=your jdk path

4.如果你是直接通过命令行执行任务,比如./gradlew build等,可以使用

gradle build -D org.gradle.java.home=’your jdk path’

命令行带参数的方式执行

猜你喜欢

转载自blog.csdn.net/u010144805/article/details/81950117
今日推荐