AndroidStudio中Gradle使用命令集合

Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言(DSL)。
本文主要总结gradle的一些常用命令,以及一些参考文档


gradle介绍

gradlew代表 gradle wrapper,意思是gradle的一层包装。
gradlew命令一般是 ./gradlew +参数 的形式(据我在Terminal中使用,直接gradlew + 参数更靠谱,不行的话就配置下环境)。
在gradle/wrapper/gralde-wrapper.properties文件中,有声明了它指向的目录和版本。

gradle命令

常用命令

  • gradlew -v 查看版本号

  • gradlew clean 清除app目录下的build文件夹

  • gradlew build 检查依赖并编译打包(命令把debug、release环境的包都打出来)

    • gradlew assembleDebug 编译并打Debug包(可简写gradlew aD)
    • gradlew assembleRelease 编译并打Release的包
    • assemble还可以和productFlavors结合使用: (如:gradlew assembleFlavor1 编译并打Flavor1包)
    • gradlew installRelease Release模式打包并安装
    • gradlew uninstallRelease 卸载Release模式包
    • gradle build –parallel –parallel-threads=N 并行编译模式
  • gradlew tasks 列出所有task

  • assemble结合Build Variants来创建task

    • gradlew assembleWandoujia (编译并打Wandoujia下的Debug和Release包)
    • gradlew assembleWandoujiaRelease (编译并打Wandoujia下的Release包)

自定义命令

比如我们想根据不同的参数来进行不用的编译配置,可以在gradlew中加入自定义参数。

  • gradlew assembleDebug -P -arg=true

就可以在build.gradle中使用如下代码来判断:

1
2
3
if (project.hasProperty('arg')){

}

Gradle配置

Gradle构建脚本 build.gradle
Gradle属性文件 gradle.properties
Gradle设置文件 settings.gradle

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}
  • buildscript{}设置脚本的运行环境。

  • repositories{}支持java依赖库管理,用于项目依赖。

  • dependencies{}依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件。如果前面定义了repositories{}maven 库,则使用maven的依赖库,使用时只需要按照用类似于com.android.tools.build:gradle:0.4,gradle 就会自动的往远程库下载相应的依赖。

  • apply plugin:声明引用插件的类型

    1
    2
    3
    4
    5
    apply plugin: 'com.android.application' //声明这个模块是一个Android应用程序

    apply plugin: 'com.android.library' // 声明这个模块是一个Android应用程序库

    apply from:'config.gradle' //表示引用其他的配置文件
  • gradlew build –info –debug –stacktrace //调试模式构建并打印日志

  • gradlew build –info //编译并打印日志

  • gradlew clean –refresh-dependencies build //强制更新最新依赖,清除构建并构建

  • android{} //不做解释了,可参考apk打包配置

gradle.properties

  • 内部常用参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 开启并行编译
    org.gradle.parallel=true
    # 开启守护进程
    org.gradle.daemon=true
    # 按需编译
    org.gradle.configureondemand=true
    # 设置编译jvm参数
    org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
    # 设置代理
    systemProp.http.proxyHost=127.0.0.1
    systemProp.http.proxyPort=10384
    systemProp.https.proxyHost=127.0.0.1
    systemProp.https.proxyPort=10384
    # 开启JNI编译支持过时API
    android.useDeprecatedNdk=true
  • 可在 gradle.properties 文件中配置一些变量,用于动态修改的属性统一,不再需要改指定模块,如:

    1
    2
    3
    4
    5
    MIN_SDK_VERSION=21
    TARGET_SDK_VERSION=22
    VERSION_CODE=200100
    VERSION_NAME=2.1.0
    RX_ANDROID_VERSION=1.2.0
  • 在 build.gradle 中可以通过project进行获取或者 “${RX_ANDROID_VERSION}” 引用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
      defaultConfig {
    applicationId "com.example.heqiang.testsomething"
    minSdkVersion project.MIN_SDK_VERSION as int
    targetSdkVersion project.TARGET_SDK_VERSION as int
    versionCode project.VERSION_CODE as int
    versionName project.VERSION_NAME
    /*
    * as int 关键字是用来进行类型转换的,因为从配置里面读取出来的默认是字符串
    *还可以使用 versionCode Integer.parseInt(project.VERSION_CODE)
    **/

    //以下用于打印调试 (在 Gradle Console 中就可以看到打印)
    println('** build versionName=' + versionName)
    }
    // 还可以这样用
    dependencies {
    compile "io.reactivex:rxandroid:${RX_ANDROID_VERSION}"
    compile "io.reactivex:rxjava:${RX_JAVA_VERSION}"
    }

    //或
    Properties gradleProperties = new Properties()
    gradleProperties.load(project.rootProject.file('gradle.properties').newDataInputStream())
    def version = gradleProperties.getProperty('MIN_SDK_VERSION', null)
    ext {
    minSdkVersion = version
    }

或在gradle.properties 中添加

1
2
systemProp.versionName=1.0.0
systemProp.versionCode=100

获取

1
2
def code = System.properties['versionCode']
def name = System.properties['versionName']

settings.gradle

主要是调用include方法,导入工程下的各个子模块。

1
2
3
4
include ':AndroidDemo'

include ':CommonSDK'
project(':CommonSDK').projectDir = new File(settingsDir, '../../CommonSDK/')

检查依赖报告

运行命令./gradlew :dependencies –configuration compile (projectname为settings.gradle里面配置的各个project,如果没有配置,直接运行./gradlew dependencies –configuration compile),会把依赖树会打印出来,依赖树显示了你 build 脚本声明的顶级依赖和它们的传递依赖:
注意:依赖标注了*号,表示这个依赖被忽略了

如果有依赖重复怎么办呢?

  • 可使用exclude关键字,后面跟group和module,可以分别单独使用,会排除所有匹配项。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    compile ('com.jakewharton:butterknife:8.5.1'){
    exclude module: 'support-compat'
    exclude group: 'com.android.**.***', module: '***-***'
    }

    // 使用transitive属性设置为false来排除所有的传递依赖
    compile project(':extras:ShimmerAndroid'){
    transitive = false
    }
  • 如果每个模块依赖的版本号不一致,可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    configurations.all{
    resolutionStrategy{
    force'org.hamcrest:hamcrest-core:1.3'//强制修改org.hamcrest:hamcrest-core 依赖1.3版本。
    }
    }

    或根据组统一版本号
    configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    def requested = details.requested
    if (requested.group == 'com.android.support') {
    if (!requested.name.startsWith("multidex")) {
    details.useVersion '25.3.1'
    }
    }
    }
    }

AndroidStudio 提速

  • 禁用插件
    去掉一些没有用的插件Google Cloud Testing、Google Cloud Tools For Android Studio、Goole Login、Google Services、JavaFX、SDK Updater、TestNG-J

  • android studio 2.2.2新特性 编译缓存
    工程根目录 gradle.properties 文件里加上

    1
    android.enableBuildCache=true

    注:这个设置可以让Android Studio 会把依赖的 jar 或 arr 缓存到本地,并且把模块名称设置为 hash 值
    这个开启后,可能导致 includeJarFilter 配置失效,Android Studio 升级到 2.3.0修复这个问题
    每次编译生成的缓存在 $HOME/.android/build-cache
    如果缓存过多可以手动删除该目录进行清除

gradle 参考资料