快速掌握 Android Studio 中 Gradle 的使用方法

2023-11-11


Gradle是可以用于Android开发的新一代的 Build System, 也是 Android Studio默认的build工具。

Gradle脚本是基于一种JVM语言 -- Groovy,再加上DSL(领域特定语言)组成的。

因为Groovy是JVM语言,所以可以使用大部分的Java语言库。所谓DSL就是专门针对Android开发的插件,比如标准Gradle之外的一些新的方法(Method)闭包(Closure)等。

由于Gradle的语法足够简洁,而且可以使用大部分的java包,当之无愧地成为新一代 Build System。

使用Android Studio新建一个工程后,默认会生成两个build.gralde文件,一个位于工程根目录,一个位于app目录下。还有另外一个文件 --settings.gradle

根目录下的脚本文件是针对module的全局配置,它的作用阈所包含的所有 module 是通过settings.gradle来配置。

app文件夹就是一个module,如果在当前工程中添加了一个新的module -- lib,就需要在settings.gralde文件中包含这个新的module。


gradle脚本的基本结构

用我现在的工程举例来说,根目录的build.gradle的内容如下所示:

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. // Top-level build file where you can add configuration options common to all sub-projects/modules.  
  2.   
  3. buildscript {  
  4.     repositories {  
  5.         jcenter()  
  6.     }  
  7.     dependencies {  
  8.         classpath 'com.android.tools.build:gradle:1.0.0-rc4'  
  9.   
  10.         // NOTE: Do not place your application dependencies here; they belong  
  11.         // in the individual module build.gradle files  
  12.     }  
  13. }  
  14.   
  15. allprojects {  
  16.     repositories {  
  17.         jcenter()  
  18.   
  19.         maven {  
  20.             url 'http://mvnrepo.xxx.com/mvn/repository'  
  21.         }  
  22.     }  
  23. }  

classpath 'com.android.tools.build:gradle:1.0.0-rc4'就是Android特有的插件,maven仓库位于通过方法jCenter() 获取,这也是默认的maven仓库。当然也可以添加额外的maven仓库地址,例如以上文件中的

maven {
    url 'http://mvnrepo.xxx.com/mvn/repository'
}


然后是 settings.gradle 文件:

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. include ':app'  

app就是项目包含的一个module,如果有多个module,可以在为 include 方法添加多个参数。



最后是app/build.gradle

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. apply plugin: 'com.android.application'  
  2.   
  3. android {  
  4.     compileSdkVersion 21  
  5.     buildToolsVersion "21.1.1"  
  6.   
  7.     compileOptions {  
  8.         sourceCompatibility JavaVersion.VERSION_1_7  
  9.         targetCompatibility JavaVersion.VERSION_1_7  
  10.     }  
  11.   
  12.   
  13.     defaultConfig {  
  14.         applicationId "your.application.id"  
  15.         minSdkVersion 14  
  16.         targetSdkVersion 21  
  17.         versionCode 2  
  18.         versionName "2.0.0"  
  19.     }  
  20.   
  21.     signingConfigs {  
  22.         release {  
  23.             storeFile file('release.keystore')  
  24.             storePassword "yourstorepassword"  
  25.             keyAlias "yourkeyalias"  
  26.             keyPassword "yourkeypassword"  
  27.         }  
  28.         debug {  
  29.             storeFile file('debug.keystore')  
  30.         }  
  31.     }  
  32.   
  33.     buildTypes {  
  34.         release {  
  35.             minifyEnabled true  
  36.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  37.             signingConfig signingConfigs.release  
  38.         }  
  39.         debug {  
  40.             signingConfig signingConfigs.debug  
  41.         }  
  42.     }  
  43.   
  44.     productFlavors {  
  45.         inner {  
  46.             applicationId "your.application.inner.id"  
  47.             versionName "2.0.0"  
  48.         }  
  49.   
  50.         market {  
  51.   
  52.         }  
  53.     }  
  54. }  
  55.   
  56. repositories {  
  57.     flatDir {  
  58.         dirs 'libs'  
  59.     }  
  60. }  
  61.   
  62. dependencies {  
  63.   
  64.     // 通用  
  65.     compile name: 'volley', ext: 'aar'  
  66.     compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'  
  67.     compile 'com.alibaba:fastjson:latest.integration'  
  68.   
  69.     // 项目相关(已删除)  
  70. }  

Groovy 的基本语法

方法调用

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. apply plugin: 'com.android.application'  

以上语句中的apply是一个方法,给它传递了一个参数pluginplugin 的值是'com.android.application'

如果有多个参数,则以逗号隔开,例如

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. <code>compile name: 'volley', ext: 'aar'</code>  

闭包

Groovy中花括号包含的部分成为一个闭包(Closure)。例如下面的代码

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. compileOptions {  
  2.     sourceCompatibility JavaVersion.VERSION_1_7  
  3.     targetCompatibility JavaVersion.VERSION_1_7  
  4. }  

compileOptions 是一个 Method, 它的参数是一个闭包,这个闭包内依次执行了两个方法 -- sourceCompatibility 和targetCompatibility, 参数都是JavaVersion.VERSION17

闭包也可以嵌套包含

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. repositories {  
  2.     flatDir {  
  3.         dirs 'libs'  
  4.     }  
  5. }  

常见使用方法

包依赖(aar)


使用aar时可以分为两种情况

① aar位于本地目录

  1. 首先在 android 的参数闭包中添加调用方法 repositories

    [plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
    1. repositories {  
    2.     flatDir {  
    3.         dirs 'libs'  
    4.     }  
    5. }  
  2. 然后在 dependencies 的参数闭包中添加

    [plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
    1. compile name: 'volley', ext: 'aar'  

② aar位于远程仓库

这里以maven为例,当然也可以使用其他类型的仓库,例如 Ivy

只需要在jar包引用方式后面添加一个@aar就可以了

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. compile 'com.alibaba:fastjson:latest.integration@aar'  

包依赖(jar)

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. compile group: 'com.alibaba', module: 'fastjson', version: 'latest.integration'  

可以简写成

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. compile 'com.alibaba:fastjson:latest.integration'  

latest.integration可以替换成具体的版本号,这里是获取服务器上的最新版本。

去掉重复依赖

[plain]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. compile 'com.alibaba.fastjson.latest.integration' {  
  2.     exclude module: 'annotations', group: 'com.google.android'  
  3. }  

使用 Java7

[plain]  view plain  copy  print ?
  1. compileOptions {  
  2.     sourceCompatibility JavaVersion.VERSION_1_7  
  3.     targetCompatibility JavaVersion.VERSION_1_7  
  4. }  

productFlavors

针对不同的APP分发渠道,我们可以定义不同的 product flavor。也可以定义内部版本外部版本,内部版本中包含了一些调试代码,这些代码在发布时并不会被编译进最后的APP中。而且可以分别为内部版本和外部版本指定不同的ApplicationId,这样在同一个设备上可以同时安装两个版本以方便调试。

命令行执行Gradle脚本

在Android工程根目录下会自动生成一个shell脚本 - gradlew,执行之前记得加上x属性 - chomod +x gradlew

gradle脚本中包含了很多 task,可以通过task名来指定需要执行的task。

  • ./gradlew build
  • ./gradlew assemble
  • ./gradlew assembleInnderDebug

总结

不得不说,Gradle实在太好用了!虽然 Gradle 可以与 Ant 或 maven 配合使用,但是其简洁和功能性远远超过其他两个。我现在开发的项目普遍使用的是 maven,不知道什么原因,使用Gradle时经常会遇到一些无法获取远程依赖包的问题,最简单的解决办法就是把依赖包下载的本地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速掌握 Android Studio 中 Gradle 的使用方法 的相关文章

  • Android - 如何一次只允许播放一个 MediaPlayer 实例?

    我正在尝试创建一个简单的 Sound board Android 应用程序 使用 ListView 项目作为按钮 顺便说一句 我是一个新手程序员 我的想法是 我按下一个按钮 就会播放一个特定的声音文件 如果我在播放声音时按下任何按钮 它应该
  • Android 应用程序在后台运行时保存数据

    目前我正在开发 xmmp 客户端 当应用程序位于前台时 该客户端工作得很好 但由于事实上 当应用程序处于后台时 我在 Application 类中保存了大量数据 复杂的 ArrayList 字符串和布尔值作为公共静态 每个字段都被垃圾收集
  • Groovy - JsonSlurper 解析 JSON 文件

    我有一个类似于下面的 JSON 文档 我正在尝试在 Groovy 中解析它 基本上对于每所学校 学校信息 我想抓住SCHOOL COUNTRY和其他领域 我正在尝试下面的代码 但它没有返回我需要的内容 对于列出的每所学校 1 000 所 我
  • 如何从 SQLite 获取记录总数

    我正在尝试从 Sqlite DB 获取行的总数 以下是我想要做的代码片段 我不知道我在这里做错了什么 public static int getTotalCount Context context Cursor c null try c g
  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • (Ionic 2)尝试回退到 Cordova-lib 执行时发生错误:TypeError:无法读取未定义的属性“then”

    Edit 使用 ionic 2 时会发生这种情况 我知道它还不稳定 但我认为可能有一些解决方案 因为其他人似乎没有遇到这个问题 Edit end 由于某种原因 我在尝试使用 ionic build android 和 ionic build
  • RxJava、Proguard 和 sun.misc.Unsafe

    我有以下问题RxJava 1 1 0 使用时Proguard 我没有更改 RxJava 版本或其 pro文件 但更新后OkHttp我无法编译使用Proguard因为我有关于sun misc Unsafe不在场 rxJava pro keep
  • 无法在自定义 AOSP 上安装 Google Play 中的某些应用程序:项目不可用。理由:9

    我在尝试从 Google Play 安装某些应用程序时收到以下错误 LibraryUtils isAvailable not available restriction 9 DocUtils getAvailabilityRestricti
  • 如果我们使用后退按钮退出,为什么 Android 应用程序会重新启动?

    按住主页按钮并返回应用程序时 应用程序不会重新启动 为什么使用后退按钮会重新启动 如果我们使用后退按钮退出 有什么方法可以解决在不重新启动的情况下获取应用程序的问题吗 请帮忙 当您按下Home按钮 应用程序将暂停并保存当前状态 最后应用程序
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • Android Studio:无法启动守护进程

    当我尝试在 Android Studio 中导入 gradle 项目时 遇到以下错误 Unable to start the daemon process This problem might be caused by incorrect
  • 如何在不更改手机语言的情况下更改Android应用程序语言?

    我希望用户在应用程序内选择一种语言 选择语言后 我希望字符串使用特定语言 如果我更改手机语言 那么我的应用程序将以设置的语言运行 我无法找到任何在不更改手机语言的情况下设置语言的方法 此外 一旦设置了语言 更改就应该反映出来 有人可以建议一
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • 当手机旋转(方向改变)时如何最好地重新创建标记/折线

    背景 开发一个使用 Android Google Map v2 的本机 Android 应用程序 使用android support v4 app FragmentActivity 在 Android v2 2 上运行 客观的 在更改手机方
  • Android:有没有办法以毫安为单位获取设备的电池容量?

    我想获取设备的电池容量来进行一些电池消耗计算 是否可以以某种方式获取它 例如 三星 Galaxy Note 2 的电池容量为 3100mAh 谢谢你的帮助 知道了 在 SDK 中无法直接找到任何内容 但可以使用反射来完成 这是工作代码 pu
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ

随机推荐

  • VScode 黄色波浪线,Import “[module]“ could not be resolvedPylance

    文章目录 问题描述 解决方案 1 修改vscode的python环境 2 修改 vscode seteing json 文件 问题描述 大致的错误截图 第三方包 自己的代码库 导入不成功 显示黄色波浪线 代码自动提示功能受限 解决方案 可按
  • 斯坦福 机器学习-第二章 生成学习算法

    CS229 Lecture notes 原作者 Andrew Ng 吴恩达 翻译 CycleUser Part IV 生成学习算法 Generative Learning algorithms 目前为止 我们讲过的学习算法的模型都是p y
  • java--基础--17.1--线程--实现多线程,线程方法

    java 基础 17 1 线程 实现多线程 线程方法 1 概念 进程 正在运行的程序 每个进程可以由多个线程组成 线程 是进程中的单个顺序控制流 是一条执行路径 并行 指在某一个时间点执行多个任务 并发 指在某一个时间段执行多个任务 2 实
  • 【Android】App开发-动画效果篇

    在我们玩手机的过程中 如果我们点击某一个页面时 会出现一个页面动画加载或者动画效果的现象 现在我们就来看看App开发中是如何实现动画效果的 目录 动画的分类 逐帧动画 补间动画 动画的分类 在常见的app使用的动画中 常见的就是逐帧动画 补
  • confluence安装

    注 安装前确保机器已安装docker 1 执行如下命令一键安装wiki mkdir p data cd data wget http apk lingyun5 com confluence wiki tar gz tar zxvf conf
  • 学习sql,你需要知道这些

    这里写目录标题 数据库的分类 开发式数据库 非开发式数据库 事务 什么是事务 事务的四种特性 死锁 什么是死锁 死锁的四个条件 如何处理死锁 预防死锁 避免死锁 检测死锁 解除死锁 什么是navicat SQL语句 对数据库的操作 对表的操
  • 数字图像处理:使用直方图统计进行图像增强

    一 引言 在 数字图像处理 局部直方图处理 Local Histogram Processing https blog csdn net LaoYuanPython article details 120383974 介绍了基于像素的邻域进
  • 工具类之FastDFSClient

    import org csource common MyException import org csource common NameValuePair import org csource fastdfs import org spri
  • 【GRU时序预测】基于贝叶斯网络优化卷积神经网络结合门控循环单元BO-CNN-GRU实现数据股价预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • c语言 --- 指针

    什么是指针 指针就是一个地址 在c语言中任何东西都是有地址的 如何获取地址 用的是 取地址符 指针就是一个整数 获取指针 定义变量时 可以通过取地址符 得到当前变量的地址 gt 一个房间对应一个房间号 地址类比于房间号 所有的指针类型都是
  • jpa 动态参数查询 高级查询

    GetMapping find ApiOperation 通用查询 ScSecurityPermission name 通用查询 public ScResult find FileInfo fileInfo RequestParam nam
  • JS获取json子项/数组的个数/长度

    JS获取json子项 数组的个数 长度 微信小程序获取json格式数据的个数 长度
  • java 请求参数加解密

    项目开发中 需要针对请求参数加密 解密操作 可以使用下列工具类 oap security enabled true oap security enableIgnoreAnnotation true oap security secretKe
  • [4G/5G/6G专题基础-158]: 5G VoNR(Voice over NR)与VoLTE共同组成5G三大语音方案

    目录 第1章 语音方案概述 1 1 VoLTE概述 1 2 5G VoNR概述 第2章 5G VoNR网络架构 2 1 基本原则 2 2 NSA VoLTE方案 2 3 SA EPS Fallback SA组网 早期方案 2 4 SA Vo
  • 对于售点POI标签计算脚本优化总结

    对于售点POI标签计算脚本性能优化总结 减少udf 函数的使用多多使用spark的算子 对于两组经纬度的距离计算可以使用常规的公式计算法 Haversine 公式是一种用于计算两个球面坐标点 经度和纬度 之间的距离的公式 它的原理是基于球面
  • netpoll浅析

    netpoll只是一种框架和一些接口 只有依赖这个框架和接口实现的netpoll实例 netpoll才能发挥它的功能 类似于kernel中的vfs vfs本身并不会去做具体的文件操作 只是为不同的文件系统提供了一个框架 netpoll不依赖
  • 理解编程中的while循环(C/C++)

    固定的语法结构 省略 include 和 using int main printf x 我们写这个代码 打了一个int main 然后打了一个大括号 为什么要这样做 这个main 是一个函数 但为什么一定要叫main 为什么又需要打 又需
  • JS中的递归

    1 什么是递归 如果一个函数在内部可以调用其本身 那么这个函数就是递归函数 简单理解 函数内部自己调用自己 这个函数就是递归函数 比如 但上面代码报错因为递归很容易发生 栈溢出 错误 stack 所以必须要加退出条件 return 递归必须
  • python读取csv文件内容,并保存到数据库中

    coding utf 8 python读取csv文件内容 并保存到数据库中 import csv import time import pymysql import emoji num 0 file path r H 20221103174
  • 快速掌握 Android Studio 中 Gradle 的使用方法

    Gradle是可以用于Android开发的新一代的 Build System 也是 Android Studio默认的build工具 Gradle脚本是基于一种JVM语言 Groovy 再加上DSL 领域特定语言 组成的 因为Groovy是