当前位置:   article > 正文

Android studio 中的 Gradle_gradle在android studio中

gradle在android studio中

1、Gradle是什么,有什么作用

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。

它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。

当前其支持的语言限于Java、Groovy、Kotlin和Scala,计划未来将支持更多的语言。基于 groovy 脚本构建,其 build 脚本使用 groovy 语言编写。

android studio 中 Gradle 可以帮我们编译 构建 打包项目 可以配置自己的task任务,可以很方便的去引用第三方的类库

2、Gradle在Android studio的具体用法

太杂了,我直接贴代码吧,加有注释 build.gradle

  1. /**
  2. * Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。
  3. * 它使用一种基于 Groovy 的特定领域语言(DSL)来声明项目设置,抛弃了基于 XML 的各种繁琐配置。
  4. *
  5. * 简单来说,Gradle 是一种项目构建工具, 它可以帮你管理项目中的
  6. * 差异、依赖、编译、打包、部署 ......,你可以定义满足自己需要的构建逻辑,
  7. * 写入到 build.gradle 中供日后复用。
  8. *
  9. * Gradle 是一个构建工具,但它需要特定的插件来工作。Android Plugin for Gradle 即是 Gradle 的 Android 插件。
  10. * Android Studio 构建系统基于 Gradle,Gradle 的 Android 插件 添加了特定于构建 Android 应用程序的几项功能。
  11. * 虽然 Android 插件通常以 Android Studio 的锁定步骤更新,
  12. * 但插件(以及其余的 Gradle 系统)可以独立于 Android Studio 运行,并单独更新。
  13. *
  14. * Gradle是一个独立运行的程序,不但可以与AndroidStudio协同工作还可以和Eclipse等IDE配合使用。
  15. * 但由于Gradle发展速度比较快,导致Gradle版本不一,
  16. * 故每个 Android 插件版本(Android Plugin for Gradle)需要与特定的 Gradle 版本相匹配才能编译成功。
  17. * 为了获得最佳性能,应该使用最新版本的 Gradle 和 Android 插件。
  18. */
  19. plugins {
  20. id 'com.android.application'//应用com.android.application 插件构建此模块
  21. }
  22. //开始配置安卓特定的编译选项
  23. android {
  24. namespace 'com.example.gradledemo'
  25. compileSdk 33 //编译的SDK版本,最佳选择为最新的API级别
  26. // buildToolsVersion //编译的Tools版本,最佳选择为最新的API级别
  27. //封装默认设置和编译变量,能根据编译系统动态得重写AndroidManifest.xml中的属性
  28. defaultConfig {
  29. applicationId "com.example.gradledemo" //应用程序的包名
  30. minSdk 24 //支持的最低版本,操作系统会拒绝将应用安装在系统版本低于此标准的设备上
  31. targetSdk 33 //支持的目标版本,最佳选择为最新的API级别
  32. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //允许自动化测试
  33. versionCode 1 // 版本号
  34. versionName "1.0" // 版本名
  35. multiDexEnabled true //开启分包
  36. ndk { // 设置支持的SO库架构 这些叫 ABI,每一种都对应一种 CPU 指令集
  37. /**
  38. * Android 平台 CPU 有三大类:ARM、x86、MIPS,其中 x86、MIPS 已经被彻底淘汰了,大家集成 .so 只要考虑 ARM 平台架构就行了
  39. * ARM 平台架构主要有3种,下面说的代对应的是架构:
  40. * armeabi: 第5代、第6代 ARM 处理器,早期 android 手机用,A5/7/8/9 核心用的都是这个架构
  41. * armeabiv-v7a: 第7代、32位 ARM 处理器架构,带浮点数计算能力。A15/17 核心用的都是这个架构,一般现在也少见了,也都淘汰了
  42. * arm64-v8a: 第8代、64位 ARM 处理器架构,A32/35/53/57/72/73 核心用的都是这个架构,一般现在的 ARM 处理器都在这个范围内
  43. */
  44. abiFilters 'armeabi', 'armeabi-v7a', 'arm64- v8a', 'x86', 'x86_64'
  45. }
  46. multiDexEnabled true //是否支持分包
  47. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"//junit单元测试
  48. resConfigs 'en'//中文资源
  49. resConfigs "xhdpi" //只使用xhdpi 下的资源文件
  50. multiDexEnabled true //分包,指定某个类在main dex
  51. multiDexKeepProguard file('multiDexKeep.pro') // 打包到main dex的这些类的混淆规制,没特殊需求就给个空文件
  52. multiDexKeepFile file('maindexlist.txt') // 指定哪些类要放到main dex
  53. }
  54. //开启databind支持
  55. dataBinding {
  56. enabled = true
  57. }
  58. //签名信息
  59. signingConfigs {
  60. production {
  61. //签名文件路径
  62. storeFile rootProject.ext.signing.storeFile
  63. //密码
  64. storePassword rootProject.ext.signing.storePassword
  65. //别名
  66. keyAlias rootProject.ext.signing.keyAlias
  67. //别名密码
  68. keyPassword rootProject.ext.signing.keyPassword
  69. }
  70. }
  71. //构建类型,生成包的配置
  72. buildTypes {
  73. // 开发环境
  74. debug {
  75. debuggable true // 是否支持断点调试 默认false
  76. jniDebuggable true // 是否可以调试NDK代码 默认false
  77. renderscriptDebuggable true // 是否开启渲染脚本RenderScript调试功能,默认为false
  78. zipAlignEnabled true // 是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率 默认true
  79. minifyEnabled true // 是否对代码进行混淆,默认false
  80. shrinkResources true// 移除无用的资源文件 是否自动优化未使用的资源,该配置生效的前提是minifyEnabled必须为true,默认false
  81. // proguardFiles 指定混淆的规则文件
  82. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  83. versionNameSuffix "-debug"//可以版本名称后面追加相关信息
  84. applicationIdSuffix ".debug"//包名添加后缀 可以控制不同构建类型不同的包名
  85. //自定义资源信息相当于value 下的String.xml里的内容 debug环境下 定义响应的项目名称
  86. resValue "string", "app_name", rootProject.ext.android.debugAppName
  87. //manifest 参数配置项目图标 debug环境下的桌面图标显示 在 manifest 清单文件中引用
  88. manifestPlaceholders = [app_icon: rootProject.ext.android.debugAppIcon]
  89. //自定义参数 在 Buildconfig使用 这里不同的环境定义不同的url
  90. buildConfigField("String", "API_URL", rootProject.ext.apiUrl.debugUrl)
  91. //配置签名信息
  92. signingConfig signingConfigs.production
  93. externalNativeBuild {
  94. ndkBuild {
  95. arguments 'NDK_DEBUG=1'
  96. }
  97. }
  98. }
  99. //预上线
  100. preRelease {
  101. resValue "string", "app_name", rootProject.ext.android.preReleaseAppName
  102. manifestPlaceholders = [app_icon: rootProject.ext.android.preReleaseAppIcon]
  103. zipAlignEnabled true
  104. shrinkResources true
  105. versionNameSuffix "-preRelease"
  106. applicationIdSuffix ".preRelease"
  107. signingConfig signingConfigs.production
  108. minifyEnabled true
  109. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  110. buildConfigField("String", "API_URL", rootProject.ext.apiUrl.preRelease)
  111. }
  112. release {// 线上正式
  113. resValue "string", "app_name", rootProject.ext.android.releaseAppName
  114. manifestPlaceholders = [app_icon: rootProject.ext.android.releaseAppIcon]
  115. zipAlignEnabled true
  116. shrinkResources true
  117. signingConfig signingConfigs.production
  118. minifyEnabled true
  119. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  120. buildConfigField("String", "API_URL", rootProject.ext.apiUrl.release)
  121. }
  122. }
  123. /**
  124. * productFlavors 字面翻译是产品口味,在多渠道打包用的比较多,或者是针对同一款应用不同的使用限制。
  125. * 在productFlavors 中可以重写 defaultConfig 中的配置。在默认情况下编译系统是没有创建 productFlavors 的。
  126. * 这里示范创建了付费和免费两种产品特性,每种特性定义了不同的应用id,所以同一款手机可以同时安装者款应用
  127. */
  128. productFlavors {
  129. free {
  130. applicationId 'com.example.myapp.free'
  131. }
  132. paid {
  133. applicationId 'com.example.myapp.paid'
  134. }
  135. }
  136. /**
  137. * 拆分专用版本的apk,以减小应用的提交
  138. * 比如:jni时分别拆分成arm版和x86版或者根据屏幕密度拆分
  139. */
  140. splits {
  141. // 屏幕密度分割设置
  142. density {
  143. // 启用或禁用密度分割机制
  144. enable false
  145. // 从分割中排除这些密度
  146. exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
  147. }
  148. }
  149. // 打包完成后的一些copy操作和修改apk名字或路径等操作
  150. android.applicationVariants.all { variant ->
  151. // delete previous files first
  152. delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
  153. variant.mergeAssets.doLast {
  154. def sourceDir = "${buildDir}/../../../../.."
  155. copy {
  156. from "${sourceDir}"
  157. include "assets/**"
  158. include "src/**"
  159. include "jsb-adapter/**"
  160. into outputDir
  161. }
  162. copy {
  163. from "${sourceDir}/main.js"
  164. from "${sourceDir}/project.json"
  165. into outputDir
  166. }
  167. }
  168. //修改apk包名
  169. variant.outputs.all { output ->
  170. outputFileName = "app-${variant.name}-${defaultConfig.versionName}-${defaultConfig.versionCode}.apk"
  171. }
  172. //混淆对应文件输出
  173. variant.outputs.each { output ->
  174. if (variant.getBuildType().isMinifyEnabled()) {
  175. variant.assemble.doLast{
  176. copy {
  177. from variant.mappingFile
  178. into "${projectDir}/mappings"
  179. rename { String fileName ->
  180. "mapping-${variant.name}.txt"
  181. }
  182. }
  183. }
  184. }
  185. }
  186. }
  187. // 声明本地 aar 文件地址
  188. repositories {
  189. flatDir {
  190. dirs 'libs'
  191. }
  192. }
  193. //jdk 配置
  194. compileOptions {
  195. sourceCompatibility JavaVersion.VERSION_1_8
  196. targetCompatibility JavaVersion.VERSION_1_8
  197. }
  198. //lib包配置 设置 .so 资源路径
  199. sourceSets {
  200. main {
  201. jniLibs.srcDirs = ['libs']
  202. }
  203. }
  204. // 多渠道/多环境 的不同配置
  205. flavorDimensions("default")
  206. productFlavors {
  207. qudao1 {
  208. dimension "default"
  209. //自定义项目名称
  210. resValue "string", "app_name", "渠道1"
  211. //自定义参数 在BUildConfig 里调用
  212. buildConfigField("String", "orgId", '""')
  213. }
  214. qudao2 {
  215. dimension "default"
  216. resValue "string", "app_name", "渠道2"
  217. buildConfigField("String", "orgId", rootProject.ext.channel.csOrgId)
  218. }
  219. }
  220. //执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
  221. lintOptions {
  222. abortOnError false
  223. checkReleaseBuilds false
  224. }
  225. //文件重复
  226. packagingOptions {
  227. exclude 'lib/arm64-v8a/ffmpeg.so'
  228. }
  229. configurations {
  230. //编译期排除commons模块
  231. compile.exclude module: 'commons'
  232. //在整个构建过程中排除com.squareup.retrofit2:adapter-rxjava
  233. all*.exclude group: 'com.squareup.retrofit2', module: 'adapter-rxjava'
  234. }
  235. //全局强制使用
  236. configurations.all {
  237. resolutionStrategy {
  238. force 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
  239. }
  240. }
  241. }
  242. /**
  243. * Gradle依赖管理是依靠俩个classpath:compileClasspath、runtimeClasspath
  244. * compileClasspath:编译时能使用的代码和类,当一个组件参与编译时,Gradle会将其放在compileClasspath中
  245. * runtimeClasspath:运行时使用的代码和类,当一个组件参与打包时,Gradle就会将其放在runtimeClasspath中
  246. * 编译时:代码还在编写阶段,只要还没有编译为class,就是编译时
  247. * 运行时:当编译成class文件,在机器上运行的时候叫做运行时
  248. * compileClasspath中含有的代码和类库,是我们在编写代码的时候需要使用到的类库,如果这里面没有的类库,我们编写时是会找不到该类的
  249. * runtimeClasspath这个里面主要包括app运行时需要的类库,如果这个里面没有包含的库,那么运行时找不到类而crash
  250. * implementation、api 这些操作符只是对依赖库不同的操作方式,其核心的逻辑就是,从远程拉下来的库到底是放在compileClasspath中还是runtimeClasspath还是俩个都放
  251. */
  252. /**
  253. * 配置项目的依赖关系
  254. * 三种依赖方法:1.本地依赖,2.库依赖,3.远程依赖
  255. * 两种依赖方式:
  256. *
  257. * 1.implementation,会添加依赖到编译路径,并且会将依赖打包输出到aar/apk,但编译时不会把依赖暴露给其他moudle
  258. * 比如:A implementation B B implementation C,
  259. * 在B中,可以使用C中类库,
  260. * 在A中,不能使用C只给的类库,但是可以使用B中类库
  261. * 这是因为implementation引入的依赖,会把C加入B的compileClasspath和runtimeClasspath,会把C加入A的runtimeClasspath
  262. * 因为C没有加入A的compileClasspath,所以A没有办法在编译时访问C中的类库,又是因为C加入A的runtimeClasspath,所以A可以在运行时访问C类库
  263. *
  264. * 2.api,会添加依赖到编译路径,并且把依赖打包输出到aar/apk,依赖可以传递
  265. * 比如:A implementation B B api C,
  266. * 在B中,可以使用C中类库
  267. * 在A中,可以使用B中类库,也可以使用C中类库
  268. * 因为api引入的依赖,会把C加入B的compileClasspath和runtimeClasspath,
  269. * 同时会把C加入A的compileClasspath和runtimeClasspath,所以A也可以在编译时访问C中类库
  270. *
  271. * 3.compileOnly,依赖只在编译时使用,不会打包到aar/apk运行时不能使用
  272. * 比如:A implementation B B compileOnly C
  273. * A访问不到C的代码,B可以访问C,且C不会打包到apk中
  274. *
  275. * 4.runtimeOnly,依赖编译时不能使用,只会打包到aar/apk运行时使用
  276. * 比如:A implementation B B compileOnly C
  277. * AB都不可以调用C中代码,但是C会打包到APK中
  278. *
  279. * 5.annotationProcessor,用于注解处理器的依赖配置
  280. * 6.testImplementation,用于指定在测试代码的依赖。
  281. * 7.androidTestImplementation,用于指定在测试代码的依赖。
  282. * 8.debugImplementation,
  283. * 9.releaseImplementation,
  284. * 10.unitTestImplementation,
  285. *
  286. * isForce, 表示强制使用该版本的依赖
  287. * strictly, 一种强力版本约束,可以使用(!!)简写
  288. * exclude, 移除一个依赖,设置忽略指定的依赖,被忽略的依赖就被视为从来没有依赖,目前我测试的情况看来,这个只适用于远程依赖
  289. * transitive, 是否允许依赖传递
  290. * jar冲突, 如果app引用一个aar,arr中有一个xx.jar,而app中又再次引用这个xx.jar,
  291. * 这个时候就需要让aar中引用jar的操作符用 compileOnly 代替 implementation
  292. *
  293. * 版本号法则:
  294. * 1.3, 1.3.0-beta3 --> 固定版本号
  295. * [1.0.0, 1.3.0) --> >= 1.0.0 < 1.3.0 ,[ 含 = ,) 不含 =
  296. * 1.+, [1.0,) --> >= 1.0 版
  297. * latest.integration、latest.release --> 最新版本
  298. */
  299. dependencies {
  300. // 库依赖
  301. implementation 'androidx.appcompat:appcompat:1.4.1'
  302. implementation 'com.google.android.material:material:1.5.0'
  303. implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
  304. //测试需要的依赖包,大部分仅支持debug模式下,relase可调用不到哦!
  305. testImplementation 'junit:junit:4.13.2'
  306. androidTestImplementation 'androidx.test.ext:junit:1.1.3'
  307. androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
  308. //动态版本号
  309. implementation 'com.android.support.constraint:constraint-layout:+'
  310. // 本地依赖,'../libs'下所有的.jar和.aar文件都添加到项目构建中
  311. implementation fileTree(dir: '../libs', include: ['*.jar', '*.aar'])
  312. // 本地依赖,将指定文件添加到依赖中
  313. implementation file('libs/aaa.jar')
  314. // 本地依赖,依次将多个指定文件添加到依赖中
  315. implementation files('libs/aaa.jar', 'libs/bbb.jar')
  316. // 本地依赖,添加AndroidLibrary类型的Module到依赖中
  317. implementation project(':libcocos2dx')
  318. // 远程依赖的日常写法 第三方开源库
  319. implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
  320. // 远端依赖的完整写法
  321. implementation group: 'com.tencent.mm.opensdk', name: 'wechat-sdk-android-without-mta', version: '6.8.0'
  322. api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
  323. compileOnly 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
  324. runtimeOnly 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
  325. annotationProcessor 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
  326. implementation('com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0') {
  327. isForce = true//在版本冲突的情况下优先使用3.1版本
  328. }
  329. implementation('com.tencent.mm.opensdk:wechat-sdk-android-without-mta') {
  330. version {
  331. strictly("6.8.0")
  332. }
  333. }
  334. implementation('com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0') {
  335. //排除特定的依赖
  336. exclude module: 'cglib' //by artifact name
  337. exclude group: 'org.jmock' //by group
  338. exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group
  339. }
  340. //group和module代表的意义
  341. implementation("org.hibernate:hibernate:3.1")
  342. group = org.hibernate
  343. module = hibernate
  344. version = 3.1
  345. api('org.hibernate:hibernate:3.1') {
  346. // 禁用依赖传递
  347. // 传递依赖:A => B => C ,B 中使用到了 C 中的依赖,
  348. // 如果打开传递依赖,则 A 能使用到 B中所使用的 C 中的依赖,
  349. // 默认都是打开,即 true
  350. transitive = false
  351. }
  352. //重复引用问题
  353. compile ('com.squareup.retrofit2:adapter-rxjava:2.1.0'){
  354. // 冲突时优先使用该版本
  355. force = true
  356. // 依据构建名称排除
  357. exclude module: 'rxjava'
  358. // 依据组织名称排除
  359. exclude group: 'com.squareup.retrofit'
  360. // 依据组织名称+构件名称排除
  361. exclude group: 'com.squareup.retrofit', module: 'rxjava'
  362. // 为本依赖关闭依赖传递特性
  363. transitive = false
  364. }
  365. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/907416
推荐阅读
相关标签
  

闽ICP备14008679号