1. Andorid 工程化¶
1.1 Gradle 的使用¶
1.1.1 基本用法¶
1.1.1.1 查看 task¶
.\gradlew.bat tasks
更详细查看
.\gradlew.bat tasks --all
1.1.1.2 查看 jdk 信息¶
.\gradlew.bat -q javaToolchains
+ Options
| Auto-detection: Enabled
| Auto-download: Enabled
+ OpenJDK 17.0.1+12-39
| Location: D:\devapps\jdk\jdk-17.0.1
| Language Version: 17
| Vendor: Oracle
| Architecture: amd64
| Is JDK: true
| Detected by: Current JVM
1.1.1.3 跳过测试¶
.\gradlew build -x test
1.2 HowTo¶
1.2.1 WiFi调试报连接不上¶
- 确保手机已经开启
- USB 调试
- 无线调试
- 手机上选择【使用配对码配对设备】
- 并记录下弹出中展示的【配对码】以及【IP地址和端口】
- 在电脑上 ADB 命令行执行
adb pair <上一步记录的 IP地址和端口>
- 按照交互输入【配对码】
- 提示成功后
- ADB 进行连接
adb connect <手机【无线调试】页面上的 IP地址和端口>
-
注意,这里的 IP地址和端口 不是上边 (1) 中的地址,而是手机【无线调试页面】上的
1.3 未分类¶
- Android 都有哪些依赖类型 https://developer.android.com/build/dependencies ⧉
1.4 FAQ¶
1.4.1 Android build.gradle.kts 中的 buildscript 是什么?¶
在 build.gradle.kts
(Kotlin DSL 构建脚本)中的 buildscript
有以下重要作用和特性:
一、定义和作用 - buildscript
块主要用于配置构建脚本自身所需的依赖项和存储库。它允许你指定构建脚本在执行时需要使用的类路径依赖,这些依赖是构建过程本身需要的,而不是应用程序或库代码所需的。 - 例如,当你使用一些自定义的 Gradle 插件或者需要一些额外的工具类库来帮助你执行构建任务时,你可以在 buildscript
中声明这些依赖。
二、结构和使用示例
buildscript {
// 定义仓库,用于查找构建脚本所需的依赖
repositories {
google()
mavenCentral()
// 可以添加更多的仓库,如 jcenter() 等
}
// 定义依赖,这些依赖将被添加到构建脚本的类路径中
dependencies {
classpath("com.android.tools.build:gradle:7.0.4")
// 可以添加其他的类路径依赖,如自定义插件等
classpath("com.example:custom-plugin:1.0.0")
}
}
- repositories:
- 用于指定 Gradle 应该从哪些仓库中查找
buildscript
的依赖项。 google()
和mavenCentral()
是常用的仓库,google()
提供了 Google 的 Maven 仓库,包含了 Android 开发所需的很多依赖;mavenCentral()
是一个广泛使用的公共 Maven 仓库。- 你可以添加其他的仓库,例如
jcenter()
或自定义的 Maven 或 Ivy 仓库。
- 用于指定 Gradle 应该从哪些仓库中查找
- dependencies:
classpath
方法用于添加构建脚本所需的依赖。- 在上述示例中,
classpath("com.android.tools.build:gradle:7.0.4")
表示添加 Android Gradle 插件的特定版本到构建脚本的类路径中,以便在构建 Android 项目时使用。 classpath("com.example:custom-plugin:1.0.0")
可以是自定义的 Gradle 插件或其他工具库,例如一些代码质量检查工具的 Gradle 插件等。
三、与其他部分的区别
- 与
dependencies
块的区别:- 普通的
dependencies
块(不在buildscript
内)用于声明项目本身所需的依赖,例如,对于一个 Android 项目,会在这里声明应用程序使用的 Android 库、第三方库(如 Retrofit、Glide 等)。这些依赖会被包含在最终构建的应用程序中。 - 而
buildscript
中的dependencies
是用于构建过程的,它们不会被包含在最终的应用程序中,仅用于辅助构建操作,例如生成构建报告、执行自定义构建任务等。
- 普通的
- 与
allprojects
或subprojects
的区别:allprojects
和subprojects
通常用于多模块项目,它们可以统一配置所有或部分子项目的仓库和依赖等。而buildscript
主要关注构建脚本自身的依赖和仓库。
四、使用场景
- 使用自定义插件:
- 当你需要在构建过程中使用自定义的 Gradle 插件时,首先需要在
buildscript
中添加该插件的依赖,以便 Gradle 可以找到并加载该插件。 - 例如,如果你有一个自定义的插件用于自动生成一些资源文件,你需要将该插件的依赖添加到
buildscript
中,然后在apply plugin
语句中应用该插件。
- 当你需要在构建过程中使用自定义的 Gradle 插件时,首先需要在
- 使用构建工具:
- 当你使用一些构建工具库,如用于代码质量检查的 Checkstyle、FindBugs 等,它们的 Gradle 插件和相关依赖可以添加到
buildscript
中。
- 当你使用一些构建工具库,如用于代码质量检查的 Checkstyle、FindBugs 等,它们的 Gradle 插件和相关依赖可以添加到
五、注意事项
- 确保仓库和依赖的版本是正确和兼容的:
- 错误的仓库或依赖版本可能会导致构建失败,或者构建过程中出现异常行为。
- 对于 Android 开发,确保使用的 Android Gradle 插件版本与 Android SDK 版本兼容。
- 尽量避免冗余的依赖:
- 只添加必要的构建脚本依赖,过多的依赖会增加构建脚本的复杂性和构建时间。
总之,buildscript
是 build.gradle.kts
中一个重要的部分,它允许你配置构建过程中所需的资源和工具,确保构建脚本能够顺利执行复杂的构建任务,同时与项目的其他依赖和仓库配置有明确的区分,有助于保持构建脚本的清晰性和可维护性。
1.4.2 build.gradle 中的配置块是否有顺序要求¶
一般的顺序可以是:buildscript -> plugins -> allprojects / subprojects -> repositories -> dependencies -> android (对于 Android 项目) -> task / configurations
1.4.3 配置块都可以嵌套使用吗?¶
并非所有 Gradle 配置块都可以嵌套使用,以下是对 Gradle 中常见配置块嵌套情况的详细说明:
嵌套详细说明
### 1. buildscript
- 嵌套情况:
buildscript
可以嵌套一些其他的配置块,主要是repositories
和dependencies
。- 这是因为
buildscript
主要用于配置构建脚本本身所需的依赖和仓库,而repositories
和dependencies
直接为其提供相应的信息。
- 示例:
buildscript { repositories { google() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle:7.0.4") } }
- 解释:
- 在这里,
repositories
用于指定从哪些仓库中查找buildscript
的依赖,dependencies
用于添加构建脚本所需的依赖,它们是buildscript
的内部配置,是为了确保构建脚本能够正确执行所需的依赖添加和解析。
- 在这里,
### 2. allprojects
和 subprojects
- 嵌套情况:
allprojects
和subprojects
通常可以嵌套repositories
、dependencies
、plugins
、task
等配置块。- 因为它们主要用于多模块项目中对多个项目或子项目进行统一的配置,这些内部配置块可以对项目的不同方面进行配置。
- 示例:
allprojects { repositories { mavenCentral() } dependencies { implementation("org.apache.commons:commons-lang3:3.12.0") } plugins { id("java-library") } task customTask { doLast { println("This is a custom task for all projects.") } } }
- 解释:
- 在
allprojects
中,repositories
为所有项目配置仓库,dependencies
为所有项目添加依赖,plugins
为所有项目应用插件,task
为所有项目添加任务,这样可以方便地对多个项目进行统一的配置和管理。
- 在
### 3. android
(仅适用于 Android 项目)
- 嵌套情况:
android
可以嵌套多个子配置块,如defaultConfig
、buildTypes
、productFlavors
、signingConfigs
等。- 这些子配置块是专门用于 Android 项目的各种特定配置,如不同的构建类型、产品风味和签名配置等。
- 示例:
android { compileSdkVersion 31 buildToolsVersion "31.0.0" defaultConfig { applicationId "com.example.myapp" minSdkVersion 21 targetSdkVersion 31 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" } } }
- 解释:
defaultConfig
提供了 Android 项目的基本配置,buildTypes
允许配置不同的构建类型(如release
、debug
),这些子配置块是android
块的细化,用于更精确地控制 Android 项目的构建细节。
### 4. plugins
- 嵌套情况:
plugins
通常不嵌套其他配置块。它主要用于声明要使用的 Gradle 插件及其版本。
- 示例:
plugins { id("com.android.application") version "7.0.4" id("org.jetbrains.kotlin.android") version "1.5.31" }
- 解释:
- 它只用于简单地列出要应用的插件及其版本,不包含其他的配置信息,因此通常不嵌套其他配置块。
### 5. repositories
- 嵌套情况:
repositories
本身不嵌套其他主要的配置块,它只包含仓库的配置,如maven
、jcenter
、google
等。
- 示例:
repositories { mavenCentral() jcenter() google() }
- 解释:
- 它是一个相对简单的配置块,主要功能是声明项目查找依赖的仓库来源,不适合嵌套其他复杂的配置块。
### 6. dependencies
- 嵌套情况:
dependencies
通常不嵌套其他主要的配置块,它只包含各种依赖的声明,如implementation
、testImplementation
等。
- 示例:
dependencies { implementation("com.google.guava:guava:30.1-jre") testImplementation("junit:junit:4.13") }
- 解释:
- 主要是为了添加不同类型的依赖,不适合嵌套其他的配置块,因为其功能是集中于依赖的声明和管理。
### 7. task
- 嵌套情况:
task
可以包含一些动作,如doFirst
和doLast
等,但通常不嵌套其他主要的配置块。- 它主要用于定义和配置具体的任务,而不是用于配置项目的其他方面。
- 示例:
task myCustomTask { doLast { println("This is a custom task.") } }
- 解释:
- 这里的
doLast
是任务的一个动作,用于添加任务执行的操作,而不是嵌套其他项目级别的配置。
- 这里的
### 8. configurations
- 嵌套情况:
configurations
通常不嵌套其他主要的配置块,它主要用于创建、修改或扩展依赖配置。
- 示例:
configurations { customConfiguration { description = "This is a custom configuration." extendsFrom compileClasspath } }
- 解释:
- 它主要用于配置依赖的范围和继承关系,不适合嵌套其他项目的配置信息。
### 总结
- 一些配置块,如
buildscript
、allprojects
和subprojects
、android
可以嵌套其他配置块,这是因为它们负责项目或构建脚本的多个方面的综合配置,需要通过嵌套更细化的配置块来完成不同部分的配置。 - 而
plugins
、repositories
、dependencies
、task
和configurations
通常是相对独立和具体的配置,主要完成特定的单一功能,不适合嵌套其他主要的配置块,它们是项目或构建脚本的具体配置元素,而非综合的配置容器。
总之,根据 Gradle 配置块的功能和设计目的,有的可以嵌套其他配置块以细化配置,有的则是独立的配置元素,直接实现特定的构建或项目配置功能。在使用时,需要根据具体的功能需求合理使用它们,避免不恰当的嵌套造成混淆和错误。