当前位置: 首页 > 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.jsqmd.com/news/909795/

相关文章:

  • 突破性3步解决方案:MouseClick如何彻底改变你的数字生产力
  • 如何在Windows平台高效处理Electron应用的asar归档文件?WinAsar工具完整指南
  • Arduino超声波测距系统:从HC-SR04原理到I2C LCD显示的完整实践
  • 【诺奖得主领衔!高届数稳定EI检索】第十届能源、环境与材料科学国际学术会议(EEMS 2026)
  • GoB插件架构演进:从ZBrush到Blender 4.3的多版本兼容性挑战与解决方案
  • 终极指南:3分钟用qmc-decoder轻松解锁QQ音乐加密格式
  • 废旧笔记本电池拆解18650电芯:安全回收与DIY移动电源制作指南
  • 告别键盘连击烦恼:用KeyboardChatterBlocker拯救你的打字体验
  • 比话降AI率售后怎么样?2026年知网AI率不达标全额退款实测
  • 新手必看:用Pikachu靶场通关10种SQL注入,从数字型到宽字节一篇搞定
  • Navicat Mac版无限试用重置工具:告别14天限制的完整解决方案
  • 湖北省当阳市寄快递省钱指南:4 个全国低价寄大件小件宝藏平台,告别高价寄件 - 时讯资讯
  • 树莓派SPI屏幕桌面镜像配置:ST7789驱动与分辨率校准实战
  • 从挖矿到制药:GPU算力如何重塑药物研发的分布式计算革命
  • 如何在个人电脑上部署专属AI助手?GPT4All让你零门槛实现本地LLM部署
  • 2026 沧州钢管源头厂家保温管道产品综合测评 - 栗子测评
  • 终极指南:用FanControl全面掌控Windows风扇调速与温度监控
  • GD32读保护解除全流程复盘:从现象分析到安全编程建议
  • MacBook上从零搭建国民技术N32G430开发环境:arm-gcc、VSCode、pyOCD保姆级配置
  • Java 泛型解析太痛苦?你可能需要一枚「蛋」
  • Obsidian Tasks插件实战:如何与Calendar、Memos联动,打造你的GTD工作流
  • 即梦怎么去水印软件|2026实测最全去水印方法
  • ESP32连接GP-02双模GNSS模块:从硬件连接到数据解析全攻略
  • 探索Termux API:重新定义Android设备的命令行边界
  • 超越基础操作:用Unity Joystick插件实现技能轮盘与相机控制
  • OpenCore Legacy Patcher终极指南:4步解锁老Mac完整性能
  • 南通黄金上门回收新趋势,福运来黄金回收用透明服务破解变现难题 - 黄金回收
  • 湖北省宜城市寄件省钱指南:4 个全国低价寄快递大件物流宝藏平台,全国寄件靠谱又划算 - 时讯资讯
  • 中文提示词真能节省LLM编程成本?SWE-bench实证研究揭示真相
  • RK3568串口的配置首字节mark后续space的程序