当前位置: 首页 > news >正文

Android Gradle - Gradle 依赖类型、Gradle 传递与去重、查看 APK 中的 versionCode 与 versionName、aapt 与 aapt2

一、Gradle 依赖类型

1、基本介绍
  1. compileOnly:只在编译时用,不打包进 APK(省体积)

  2. annotationProcessor:编译时处理注解,也不打包

// 代码里写了例如 @Data,编译时编译器要检查这个注解是否存在,需要找到 Lombok 的类定义// 简单来说,就是找到注解定义// 如果只写 compileOnly,注解处理器不执行,Lombok 注解无效compileOnly'org.projectlombok:lombok:1.18.32'// 编译时读取 @Data、@Getter 等注解,自动生成 getter、setter、构造方法等 Java 代码// 生成代码后,这些类的.class文件里就有了完整的方法实现// 简单来说,就是找到注解处理器// 如果只写 annotationProcessor,主代码编译时找不到 Lombok 的注解类annotationProcessor'org.projectlombok:lombok:1.18.32'
  1. api:编译 + 运行时都有,且会泄露给子模块(子模块也能用)
api'com.alibaba:fastjson:1.2.83'
  1. implementation:编译 + 运行时都有,但不泄露给子模块
implementation'com.alibaba:fastjson:1.2.83'
2、补充学习
compileOnly'org.projectlombok:lombok:1.18.32'annotationProcessor'org.projectlombok:lombok:1.18.32'
  1. 在 Gradle 多模块项目中,子模块中声明的 compileOnly 和 annotationProcessor 依赖不会传递给父模块

  2. compileOnly 和 annotationProcessor 的依赖范围是模块私有的

  3. 处理策略是在父模块中也声明 compileOnly 和 annotationProcessor 依赖


二、Gradle 传递与去重

有一个模块 A 模块 A 被模块 B 通过 api 依赖 模块 A 被模块 C 通过 api 依赖 现在,模块 D 通过 implementation 依赖模块 B、模块 C 模块 B、模块 C 它们共同 api 依赖的模块 A 会怎么样?冲突?
模块 D ├── implementation 依赖 B │ └── api 依赖 A └── implementation 依赖 C └── api 依赖 A
  • 模块 D 会只有一个模块 A 的副本,不会重复

三、查看 APK 中的 versionCode 与 versionName

1、使用 aapt
  • aapt 是 Android SDK 自带的工具,位于build-tools/目录下
aapt dump badging 【APK】
2、使用 aapt2
  • 使用 aapt2
aapt2 dump badging 【APK】
3、使用 Android Studio
  • 使用 Android Studio 打开 APK(直接拖入),在 AndroidManifest.xml 文件中可以查看 versionCode 与 versionName

四、aapt 与 aapt2

1、基本介绍
  1. aapt / aapt2 全程 Android Asset Packaging Tool,是 Android SDK 自带的工具,位于build-tools/目录下

  2. aapt / aapt2 都是用来把资源文件(例如,布局、图片等)编译打包成 APK 的核心工具

  3. 从 Android Studio 3.0 开始,aapt2 就是默认开启的,绝大多数开发者无需手动干预

2、aapt
  1. aapt 是把所有资源一股脑倒进去,一次性完成所有处理,输出 APK

  2. aapt 每次都【全量编译】所有文件

3、aapt2
  1. aapt2 最核心的变化是,拆成了两个清晰的步骤,编译与链接
编译:把每一个资源文件(例如,strings.xml、icon.png)单独编译成一个中间格式文件(.flat) 链接:把所有 .flat 文件合并起来,最终打包成一个 APK
  1. 当只修改了一个文件时,它只需重新编译那一个文件,再和其他未改动的 .flat 文件快速链接即可,即【增量编译】

五、Gradle 未及时同步问题

  1. 在 Android 开发中,如果修改了模块级build.gradle文件中的 versionCode 和 versionName,但没有点击 Sync Now(Gradle 同步),打包时(可能)会使用旧的 versionCode 和 versionName

  2. 但是,我实测下来发现,打包时会使用新的 versionCode 和 versionName

  3. 在修改了模块级build.gradle文件后,立即执行 Sync Now 是一个好习惯


六、aidl.exe

  1. aidl.exe是 Android SDK 自带的一个命令行工具,它的作用是将编写的.aidl接口文件,自动转换成 Java 代码

  2. aidl.exe位于【SDK 目录】/build-tools/【版本号】/aidl.exe

  3. 在较新版本的 Android Gradle Plugin 中,AIDL 编译默认是关闭的,需要在模块级build.gradle文件中开启

android{buildFeatures{aidltrue}}
  1. 开启后,触发构建流程,自动调用aidl.exe
http://www.rkmt.cn/news/1421103.html

相关文章:

  • 如何在Windows平台高效处理Electron应用的asar归档文件?WinAsar工具完整指南
  • 【诺奖得主领衔!高届数稳定EI检索】第十届能源、环境与材料科学国际学术会议(EEMS 2026)
  • 终极指南:3分钟用qmc-decoder轻松解锁QQ音乐加密格式
  • 比话降AI率售后怎么样?2026年知网AI率不达标全额退款实测
  • 新手必看:用Pikachu靶场通关10种SQL注入,从数字型到宽字节一篇搞定
  • MacBook上从零搭建国民技术N32G430开发环境:arm-gcc、VSCode、pyOCD保姆级配置
  • Java 泛型解析太痛苦?你可能需要一枚「蛋」
  • 南通黄金上门回收新趋势,福运来黄金回收用透明服务破解变现难题 - 黄金回收
  • Obsidian Tasks插件实战:如何与Calendar、Memos联动,打造你的GTD工作流
  • OpenCore Legacy Patcher终极指南:4步解锁老Mac完整性能
  • RK3568串口的配置首字节mark后续space的程序
  • GA/T 1400通知消息避坑指南:从设备ID生成到图片Base64编码的10个常见错误
  • Modbus Slave模拟器高级玩法:一台电脑如何虚拟出多个‘设备’?详解端口、站号与窗口的关系
  • 头戴式超声波三维定位跟随无人机系统-【2】
  • 基于NodeMCU与WS2812B的智能氛围灯DIY:从硬件连接到网页控制
  • 如何永久保存你的微信聊天记忆:WeChatMsg一站式数据管理指南
  • 2026年物流园重卡充电桩排名:充电效率、并发补能与平台开放性横向对比 - 科技焦点
  • RK3568+串口mark,space校验设置
  • MATLAB三元相图进阶玩法:用STernary类绘制带等高线、气泡图和凸包的数据可视化
  • 徐州黄金上门回收实测 福运来黄金回收领跑六强逐鹿谁更省心 - 黄金回收
  • 信道容量迭代算法:从理论公式到代码实现的完整指南
  • 基于Arduino与3D打印的DIY模拟赛车方向盘制作全攻略
  • 基于CircuitPython的交互式旋转木马:从硬件到代码的创客实践
  • 用PyTorch复现f-AnoGAN:一个工业缺陷检测的实战项目(附完整代码与数据集处理)
  • 给电赛萌新的保姆级教程:用CubeMX+Keil5从零点亮STM32F407(附避坑指南)
  • 秋衣面料革命,AI造出黑科技
  • 用C++刷题太枯燥?看我用Python优雅复现2023 GLPT天梯赛L2‘堆宝塔’与‘赛场安排’算法题
  • 在Claude Code中配置Taotoken作为替代API提供商解决访问限制
  • UE4植被动态效果避坑指南:从SimpleGrassWind撕裂到VertexColor绘制的完整解决方案
  • 【MATLAB代码】基于σ修正自适应律的多无人机菱形编队控制仿真,附完整代码,订阅专栏后可直接查看,粘贴到MATLAB即可运行