gradle+android+idea上手笔记

预热

什么是gradle
gradle是一个构建工具,它可以帮助我们构建android项目,只是上手的话,只需要知道这么多就够了。

gradle能做什么
gradle能够替代IDE做所有的构建相关的事情:构建android项目、编译、打包、运行、混淆、签名、发布组件等等。

为什么用gradle
我们总是需要一种构建项目的工具的,当然可以不用gradle,只用IDE本身,或者ant都可以。

gradle只是一个工具,喜欢就用,不喜欢就不用,觉得高效就用,不高效就不用。

如果非要找出理由,那可能是:

  • 如果用过ant构建项目,再用gradle就感觉原来构建项目也可以如此智能,简单;
  • 与IDE相比,虽然要多写一份配置,但从此引入库工程不再需要下载、导入、配置这么繁琐的过程,在gradle中这只需要几行代码;
  • 在项目管理方面,maven的配置似乎是一场噩梦,而写gradle的过程则会让人感觉轻松愉快;

gradle接管了从构建、依赖管理、运行、打包所有的工作,并且配置的过程简单,清晰,这是它的魅力所在。

gradle的妙处,用过才知道。


第一个gradle脚本

一般来说无需每个新项目都重新写脚本,只需要将现有项目的脚本copy到新项目中改一改即可。

下面是一个最简单的脚本:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.3'
    }

}

apply plugin: 'android'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }

    signingConfigs {
        myConfig {
            storeFile file('release.jks')
            storePassword "123"
            keyAlias "firstGradleProj"
            keyPassword "123"
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.myConfig
        }
    }
}

你可以将这个脚本作为初始脚本,用在第一个接入gradle的项目中,稍作修改即可适用于你的项目。

来解释一下上面的脚本的语法:

buildscript:用于配置脚本运行的环境。gradle的一个强大之处是其功能被插件化,我们可以在buildscript中集成需要使用的插件。每集成一个新的插件,需要配置插件的下载地址和依赖路径。gradle插件自身也是在maven中管理的,因此想要知道最新的gradle版本,就到maven中央仓库中查询。

repositories:依赖的jar、库项目所在的下载地址,可能的值是maven、jcenter、ivy、url等等。这个值可以出现在多个地方,在buildscript中出现的作用就是告诉gradle从哪里下载插件,配置在buildscript外边,则是告诉gradle项目所依赖的jar、库项目等从哪里下载。

dependencies:配置依赖项目的参数,类似maven。语法是:group:name:version。例如gradle插件的group=com.android.tools.build;name=gradle;version=1.1.3,所以在classpath中配置的值就是:com.android.tools.build:gradle:1.1.3。

apply plugin:安装插件。后面的字符串值是固定的,我们的android项目需要安装构建android项目的插件,即’android’。

android:这里面的内容便是专用于构建android项目的配置了。

compileSdkVersion & buildToolsVersion:见名知意,就是编译项目所用的sdk版本以及编译工具的版本。compileSdkVersion的值即为idea项目中project.properties的target值(注意只是target中的数字);buildToolsVersion则是SDK Manager中的Android SDK Build-tools版本号。

sourceSets:告诉gradle去哪里找源代码、资源等文件。这些路径适宜build.gradle当前所在目录为根目录的。这些路径在没有配置sourceSets的情况下,默认值是src/main/java/*。如果是将现有项目接入gradle,则需要显示定义sourceSets告诉gradle去新的位置找资源文件。

  • java.srcDirs:配置src目录
  • res.srcDirs:配置res目录
  • manifest.srcFile:配置AndroidManifest.xml文件
  • assets.srcDirs:配置assets资源文件

signingConfigs:签名配置。包含在该配置中的子配置名称是自定义的,例如myConfig。在自配置中的常用属性有四个:

  • storeFile file:签名文件路径,直接输入名称表示在build.gradle同级目录下寻找签名文件
  • storePassword:签名密码
  • keyAlias:别名
  • keyPassword:别名密码

buildTypes:配置构建类型,常用的属性是release和debug。配置签名的时候,语法相对固定,在release中添加属性:signingConfig,然后引用在signingConfigs的自定义配置。buildTypes在扩展中详细讨论。


将现有项目转为gradle项目

在Intellij Idea中,无法在不关闭项目的情况下直接转换,这点很不爽。正确的转化步骤是:

  • 如果已经配置了Gradle Home则忽略此步。需要先下载gradle,然后在Idea中配置Gradle Home:Preferences - Build, Execution, Deployment - Build tools - Gradle,右侧找到Gradle Home;
  • copy一份build.gradle脚本到现有的项目中,放到根目录下。注意配置sourceSets,对应于自己已有项目的各个目录;
  • 配置sdk的目录。在项目的根目录下添加local.properties文件,设置sdk的路径。语法大致如下:
sdk.dir=/xxx/xxx/adt/sdk 
  • 激活gradle控制窗口。有两种办法:
    1. 关闭项目,然后重新import projects,选择”Import project from external model”,在下面的选项中选择gradle;
    2. 关闭项目,使用open操作,打开项目,此时idea发现项目中包含有build.gradle文件,在右上角弹出对话框询问是否要将项目转为gradle项目,如图所示:
      gradle导入提示
      点击”Import Gradle project”,然后按照配置向导一步步执行下去即可;
      激活的gradle控制窗口在IDE的右边栏,点击展开,如下图所示:
      这里写图片描述
      展开项目就会看到gradle android插件支持执行的task了。

首次使用gradle会非常慢,gradle plugin需要先将自身从maven仓库中下载,然后进行一些初始化配置。

如果脚本编写错误,在导入项目的时候可能会报错,但不论是否成功,都会激活gradle window,此时可以修正脚本后,通过gradle window重新编译


构建apk

build
gradle的所有操作都是封装成task的,每个task之间可以有依赖关系。这点与ant相似。现在我们的目标就是构建出一个apk包,我们所要做的只是在gradle窗口中双击”build”。在idea下方的Run窗口中展示了gradle的运行log,看到”BUILD SUCCESSFUL”的字样后,表示构建已经成功。

在执行build构建的过程中,自动进行编译等操作,这些操作所在的task是build这个task依赖的,因此他们会首先被执行。

输出
gradle将所有的构建输出都放在了build文件夹下。执行了build task之后,根目录下就会出现build文件夹,apk在{Project Root}/build/outputs/apk/下。

该目录下会有多个apk出现。这是因为一个Android项目至少拥有两个输出:debug APK和release APK。这两个版本的apk通过名称很容易起区分。unsign后缀表示未经过签名的apk,unaligned表示未经过align优化的版本。这里的debug和release与应用内部标记debug还是release的开关没有任何关系,区别主要是两点:

  • 通过buildTypes的配置,使得debug和release能同时安装在一台设备上;
  • debug使用debug签名,release需要用户配置正式签名,然后直接编译生成正式的apk;

gradle对构建的优化
使用gradle构建项目的速度非常快,因为gradle会监控项目的变化,每次build只会执行变动部分对应的task。这一点可以从Run窗口的log中看到,所有没有变化的task的最后都会有”UPDATE-TO-DATE”的字样。


gradle使用技巧

自动编译build脚本
对build.gradle的每一次改动,idea都会弹出提示询问是否同步改动,点击同步后,在gradle窗口中会展示新增插件支持的task;

快速执行task
双击gradle window中的task即可执行该task,然后该task会同时出现在gradle window中的Recent tasks以及上方的执行下拉列表中,之后的运行可以直接点击”运行”按钮即可重复执行刚才的任务;

在命令行执行gradle task
将gradle的目录配置在系统变量中,即可在终端下运行gradle的命令,在Intellij Idea的Terminal中亦可执行gradle命令。但一般来说使用idea即可完成大部分操作。

常用的命令有:
gradle tasks 查看当前所有插件支持的task
gradle tasks –all 查看当前所有插件支持的task,同时展示这些task的作用,以及它们依赖的其他插件是什么


扩展

常用task
init:用于初始化gradle项目
clean:执行该task将删除build目录
build:编译并生成debug和release包
assembleDebug:编译并生成两个debug包,其中一个是未经过zipalign优化的
assembleRelease:编译并生成两个release包,其中一个是未经过zipalign优化的
runRelease:编译并生成apk包、安装、运行(需要安装android-command插件)

插件
gradle以插件化的方式来集成更多功能。集成插件的语法是:

apply plugin: '插件名称'

譬如上面的简单脚本中就是”android”,还可以是”java”。

下面推荐一个插件,可以直接将生成的apk包安装到手机上并运行。在gradle脚本中添加如下代码:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.novoda:gradle-android-command-plugin:1.4.0'
    }

    apply plugin: 'android-command'
}

在idea的Terminal中输入gradle tasks,可以看到这些新增的tasks:

ADB command for variant Debug tasks
-----------------------------------
clearPrefsDebug - clears the shared preferences on the specified device for variant Debug
installDeviceDebug - installs the APK on the specified device for variant Debug
monkeyDebug - calls the monkey command on the specified device for variant Debug
runDebug - installs and runs a APK on the specified device for variant Debug
uninstallDeviceDebug - uninstalls the APK from the specific device for variant Debug

ADB command for variant Release tasks
-------------------------------------
clearPrefsRelease - clears the shared preferences on the specified device for variant Release
installDeviceRelease - installs the APK on the specified device for variant Release
monkeyRelease - calls the monkey command on the specified device for variant Release
runRelease - installs and runs a APK on the specified device for variant Release
uninstallDeviceRelease - uninstalls the APK from the specific device for variant Release


参考

gradle官方文档
gradle plugin用户指南官方文档
gradle plugin用户指南中文版

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值