关于Android Studio的Gradle各项配置
Gradle 构建概览
Android 应用通常使用 Gradle 构建系统构建。在深入了解如何配置 build 之前,我们先来探索 build 背后的概念,以便您全面了解系统。
什么是 build?
构建系统会将源代码转换为可执行应用。构建通常涉及多个工具,用于分析、编译、链接和打包应用或库。Gradle 使用基于任务的方法来整理和运行这些命令。
一、Gradle基础概念
Gradle是什么
Gradle是Android项目的构建工具,支持自动化编译、依赖管理和多环境打包3。它使用Groovy或Kotlin DSL(领域特定语言)编写构建脚本。
核心文件结构
build.gradle (项目级):定义全局构建配置和插件依赖
build.gradle (模块级):配置当前模块的编译参数、依赖等
gradle-wrapper.properties :指定Gradle版本和下载路径4
二、环境配置与基础操作
下载Gradle
打开Android Studio → 项目 → gradle/wrapper/gradle-wrapper.properties ,修改distributionUrl字段指定版本:
distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zip
如果因为网络问题可以使用国内镜像或者直接下载到本地
进入 Gradle 官网下载,网址可选下面中的任何一个:
https://services.gradle.org/distributions/
https://gradle.org/releases/
修改 gradle-wrapper.properties 文件:
设置
distributionUrl=file:///C:/Users/Administrator/Downloads/gradle-7.6-bin.zip
这样子它就会从本地下载
一方面也可以使用国内镜像下载
Gradle镜像地址:https://mirrors.cloud.tencent.com/gradle/
修改
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.0-bin.zip
华为云镜像
Gradle镜像地址:https://mirrors.huaweicloud.com/gradle/
配置方法同样是将distributionUrl替换为华为云的镜像地址。
其中Gradle 在构建时会优先检测本地是否存在指定的版本,如果不存在才会触发下载。具体机制如下:
- Gradle Wrapper 的检测逻辑
- 默认缓存路径:Gradle Wrapper (
gradlew
) 会优先检查本地缓存目录~/.gradle/wrapper/dists/
是否存在项目指定的 Gradle 版本。 - 版本匹配:如果本地缓存中存在与项目配置完全一致的 Gradle 版本(如
gradle-8.7-bin.zip
),则直接使用本地文件;否则会从gradle-wrapper.properties
中指定的distributionUrl
下载。
- 默认缓存路径:Gradle Wrapper (
- 如何配置本地 Gradle 路径
- 强制使用本地版本:在 Android Studio 中,可通过以下步骤设置:
- 打开 File → Settings → Build, Execution, Deployment → Gradle。
- 选择 Use local Gradle distribution,并指定本地 Gradle 的安装目录(例如
C:\gradle\gradle-8.7
)。
- 手动下载并替换:如果下载失败,可手动从 下载对应版本,解压后放置到
~/.gradle/wrapper/dists/
对应子目录中,Gradle 会自动识别。
- 强制使用本地版本:在 Android Studio 中,可通过以下步骤设置:
- 离线模式与网络行为控制
- 离线模式:通过命令行添加
--offline
参数(如gradlew build --offline
),强制 Gradle 仅使用本地缓存,避免联网下载。 - 代理或镜像配置:若需从网络下载,可通过修改
init.gradle
文件配置国内镜像(如阿里云)加速下载。
- 离线模式:通过命令行添加
- 常见问题与解决
- 版本不一致报错:若本地版本与项目配置的 Gradle 版本不匹配,需修改
gradle-wrapper.properties
中的distributionUrl
或更新项目配置。 - 缓存损坏:删除
~/.gradle/wrapper/dists/
下的对应版本目录,重新触发下载。
- 版本不一致报错:若本地版本与项目配置的 Gradle 版本不匹配,需修改
通过上述机制,Gradle 在保证版本一致性的同时,兼顾了灵活性和网络问题的容错能力。
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-8.9-bin.zip
networkTimeout=10000 validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
以下是 gradle-wrapper.properties
文件各配置项的含义解析:
-
distributionBase=GRADLE_USER_HOME
- 作用:定义 Gradle 解压后的主存储目录。默认值为
GRADLE_USER_HOME
,即用户目录下的.gradle
文件夹(如C:\Users\用户名\.gradle
)。 - 示例:如果未修改,解压后的 Gradle 文件会存放在
.gradle/wrapper/dists
目录下。
- 作用:定义 Gradle 解压后的主存储目录。默认值为
-
distributionPath=wrapper/dists
- 作用:指定 Gradle 解压后的子目录路径。结合
distributionBase
,完整路径为:
<distributionBase>/<distributionPath>
(如.gradle/wrapper/dists
)。
- 作用:指定 Gradle 解压后的子目录路径。结合
-
distributionUrl=...
- 作用:定义 Gradle 分发包的下载地址。可以是远程 URL 或本地路径:
- 远程地址:如
https://services.gradle.org/distributions/gradle-8.9-bin.zip
会从官方服务器下载。 - 本地路径:若改为
file:///路径/gradle-8.9-bin.zip
,则直接使用本地文件(避免下载)。
- 远程地址:如
- 注意事项:若下载失败,可替换为国内镜像(如阿里云)或手动下载后配置本地路径。
- 作用:定义 Gradle 分发包的下载地址。可以是远程 URL 或本地路径:
-
networkTimeout=10000
- 作用:设置网络请求超时时间(单位:毫秒)。此处为 10 秒,超过时间未完成下载会报错。
-
validateDistributionUrl=true
- 作用:是否验证
distributionUrl
的有效性。若设为false
,即使 URL 无效也会跳过检查(不推荐)。
- 作用:是否验证
-
zipStoreBase=GRADLE_USER_HOME
- 作用:定义下载的 Gradle 压缩包(
.zip
)存储的主目录,默认同distributionBase
(即.gradle
目录)。
- 作用:定义下载的 Gradle 压缩包(
-
zipStorePath=wrapper/dists
- 作用:指定压缩包的存储子目录路径。完整路径为:
<zipStoreBase>/<zipStorePath>
。
- 作用:指定压缩包的存储子目录路径。完整路径为:
常见问题与解决建议
-
下载速度慢或失败:
- 修改
distributionUrl
为国内镜像(如阿里云https://mirrors.aliyun.com/gradle/...
)。 - 手动下载 Gradle 包并配置本地路径(如
file:///D:/gradle-8.9-bin.zip
)。
- 修改
-
文件权限问题:
- 确保
.gradle
目录有写入权限,避免因权限不足导致解压失败。
- 确保
-
版本兼容性:
- 检查 Gradle 版本是否与项目要求的插件版本兼容,避免构建错误。
如需进一步调试,可运行 ./gradlew --stacktrace
查看详细错误日志。
三、Gradle配置使用
AndroidStudio中的Gradle
在AndroidStudio中的Gradle主要使用2个对象:
build.gradle 对应 Project对象
setting.gradle 对应 Setting对象
1,Setting.gradle
这个 settings.gradle
配置文件是 Gradle 项目中用来定义项目结构和插件管理的部分,尤其是当项目中涉及多个子项目(multi-module)时,它会对整个项目的构建和依赖管理做一些配置。
我们来逐行分析这个文件,帮助你全面理解它的作用和配置项。
🧠 文件整体结构
pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}
}rootProject.name = "My Application"
include ':app'
🔸 pluginManagement {}
这个部分定义了如何获取 Gradle 插件,尤其是在多模块项目中或是有定制插件的情况下非常有用。它实际上告诉 Gradle 在构建过程中需要从哪里获取插件。
pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}
pluginManagement
:用于定义插件管理的配置,这部分是告诉 Gradle 到哪些仓库去找 插件(例如com.android.tools.build:gradle
)。repositories
:配置用于获取插件的仓库。google()
:从 Google 的仓库拉取插件。通常这是 Android 插件(如com.android.tools.build:gradle
)的来源。content {}
:这个部分通过includeGroupByRegex
设置了拉取插件时的过滤条件,只会获取符合正则表达式的插件。例如,com.android.*
、com.google.*
和androidx.*
都会被纳入搜索范围。
mavenCentral()
:Maven 中央仓库,适用于其他插件或库。gradlePluginPortal()
:这是 Gradle 官方插件的默认仓库,适用于一般的插件。
🔧 这种做法的好处是,只会从特定的仓库拉取特定的插件,避免不必要的依赖冲突。
🔸 dependencyResolutionManagement {}
这个部分用于管理 项目依赖 的解析方式,它可以控制如何拉取依赖、哪些仓库可以用等等。主要影响 所有模块的依赖解析策略。
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}
}
-
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
:- 这行的作用是控制当 Gradle 搜索依赖时,是否允许从项目本地仓库拉取依赖。如果设为
FAIL_ON_PROJECT_REPOS
,则意味着如果本地项目中有任何依赖仓库,它会报错,要求只能从官方仓库拉取。 FAIL_ON_PROJECT_REPOS
:如果有任何模块在本地配置了自己的仓库,Gradle 会抛出错误,要求使用标准仓库。常见的标准仓库就是 Google 和 Maven Central。
- 这行的作用是控制当 Gradle 搜索依赖时,是否允许从项目本地仓库拉取依赖。如果设为
-
repositories {}
:- 这里列出了两个常用的依赖仓库:
google()
:Google 官方仓库,通常用于 Android 相关依赖。mavenCentral()
:Maven 中央仓库,适用于所有通用 Java 或 Kotlin 库。
- 这里列出了两个常用的依赖仓库:
🔸 rootProject.name = "My Application"
这一行指定了 根项目的名称。
rootProject.name = "My Application"
rootProject.name
用于定义项目的根名称,通常在多模块项目中使用。这个名称会出现在构建输出的日志中以及生成的构建报告中。- 为什么需要指定根项目名称?:
- 这是一个标识符,帮助 Gradle 明确标识和识别这个项目,特别是在多模块项目中,方便管理和构建。
🔸 include ':app'
这一行告诉 Gradle 包含一个名为 app
的子模块。
include ':app'
include ':app'
:这是一个 多模块项目(multi-module project) 中常见的配置,表示这个项目有一个子模块:app
,它是根项目的一部分。这个子模块通常包含应用的主代码。- 子模块 的定义可以有多个,通常这种配置出现在需要将项目拆分为多个独立模块的情况下。
💡 扩展:如果项目有更多的子模块,可以这样写:
include ':app', ':library', ':network'
🧩 组合起来的效果
这个配置文件做了以下几件事情:
- 插件管理:定义了从哪些仓库获取 Gradle 插件,并且使用正则表达式过滤插件来源(如 Google、AndroidX、Google)。
- 依赖解析管理:明确要求 Gradle 只从 Google 和 Maven Central 拉取依赖,且如果有本地仓库(
projectRepos
),则构建失败,防止依赖来源不明。 - 项目名称:将根项目的名称设置为
"My Application"
,方便识别。 - 多模块:将
:app
模块作为根项目的一部分包含在内,说明这是一个多模块构建项目。
🎯 总结
pluginManagement
配置插件仓库和插件获取策略。dependencyResolutionManagement
配置项目的依赖解析方式,确保依赖从官方仓库获取,避免本地仓库问题。rootProject.name
设置了项目名称。include ':app'
表示项目包含一个名为app
的子模块,适用于多模块项目。
在国内可能会遇到的问题,就是网络问题,导致我们没法正常下载到所需的插件和以来,因而我们通常会添加镜像源
pluginManagement {repositories {google() // Google仓库,主要用于 Android 相关的插件mavenCentral() // Maven 中央仓库gradlePluginPortal() // Gradle 官方插件仓库// 阿里云 Maven 镜像maven { url 'https://maven.aliyun.com/repository/public' }// 腾讯云 Maven 镜像maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }// 华为云 Maven 镜像maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }}
}dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) // 只允许使用官方仓库repositories {google() // Google仓库,适用于Android相关依赖mavenCentral() // Maven中央仓库maven { url 'https://maven.aliyun.com/repository/public' } // 阿里云仓库maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' } // 腾讯云仓库maven { url 'https://mirrors.huaweicloud.com/repository/maven/' } // 华为云仓库}
}rootProject.name = "My Application"
include ':app'
🧠 Maven 是什么意思?
Maven 是一个构建和依赖管理工具,最常用于 Java 项目。它通过 POM (Project Object Model) 文件来管理项目的构建、依赖、插件等。Maven 还提供了中央仓库(Maven Central)来存储常用的库和构建插件,Gradle 就是利用 Maven 仓库来获取依赖的。
问题
Maven可以放到前面吗?他们搜寻插件的顺序是怎么样的?
🏗️ 插件仓库的搜索顺序:
Gradle 中插件仓库的搜索顺序是非常重要的,它决定了 Gradle 会先在哪些仓库中查找插件和依赖。如果你把 maven
放到前面,它会优先搜索这些仓库。
在 pluginManagement
中定义的 仓库顺序 确定了 Gradle 在构建时查找插件的先后顺序。先定义的仓库会被优先搜索。
🎯 搜索顺序规则:
-
按顺序搜索:Gradle 会按照
pluginManagement.repositories
中仓库的出现顺序来搜索插件。- 先定义的仓库会优先被搜索。
-
仓库优先级:
- Google仓库:通常优先配置,因为它包含了 Android 构建相关的插件(比如
com.android.application
等)。 - Maven Central:是很多 Java 和 Android 库的默认仓库。
- 自定义仓库(如 阿里云、腾讯云、华为云):这些可以在国内加速插件的下载,尤其在国内网络环境下,它们比 Google 和 Maven 中央仓库的访问速度更快。
- Google仓库:通常优先配置,因为它包含了 Android 构建相关的插件(比如
🧑💻 示例配置 - 放在前面:
如果你希望将 Maven 镜像仓库 放在 最前面,确保它优先被搜索,可以像下面这样配置:
pluginManagement {repositories {// 先配置国内镜像源maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }maven { url 'https://maven.aliyun.com/repository/public' }maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }// 然后配置 Google 和 Maven 中央仓库google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}
📌 详细说明:
- Maven 镜像源优先:国内的 Maven 镜像源(腾讯云、阿里云、华为云)会被最先搜索,如果插件在这些源中找到,Gradle 就会直接使用。
- Google 和 Maven 中央仓库:如果在上面的 Maven 镜像源中没有找到,Gradle 会继续搜索 Google 和 Maven Central。
这种方式特别适合中国大陆用户,因为它们的访问速度更快,可以减少因访问国外仓库慢而导致的构建时间延迟。
⚡ 总结:
- Gradle 会按顺序搜索配置的仓库,先定义的仓库会优先被搜索。
- 如果你把 Maven 仓库放到前面,它会优先搜索这些仓库。
- 配置国内的镜像仓库(如腾讯云、阿里云、华为云)通常可以提升下载速度,特别是在国内环境下。
希望这样解释清楚了!如果还有其他问题,随时告诉我~ 💡
2,Build.gradle
项目级 build.gradle
和 模块级 build.gradle
的配置详解
Gradle 构建系统采用分层结构,项目级(project-level
)和模块级(module-level
)build.gradle
文件各自承担不同的责任。项目级的 build.gradle
主要用来配置全局构建设置、插件和依赖库,而模块级的 build.gradle
则负责定义与具体应用或库相关的构建过程、依赖关系和任务。
一、项目级 build.gradle
配置详解
项目级 build.gradle
是整个 Gradle 构建系统的入口,通常用于设置全局插件和仓库,并管理与项目相关的通用配置。
1. 主要功能:
- 定义构建脚本所需要的插件。
- 配置全局仓库,例如 JCenter、MavenCentral 等。
- 管理所有模块的共用依赖版本。
- 配置全局的 Gradle 版本。
2. 示例代码:
// 项目级 build.gradle 文件
buildscript {// 定义构建脚本依赖和仓库repositories {google() // 使用 Google Maven 仓库mavenCentral() // 使用 Maven Central 仓库}dependencies {// 定义构建工具的依赖,通常是 Android Gradle 插件classpath 'com.android.tools.build:gradle:8.5' // Android Gradle 插件的版本}
}allprojects {// 所有子项目都会使用这些仓库repositories {google() // 使用 Google Maven 仓库mavenCentral() // 使用 Maven Central 仓库}
}// 配置根项目的属性,比如设置项目名称
rootProject.name = "MyApplication" // 根项目的名称// 指定需要包含的模块
include ':app' // 包含子模块,通常是应用模块
3. 解释:
buildscript
:用于配置构建脚本所需的插件依赖和仓库地址。通常用于配置像com.android.tools.build:gradle
这样的插件依赖。allprojects
:定义所有项目(即包括子模块)都会使用的仓库地址。在这里配置的仓库会被传递到每个模块中。rootProject.name
:指定项目的根目录名称,通常与实际的文件夹名一致。include ':app'
:配置需要包含的子模块,这里是:app
模块。实际应用中可能会有多个模块。
二、模块级 build.gradle
配置详解
模块级 build.gradle
文件负责具体模块的构建过程。在这个文件中,你可以配置 Android 特有的构建选项,如 android
配置块、构建类型、依赖关系等。
1. 主要功能:
- 配置 Android 特有的构建设置(如 SDK 版本、构建类型、Flavors 等)。
- 定义模块的具体依赖关系。
- 设置构建任务和自定义任务。
2. 示例代码:
// 模块级 build.gradle 文件
apply plugin: 'com.android.application' // 应用 Android 应用插件android {compileSdkVersion 33 // 设置编译 SDK 版本defaultConfig {applicationId "com.example.myapp" // 设置应用的 IDminSdkVersion 21 // 设置最低支持的 SDK 版本targetSdkVersion 33 // 设置目标 SDK 版本versionCode 1 // 设置应用的版本号versionName "1.0.0" // 设置应用的版本名称}buildTypes {release {minifyEnabled true // 开启代码压缩和混淆proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}debug {debuggable true // 启用调试模式}}productFlavors {free {applicationIdSuffix ".free" // 免费版应用的 ID 后缀versionNameSuffix "-free" // 免费版版本名称后缀}paid {applicationIdSuffix ".paid" // 付费版应用的 ID 后缀versionNameSuffix "-paid" // 付费版版本名称后缀}}
}dependencies {// 配置模块所需的依赖implementation 'com.android.support:appcompat-v7:28.0.0' // 引入 Android 支持库implementation 'com.squareup.retrofit2:retrofit:2.9.0' // 引入 Retrofit 库进行网络请求testImplementation 'junit:junit:4.13.2' // 引入 JUnit 库进行单元测试
}
3. 解释:
apply plugin: 'com.android.application'
:应用 Android 应用插件,表示该模块是一个 Android 应用。若是 Android 库,则应使用com.android.library
插件。android
:此配置块包含了与 Android 构建相关的设置,如compileSdkVersion
(编译 SDK 版本)、defaultConfig
(默认配置),以及buildTypes
和productFlavors
(构建类型和产品风味)。buildTypes
:定义不同构建类型的配置,常见的有debug
和release
。每个构建类型可以有不同的设置,如混淆、压缩等。productFlavors
:定义不同版本的应用,例如免费版和付费版。可以在此配置不同版本的 ID、版本号等。dependencies
:定义该模块所需要的库依赖。可以使用implementation
、api
、testImplementation
等关键字来指定依赖类型。
三、如何理解项目级和模块级的 Gradle 配置
1. 项目级 build.gradle
文件:
- 负责配置与所有模块共用的设置,如全局的仓库、插件依赖等。
- 例如:配置项目级的仓库(Google、Maven Central),和所有模块共用的构建工具依赖(如 Android Gradle 插件)。
2. 模块级 build.gradle
文件:
- 负责定义每个模块(如
app
模块)特有的构建配置,包括 Android SDK 版本、构建类型、依赖关系等。 - 例如:
compileSdkVersion
、minSdkVersion
、dependencies
等配置都是模块特有的。
四、项目级和模块级配置的作用及优先级
- 项目级
build.gradle
:通常是所有模块的全局配置,负责配置 构建脚本 以及 所有模块的共用依赖,如仓库地址、插件版本等。 - 模块级
build.gradle
:负责模块具体的构建配置,通常涉及 与特定模块相关的设置,如 SDK 版本、构建类型、依赖关系等。
如果在项目级和模块级 build.gradle
中有重复配置,通常 模块级配置会覆盖项目级配置。例如:
- 在项目级配置了全局的仓库,但模块级如果重新定义了不同的仓库地址,那么模块级配置会优先使用。
- 项目级
dependencies
可以配置全局依赖,但具体模块也可以定义自己的依赖。
结论
Gradle 的 项目级 和 模块级 配置各自承担不同的任务:
- 项目级:配置全局的构建脚本、仓库、插件等。
- 模块级:配置特定模块的 SDK 版本、构建类型、依赖关系等。
这种分层配置的结构,使得多个模块可以独立管理,同时也能保证项目整体的一致性和灵活性。
如果 Gradle 使用的是较老的 TLS 协议版本,目标服务器(如 Google Maven 仓库)可能不再支持该协议。解决方案包括:
检查服务器配置:确保 Gradle 能够与仓库建立安全连接,并且仓库支持 TLS 1.2 或更高版本。
尝试不同的仓库源:您可以临时替换或添加其他仓库源,确保 Gradle 能够访问到依赖。
groovy
复制
编辑
repositories {
maven { url ‘https://dl.google.com/dl/android/maven2/’ }
maven { url ‘https://repo.maven.apache.org/maven2/’ }
maven { url ‘https://jcenter.bintray.com/’ } // 添加备用仓库源
}
Gradle 构建系统采用了分层的配置结构,使得可以根据不同的需求在不同的层次(项目级和模块级)配置构建选项。项目级 build.gradle
和模块级 build.gradle
在功能上有不同的作用,某些配置只允许在模块级的 build.gradle
中进行,而不能在项目级 build.gradle
中进行。下面是一些常见的配置差异以及它们的作用。
1. 构建类型(Build Types)
- 不能在项目级配置:
buildTypes
仅适用于模块级build.gradle
文件,指定不同构建类型(如debug
和release
)的配置。项目级配置无法设置buildTypes
,它是 模块特定的。 - 模块级配置:
- 用来定义不同的构建类型(例如,
debug
和release
)。 - 用于配置构建类型相关的选项,如 ProGuard、R8 混淆、签名、构建优化等。
- 用来定义不同的构建类型(例如,
示例(模块级 build.gradle
):
android {buildTypes {release {minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}debug {debuggable true}}
}
2. Flavors(构建风味)
- 不能在项目级配置:
productFlavors
也是模块级配置,用于创建多个不同版本的应用(例如,免费版和付费版),可以定义不同的 API 密钥、资源文件、代码库等。它与模块级的buildTypes
配合使用,允许你在不同的构建风味和构建类型之间创建多个组合。 - 模块级配置:
- 配置不同的产品风味,可以用于构建多个应用变体。
- 主要用于为不同用户群体定制应用,具有不同的资源、功能或依赖。
示例(模块级 build.gradle
):
android {productFlavors {free {applicationId "com.example.myapp.free"versionName "1.0-free"}paid {applicationId "com.example.myapp.paid"versionName "1.0-paid"}}
}
3. 签名配置(Signing Configs)
- 不能在项目级配置:签名配置
signingConfigs
必须在模块级build.gradle
文件中定义。项目级build.gradle
文件不能直接配置签名信息,因为签名是与模块级构建过程相关的。 - 模块级配置:
- 用于定义构建时如何对 APK 或 AAB 进行签名。
- 只有在模块级构建过程中需要应用签名时,才会使用签名配置。
示例(模块级 build.gradle
):
android {signingConfigs {release {storeFile file("release.keystore")storePassword "password"keyAlias "myKey"keyPassword "password"}}buildTypes {release {signingConfig signingConfigs.release}}
}
4. 资源与依赖配置
- 模块级才可以配置:虽然在项目级
build.gradle
中可以声明全局仓库和依赖(例如通过allprojects
),但每个模块级build.gradle
才能配置具体的资源、依赖版本等。dependencies
:项目级build.gradle
只能配置全局依赖,不能为单个模块配置特定的依赖版本。- 模块级配置:每个模块的
build.gradle
可以根据其功能需求,指定它的依赖、版本等。
示例(模块级 build.gradle
):
dependencies {implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.google.dagger:dagger:2.34.0'
}
5. 构建脚本插件的应用
- 不能在项目级配置:
apply plugin
和plugins
配置是用于应用特定的构建插件。项目级build.gradle
文件可以定义classpath
来配置插件,但每个模块的build.gradle
文件才是 实际应用插件 的地方。例如,apply plugin: 'com.android.application'
应该在模块级build.gradle
中配置,而不是项目级build.gradle
。
示例(模块级 build.gradle
):
apply plugin: 'com.android.application'android {compileSdkVersion 30defaultConfig {applicationId "com.example.myapp"minSdkVersion 21targetSdkVersion 30}
}
6. Android 构建配置(Android Block)
- 不能在项目级配置:整个
android
配置块只对模块级build.gradle
文件有效。你不能在项目级build.gradle
文件中配置compileSdkVersion
、defaultConfig
等 Android 构建设置。这些配置必须在每个模块的build.gradle
文件中定义。 - 模块级配置:模块的构建配置与 Android 的 SDK 版本、构建类型、版本号、资源管理等密切相关,必须在模块级
build.gradle
中进行。
示例(模块级 build.gradle
):
android {compileSdkVersion 30defaultConfig {applicationId "com.example.myapp"minSdkVersion 21targetSdkVersion 30}
}
7. 任务配置(Custom Tasks)
- 不能在项目级配置:虽然在项目级
build.gradle
文件中可以定义通用的任务(例如,clean
任务),但是某些特定于模块的任务配置只能在模块级build.gradle
中进行。 - 模块级配置:模块级
build.gradle
配置可以用于定义模块特定的任务,例如构建 APK 或 AAB 时,某些模块的构建过程可能需要特定的任务。
示例(模块级 build.gradle
):
task customTask {doLast {println 'This is a custom task for the module!'}
}
8. 插件的应用顺序
- 项目级配置:项目级
build.gradle
可以配置插件,但它主要用于应用构建相关的插件(如com.android.application
、com.android.library
等),并且定义插件版本。 - 模块级配置:模块级
build.gradle
才是实际 应用插件 的地方。项目级build.gradle
配置的是 插件的版本与来源,而具体应用插件的任务和设置则需要在模块级配置。
🔧 总结:哪些配置是项目级 build.gradle
不能配置而模块级可以配置的
buildTypes
和productFlavors
:与构建类型、风味相关的配置只能在模块级build.gradle
配置。- 签名配置(
signingConfigs
):签名配置在模块级定义。 - Android 构建配置(
android
):例如compileSdkVersion
、minSdkVersion
、defaultConfig
等。 - 模块特定的依赖配置:如
dependencies
,每个模块的依赖应该在各自的build.gradle
中配置。 - 插件的应用:
apply plugin
和plugins
只在模块级配置,项目级build.gradle
主要配置插件版本和来源。
这些设计能够使得 项目级和模块级配置的分离,提升 灵活性 和 可维护性。每个模块可以有自己独立的构建配置,而项目级则负责统一的构建管理和版本控制。
在 Gradle 中,不同模块使用不同的 SDK 或 Gradle 版本的情况是一个常见的需求,尤其是在复杂的 Android 项目中。有时我们希望某些模块使用特定的 SDK 版本、Gradle 插件版本,或者依赖不同的配置。这种情况下,我们需要理解 Gradle 和 Android 的版本管理机制,来确保不同模块之间的兼容性。
📍 1. 不同模块使用不同的 Gradle 版本
每个 Android 项目(或者更一般的 Java 项目)只有一个 全局的 Gradle 版本,它通常在根项目的 gradle-wrapper.properties
中配置:
# gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip
Gradle 版本 是 全局统一的,所有模块都必须使用这个版本。无法在单独的模块中指定不同的 Gradle 版本。
🤔 那么如果我在多个模块中需要不同的 Gradle 版本怎么办?
- 解决方案:你可以在 不同的项目 中使用不同的 Gradle 版本。也就是说,如果你有多个项目,你可以在每个项目的
gradle-wrapper.properties
中指定不同的 Gradle 版本。 - 但在 同一个项目 中,Gradle 版本必须统一。如果你需要在不同模块中使用不同的构建工具版本,通常是通过 插件版本(例如 Android Gradle 插件版本)来解决。
📍 2. 不同模块使用不同的 Android SDK 版本
每个模块都可以独立地配置自己的 SDK 版本,不会有冲突。SDK 版本配置是在每个模块的 build.gradle
文件中的 android
块里设置的。不同模块的 SDK 配置是 独立的,它们不会相互干扰。
示例:
假设你有两个模块:moduleA
和 moduleB
,它们的 build.gradle
可以分别配置不同的 SDK 版本。
moduleA
的 build.gradle
:
android {compileSdkVersion 33 // moduleA 使用 compileSdkVersion 33defaultConfig {minSdkVersion 21targetSdkVersion 33}...
}
moduleB
的 build.gradle
:
android {compileSdkVersion 30 // moduleB 使用 compileSdkVersion 30defaultConfig {minSdkVersion 19targetSdkVersion 30}...
}
在这种情况下,moduleA
和 moduleB
会各自使用它们自己指定的 SDK 版本 不会冲突。每个模块的 compileSdkVersion
、minSdkVersion
和 targetSdkVersion
都是独立的。
📍 3. 如何处理插件版本(如 Android Gradle 插件)?
- 插件版本也是全局的:通常来说,项目的根级
build.gradle
中定义了 Android Gradle 插件的版本。例如:
buildscript {repositories {google()mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:7.0.4' // Android Gradle 插件版本}
}
所有模块都会使用这个插件版本,不能在每个模块中单独定义不同版本的插件。这就意味着 Android Gradle 插件版本是 统一的,但你可以根据需要通过配置不同的模块来使用不同的 Android SDK 版本(如前所述)。
📍 4. Gradle 插件和依赖冲突问题
尽管不同模块可以独立配置 SDK 版本,但 依赖管理 仍然需要注意版本兼容性。如果不同模块使用的依赖版本不同,可能会导致 冲突,这种情况下 Gradle 会尝试 选择一个兼容的版本,或者你可以手动强制使用某个版本。
示例:依赖冲突
// moduleA 的 build.gradle
dependencies {implementation 'com.google.dagger:dagger:2.28.3'
}// moduleB 的 build.gradle
dependencies {implementation 'com.google.dagger:dagger:2.34.0' // 不同版本的 Dagger
}
在这种情况下,Gradle 会尽量选择兼容的版本。你也可以通过 resolutionStrategy
来强制使用某个版本:
configurations.all {resolutionStrategy {force 'com.google.dagger:dagger:2.34.0' // 强制使用 2.34.0 版本}
}
⚡ 总结:
- Gradle 版本:同一个项目中,Gradle 版本必须统一,无法在不同模块中使用不同的 Gradle 版本。
- SDK 版本:不同模块可以配置不同的 SDK 版本(
compileSdkVersion
、minSdkVersion
、targetSdkVersion
),这些配置是模块级的,不会相互冲突。 - 插件版本:Android Gradle 插件版本是全局统一的,同一个项目中所有模块使用相同的插件版本。
- 依赖管理:不同模块的依赖版本可能会冲突,Gradle 会尝试解决版本冲突,你也可以通过
resolutionStrategy
强制使用某个版本。
通过这些配置,Gradle 使得多个模块能够独立配置自己的 SDK 版本和依赖,确保每个模块有自己独立的构建配置。
如果你有更深入的问题或想要具体的配置实例,随时告诉我! 😎
🔧 configurations.all
配置的位置
configurations.all
配置通常用于 解决 Gradle 依赖冲突,它可以在 项目级 或 模块级 build.gradle
文件中的 dependencies
块外部进行配置,用于指定某些依赖的版本强制要求。常见的用法是 强制指定某个依赖的版本,以避免由于版本冲突导致的构建错误或不一致的行为。
🏗️ 1. 配置位置:
你可以将 configurations.all
配置放在:
- 项目级
build.gradle
:全局配置,适用于整个项目中的所有模块。 - 模块级
build.gradle
:仅影响该模块及其直接依赖的模块。
📍 2. 在项目级 build.gradle
中配置:
如果你想让整个项目的所有模块都强制使用特定版本的依赖,可以将 configurations.all
配置放到 项目级的 build.gradle
中。例如,通常这个配置会放在 allprojects
或 subprojects
块内。
// 项目级 build.gradle 示例
allprojects {repositories {google()mavenCentral()}configurations.all {resolutionStrategy {force 'com.google.dagger:dagger:2.34.0' // 强制所有模块使用 Dagger 2.34.0 版本}}
}
这种配置会使得 项目中所有模块 使用 Dagger 2.34.0
版本,而无论哪个模块声明了 Dagger
的不同版本。
📍 3. 在模块级 build.gradle
中配置:
如果你只想影响某个模块或某个模块的依赖冲突处理,可以将 configurations.all
配置放在模块级 build.gradle
文件中:
// 模块级 build.gradle 示例
dependencies {implementation 'com.google.dagger:dagger:2.28.3' // moduleA 依赖了较旧的 Dagger 版本
}configurations.all {resolutionStrategy {force 'com.google.dagger:dagger:2.34.0' // 强制该模块使用 Dagger 2.34.0 版本}
}
这种配置仅会影响当前模块及其直接依赖的模块,确保它们都使用指定的 Dagger 2.34.0
版本。
📍 4. 在 subprojects
中配置:
如果你的项目是多模块的,你可能想要在所有子项目中应用相同的版本强制策略。你可以在 subprojects
块内配置:
// 项目级 build.gradle 示例
subprojects {configurations.all {resolutionStrategy {force 'com.google.dagger:dagger:2.34.0' // 强制所有子项目使用 Dagger 2.34.0 版本}}
}
🎯 resolutionStrategy
的作用:
resolutionStrategy
是 Gradle 中的一个强大的功能,可以帮助你解决依赖冲突和版本不一致的问题。通过使用 force
,你可以强制 Gradle 在版本冲突时使用特定版本的依赖。
🧑💻 常见的 resolutionStrategy
使用场景:
- 强制某个依赖使用特定版本(如上例所示)
- 更改依赖的版本范围:比如指定
version
或者排除某些依赖的冲突 - 动态版本处理:例如处理某些版本间的依赖替换
configurations.all {resolutionStrategy {// 强制使用特定版本force 'com.google.dagger:dagger:2.34.0'// 也可以排除某个模块,避免它冲突eachDependency { details ->if (details.requested.group == 'com.google.dagger') {details.useVersion '2.34.0' // 如果 Dagger 是 2.x 系列中的版本,强制使用 2.34.0}}}
}
⚡ 总结:
configurations.all
配置可以放在项目级或模块级的build.gradle
中,用于 全局处理依赖版本冲突。- 如果你在 项目级
build.gradle
中配置,它会影响 所有模块。 - 如果在 模块级
build.gradle
中配置,它只会影响当前模块及其直接依赖的模块。 resolutionStrategy
用于解决依赖冲突,特别适合在项目中强制指定某个版本的依赖。
这种配置方式非常适合在多个模块中管理共享的依赖版本,尤其是在项目中存在版本不一致时,能够确保整个项目的一致性。
相关文章:
关于Android Studio的Gradle各项配置
Gradle 构建概览 Android 应用通常使用 Gradle 构建系统构建。在深入了解如何配置 build 之前,我们先来探索 build 背后的概念,以便您全面了解系统。 什么是 build? 构建系统会将源代码转换为可执行应用。构建通常涉及多个工具,用…...
数据安全和合规性市场分析
一、什么是数据安全和合规性 在数据安全和合规性方面,存在着一系列重要的法律、法规和行业标准,这些规定了组织如何收集、存储、处理和保护个人数据及其他敏感信息。企业之所以要遵守这些规定,是出于多方面的考量,既有法律责任&a…...
venv环境基础指令以及常见问题汇总(持续更新)
常见指令 在 Python 原生虚拟环境(venv) 中,没有直接列出所有虚拟环境的命令(因为 venv 不像 Conda 那样有集中管理机制),但可以通过 文件操作 或 脚本 实现类似功能。以下是常用命令和技巧: &…...
思科路由器重分发(RIP动态路由+静态路由)
路由器重分发(RIP动态路由静态路由) 静态路由不能作翻译官 RIP需要宣告自己的ip;还需要帮静态路由也宣告一下开启端口并配置IP地址 RIP路由 Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shutdown Router(c…...
产销协同的作用是什么?又如何对各部门发挥作用?
目录 一、产销协同的对象有哪些? 1. 客户需求 2. 市场趋势 3. 供应链伙伴 4. 企业战略目标 二、产销协同的作用是什么? 1. 提高客户满意度 2. 降低企业成本 3. 增强市场竞争力 4. 优化资源配置 三、产销协同对各部门怎么发挥作用?…...
19.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--当前项目拆分规划
随着业务规模的不断扩大和系统复杂度的提升,孢子记账系统需要进行微服务架构的转型。本文将详细规划从单体应用向微服务架构迁移的具体方案,包括功能模块分析、服务拆分、技术选型以及实施步骤等内容。通过合理的服务拆分和架构设计,未来我们…...
JFLAP SOFTWARE 编译原理用(自动机绘图)
csdn全是蛆虫,2mb的软件,都在那里搞收费,我就看不惯,我就放出来,那咋了!!! https://pan.baidu.com/s/1IuEfHScynjCCUF5ScF26KA 通过网盘分享的文件:JFLAP7.1.jar 链接: h…...
从 Vue 到 React:React 合成事件
目录 一、什么是 React 合成事件?二、处理流程React 事件系统的大致流程和 Vue 3 的区别 三、用法示例四、SyntheticEvent 的特点五、为什么 React 要统一事件到根节点?1.减少事件监听器数量2. 简化事件解绑逻辑3. 保证一致的行为 六、React 18 后事件系…...
react的fiber 用法
在 React 里,Fiber 是 React 16.x 及后续版本采用的协调算法,它把渲染工作分割成多个小任务,让 React 可以在渲染过程中暂停、恢复和复用任务,以此提升渲染性能与响应能力。在实际开发中,你无需直接操作 Fiber 节点&am…...
深度学习-学习笔记
文章目录 1、概述2、学习笔记2.1、pytorch 的环境配置 1、概述 本篇博客用来记录我学习深度学习的学习笔记 参考视频:PyTorch深度学习快速入门教程 PyTorch 是一个开源的机器学习框架,主要用于构建和训练深度学习模型。 2、学习笔记 2.1、pytorch 的环…...
[创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论
前言: 人、财、物、信息、机制、流程、制度、方法共同组合了一个持续的消耗资源、持续的价值创造、持续面临生存与发展、遗传与变异的社会性生命系统。 "人"是所有社会性生命系统最最基础性的要素,它弥漫在系统中多维立体空间的不同节点上&am…...
Redis常见面试题——List对象
当然可以!这里我帮你整理了一份【Redis中 List 结构】相关的高频面试题,并附上简明回答: 📚 Redis List 结构面试题(高频总结版) 1. Redis 中的 List 是什么?底层是什么实现的? 答&…...
案例速成GO操作redis,个人笔记
更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 安装redis客户端:go get github.com/redis/go-redis/v9 注意go …...
什么是WebSocket?NGINX如何支持WebSocket协议?
大家好,我是锋哥。今天分享关于【什么是WebSocket?NGINX如何支持WebSocket协议?】面试题。希望对大家有帮助; 什么是WebSocket?NGINX如何支持WebSocket协议? 1000道 互联网大厂Java工程师 精选面试题-Java…...
ssm驾校预约管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 伴随着我国社会的发展,人民生活质量日益提高。在人们出行方式上的体现就是,价格较为昂贵的代步工具——汽车,它的拥有率在我国越来越高了。而汽车的行驶速度很快,并且随着汽车拥有率的增加,城市中行驶和停靠的车…...
babel核心知识点
Babel 是一个 JavaScript 编译器,主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 代码,以便在旧版本的浏览器或环境中运行。以下是 Babel 的核心知识点: 1. 基本概念 编译器:Babel 本质上是一个编译器&…...
学习笔记(算法学习+Maven)
单调队列优化多重背包 #include <bits/stdc.h> using namespace std; const int M 2010; const int N 20010; int q[N]; int hh 0, tt -1; int f[N]; int g[N]; int v[M], w[M], s[M]; int n, m; int main() { cin >> n >> m; for (int i 1; …...
买币永续合约成全球交易热点,XBIT去中心化交易所平台显著提升市场流动性
在全球加密货币市场日益扩大的背景下,买币永续合约正展现出惊人的增长势头。虽然比特币自2021年黄金时期以来整体兴趣有所减弱,但永续合约市场表现亮眼,专业和机构交易者正从传统日历期货转向这一领域,使得永续合约占据了约66%的未…...
详解 `from datasets import load_dataset`:数据格式、公开数据集与自定义数据集实战指南
在自然语言处理(NLP)和机器学习领域,Hugging Face 的 datasets 库凭借其高效的数据加载和预处理能力成为开发者必备工具。本文通过代码示例详解 load_dataset 的核心用法,涵盖数据格式解析、公开数据集调用和自定义数据集构建。 一、数据格式解析与加载示例 datasets 库支…...
Eclipse 插件开发 1
Eclipse 插件开发 1 1 创建 Eclipse 插件2 特点对比表3 总结对比表 Eclipse 是一个功能强大的集成开发环境(IDE),最初为 Java 开发设计,但现在已经支持多种语言和平台。它的核心优势在于高度可扩展的插件架构,使开发者能够定制开发环境以满足…...
单链表专题(1)
1.什么是链表? 链表是结构体变量与结构体变量连接在一起 2.动态创建一个链表 动态内存申请模块化设计 1.创建链表(创建一个表头表示整个链表) 2.创建结点 3.插入结点 4.删除结点 5.打印遍历链表(测试) 3.创建链…...
[贪心_8] 跳跃游戏 | 单调递增的数字 | 坏了的计算器
目录 1.跳跃游戏 题解 2.单调递增的数字 证明 3.坏了的计算器 题解 解法一:正向推导 解法二:正难则反 1.跳跃游戏 链接: 55. 跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你…...
Python基于Django的全国二手房可视化分析系统【附源码】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
Spring Boot 升级指南(2.x → 3.x)
🚀 Spring Boot 升级指南(2.x → 3.x) 🔢 1️⃣ 必读文档 📘 当您需要从 Spring Boot 2.x 升级时: • 官方迁移指南 → https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-…...
基于亚马逊云科技构建音频转文本无服务器应用程序
Amazon Transcribe是一项基于机器学习模型自动将语音转换为文本的服务。它提供了多种可以提高文本转录准确性的功能,例如语言自定义、内容过滤、多通道音频分析和说话人语音分割。Amazon Transcribe 可用作独立的转录服务,也可以集成到应用程序中提供语音…...
io_uring概述:现代 Linux 异步 IO 的新范式
一、引言 在 Linux 系统中,I/O 性能一直是高性能服务器、数据库、存储系统的关键瓶颈。传统的 I/O 接口(如 read、write、poll、epoll)已经难以满足现代高吞吐低延迟场景的需求。io_uring 的诞生,正是为了解决这些传统 I/O 模型中…...
定制一款国密浏览器(12):分析SM2签名算法的实现
SM2 是一种非对称加密算法,除了用来进行加密解密外,主要作用还用作数字签名。数字签名是私钥签名,公钥用来验签。由于私钥是不公开的,所以私钥签名还可以防抵赖。 一般的签名流程如下: 发送者对消息计算摘要值。发送者用私钥对摘要值进行签名得到签名值。发送者将原始消息…...
SSE协议
目录 SSE协议协议实现传输格式data 字段id 字段event 字段retry 字段 前后端实现使用案例FastAPI SSE-STARLETTE 模拟大模型推理流🖥 代码:FastAPI SSE-STARLETTE 模拟大模型推理流 SSE协议 SSE,全称是 Server-Sent Events,是一…...
精益数据分析(25/126):关键指标驱动业务发展
精益数据分析(25/126):关键指标驱动业务发展 在创业和数据分析的道路上,我们都在不断探索如何利用数据实现业务的增长与优化。今天,让我们一起深入学习《精益数据分析》中的关键知识点,通过实际案例来理解…...
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
前言 Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。 项目地址 gitcode平台:ht…...
git 工具
Git教程 Git Bash详细教程 Git教程 Git Bash详细教程-CSDN博客 Download – TortoiseGit – Windows Shell Interface to Git...
利用【指针引用】对【非空单循环链表】进行删除操作
【非空单循环链表】是链式存储结构的其中一种,下面是各个词汇的意思: 先说【单】的意思: 这里指的是【单循环】的,另外在别的地方你会碰到一些不一样的循环链表,比如说是【多重链】的。 单循环 【单循环链表】常在表的…...
2025.4.26_STM32_SPI
1.SPI简介 2.硬件电路 所有SPI设备的SCK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)分别连在一起。SCK线只能被主机控制,和I2C相同。 主机另外引出多条SS控制线,分别接到各从机的SS引脚 (SS不用的时候为高电平,当主机需要选中某…...
基于OpenMV+STM32+OLED与YOLOv11+PaddleOCR的嵌入式车牌识别系统开发笔记
基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记 基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记系统架构全景 一、实物演示二、OpenMV端设计要点1. 硬件配置优化2. 智能帧率控制算法3. 数据传输协议设计 三、PyTorch后端核心实现:YOLOv11与PaddleOCR的…...
当JIT遇见K8s
目录 一、技术融合背景:从静态架构到动态生态的范式重构 1.1 动态编译技术的三次进化浪潮 1.2 容器编排系统的动态特性解剖 弹性伸缩的数学建模 服务质量(QoS)的编译场景适配 硬件拓扑感知的编译优化 二、关键技术挑战与突破性解决方案…...
单片机-89C51部分:4、固件烧录
飞书文档https://x509p6c8to.feishu.cn/wiki/M00gwFX3WilLe0kiAmBcPBUsnLc 接线 通过USB线把开发板和电脑连接起来,如果电脑没有安装过USB转串口驱动,在设备管理器中就找不到COM口,而且会有驱动提示叹号,我们可以下载下方驱动安…...
7.13 GitHub Sentinel全链路测试实战:自动化框架+零误差传输,QPS提升6倍!
GitHub Sentinel全链路测试实战:自动化框架+零误差传输,QPS提升6倍 GitHub Sentinel Agent 用户界面设计与实现 关键词:前后端联调测试、数据传输验证、接口稳定性测试、命令行工具测试、自动化测试框架 测试前后端功能与数据传输稳定性 1. 全链路测试策略设计 采用分层…...
stm32之EXIT外部中断详解
目录 1.引入: STM32F1031.1 中断路径上的3个部件1.2 STM32F103的GPIO中断1.1.1 GPIO控制器 -- AFIO1.1.2 EXTI1.1.3 NVIC1.1.4 CPU1. PRIMASK2. FAULTMASK3. BASEPRI 1.3 中断执行流程 2.旋转编码器介绍3.实验3.1 EXIT3.1.1 结构体3.1.2 函数 3.2 NVIC3.2.1 结构体3.2.2 函数 3…...
STM32 开发 - stm32f10x.h 头文件(内存映射、寄存器结构体与宏、寄存器位定义、实现点灯案例)
概述 STM32F10x.h 是 STM32F1 系列微控制器的核心头文件,提供了所有外设寄存器的定义和内存映射 一、内存映射 #define PERIPH_BASE ((uint32_t)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE 0x…...
UniApp 的现状与 WASM 支持的迫切性
一、UniApp 的跨平台优势与性能瓶颈 UniApp 凭借“一次开发,多端发布”的核心理念,已成为跨平台开发的主流框架之一。然而,随着移动应用场景的复杂化(如 3D 渲染、音视频处理、AI 推理),传统的 JavaScript…...
Prometheus、Zabbix和Nagios针对100个节点的部署设计架构图
一、Prometheus 架构图(联邦集群+分布式存储) graph TD;subgraph 全局监控层GlobalProm[Prometheus Server] -->|联邦查询| RegionalProm1[区域Prometheus]GlobalProm -->|联邦查询| RegionalProm2[区域Prometheus]GlobalProm -->|联邦查询| RegionalProm3[区域Pro…...
坚果派已适配的鸿蒙版flutter库【持续更新】
坚果派已适配的鸿蒙版flutter库 序号原仓版本适配仓文章解读是否完成1https://pub.dev/packages/fluttertoast8.2.12https://gitcode.com/nutpi/FlutterToasthttps://www.nutpi.net/thread?topicId1575是2https://pub.dev/packages/flutter_udid4.0.0https://gitcode.com/nut…...
代码随想录打卡|Day28 动态规划(理论基础、斐波那契数列、爬楼梯、使用最小花费爬楼梯)
动态规划 Part01 理论基础 代码随想录讲解链接 视频讲解链接 斐波那契数 力扣题目链接 代码随想录链接 视频讲解链接 题目描述: 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一…...
《USB技术应用与开发》第四讲:实现USB鼠标
一、标准鼠标分析 1.1简介 1.2页面显示 其中页面显示的“”不用管它,因为鼠标作为物理抓包,里面有时候会抓到一些错误,不一定是真正的通讯错误,很可能是本身线路接触质量不好等原因才打印出来的“”。 1.3按下鼠标左键 &#x…...
elk中kibana一直处于可用和降级之间且es群集状态并没有问题的解决方法
前言 在公司部elk的时候发现kibana的web界面一直很卡,数据量为0也会很卡,es群集状态正常,资源足够。 报错信息 [2025-03-17T09:54:50.19400:00][INFO ][status] Kibana is now available (was degraded) [2025-03-17T09:55:03.28000:00][I…...
2025.4.26总结
今天把马良老师的《职场十二法则》看完后,感触极大,这们课程就是一场职场启蒙课。 虽然看过不少关于职场的书籍,但大多数是关于职场进阶,方法方面的。并没有解答“面对未来二三十年的职场生涯,我该怎么去看待自己的工…...
一、UI自动化测试01--认识和元素定位方法
目录 一、自动化测试1. 自动化应用场景2. ⾃动化测试的优缺点3. ⾃动化测试的分类 二、UI ⾃动测试1. 适合使用的项目2. 实现时机3. 常⻅的UI⾃动化测试⼯具4. Selenium 框架5. Web ⾃动化环境部署6. Web ⾃动化基本代码 二、元素定位1. 浏览器开发者⼯具⽅法1: 直接获取信息⽅…...
目标检测原理简介
目标检测是一类计算机视觉任务,简单来说,目标检测可被定义为在计算机中输入一张图像,计算机需要找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,如图一所示。目标检测是计算机视觉领域的核心问题之一,相较于最原始的将整张图片分类为某一类别,目标检测不光可…...
软件设计原则
开闭原则 对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。 想要达到这样的效果,需要使用接口和抽象类。 因…...
Postman脚本处理各种数据的变量
一、变量是字符串里列表, 如 "["100","101","102","103","108"]" //把字符串的变量处理成列表 var myListJSON.parse(pm.environment.get(giftTabId)) #giftTabId变量名 //设置随机取值 var rando…...