Android Gradle - Gradle 依赖类型、Gradle 传递与去重、查看 APK 中的 versionCode 与 versionName、aapt 与 aapt2
一、Gradle 依赖类型
1、基本介绍
compileOnly:只在编译时用,不打包进 APK(省体积)
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'- api:编译 + 运行时都有,且会泄露给子模块(子模块也能用)
api'com.alibaba:fastjson:1.2.83'- implementation:编译 + 运行时都有,但不泄露给子模块
implementation'com.alibaba:fastjson:1.2.83'2、补充学习
compileOnly'org.projectlombok:lombok:1.18.32'annotationProcessor'org.projectlombok:lombok:1.18.32'在 Gradle 多模块项目中,子模块中声明的 compileOnly 和 annotationProcessor 依赖不会传递给父模块
compileOnly 和 annotationProcessor 的依赖范围是模块私有的
处理策略是在父模块中也声明 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、基本介绍
aapt / aapt2 全程 Android Asset Packaging Tool,是 Android SDK 自带的工具,位于
build-tools/目录下aapt / aapt2 都是用来把资源文件(例如,布局、图片等)编译打包成 APK 的核心工具
从 Android Studio 3.0 开始,aapt2 就是默认开启的,绝大多数开发者无需手动干预
2、aapt
aapt 是把所有资源一股脑倒进去,一次性完成所有处理,输出 APK
aapt 每次都【全量编译】所有文件
3、aapt2
- aapt2 最核心的变化是,拆成了两个清晰的步骤,编译与链接
编译:把每一个资源文件(例如,strings.xml、icon.png)单独编译成一个中间格式文件(.flat) 链接:把所有 .flat 文件合并起来,最终打包成一个 APK- 当只修改了一个文件时,它只需重新编译那一个文件,再和其他未改动的 .flat 文件快速链接即可,即【增量编译】
五、Gradle 未及时同步问题
在 Android 开发中,如果修改了模块级
build.gradle文件中的 versionCode 和 versionName,但没有点击 Sync Now(Gradle 同步),打包时(可能)会使用旧的 versionCode 和 versionName但是,我实测下来发现,打包时会使用新的 versionCode 和 versionName
在修改了模块级
build.gradle文件后,立即执行 Sync Now 是一个好习惯
六、aidl.exe
aidl.exe是 Android SDK 自带的一个命令行工具,它的作用是将编写的.aidl接口文件,自动转换成 Java 代码aidl.exe位于【SDK 目录】/build-tools/【版本号】/aidl.exe在较新版本的 Android Gradle Plugin 中,AIDL 编译默认是关闭的,需要在模块级
build.gradle文件中开启
android{buildFeatures{aidltrue}}- 开启后,触发构建流程,自动调用
aidl.exe
