[Android]常见的包管理方式

在Android开发中,包管理主要是通过构建和依赖管理工具来处理。下面列举了几种最常见和主流的包管理方式:

一、Gradle

Gradle 是 Android 官方推荐的构建工具,几乎成为了 Android 开发的标准。它支持自定义构建逻辑、依赖管理、多项目构建等,与 Android Studio 有很好的集成。

Gradle 是一个强大的构建系统,被广泛用于 Android 项目,特别是在使用 Kotlin 进行开发时。它不仅管理项目的构建过程,还处理依赖管理和其他自动化任务。

以下是如何在使用 Kotlin 开发 Android 应用时,通过 Gradle 进行包管理的介绍:

1. Gradle 配置文件

在 Android 项目中,主要有两种类型的 Gradle 配置文件:

  • 项目级别的 build.gradle (通常位于项目根目录):这个文件配置了整个项目范围内的设置,如 Gradle 插件版本和其他配置。
  • 模块级别的 build.gradle (位于 app 或其他模块的目录下):这个文件负责配置特定于模块的设置,包括依赖关系、SDK 版本等。

2. 添加依赖

在模块级别的 build.gradle 文件中,你可以添加外部库的依赖:

dependencies {// Kotlin 标准库implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"// AndroidX 核心库implementation 'androidx.core:core-ktx:1.6.0'// 添加其他库,例如 Retrofit 网络库implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0'// 测试库testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.3'androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

在Android开发中,Gradle通常会从几个主要的包管理网站获取依赖库。最常用的包括:

 Maven Central

  • 网站地址: Maven Central Repository
  • Maven Central 是Java和Android开发中最常用的库和依赖管理系统之一。它包含大量公开可用的库,是开发者查找和引用库的重要资源。

 Google's Maven Repository

  • 网站地址: Google's Maven Repository
  • 这是Google专门为Android开发者提供的Maven仓库。它包括所有支持库(Support Libraries)、AndroidX和其他Google开发的库,这些库是进行现代Android开发不可或缺的部分。

 JitPack

  • 网站地址: JitPack
  • JitPack是一个现代的包管理服务,它允许你直接从GitHub等Git仓库中获取Java和Android库。这使得即使库不在Maven Central或其他传统Maven仓库中,也能轻松地作为依赖添加到项目中。

3. 项目级别的 build.gradle 配置

在项目级别的 build.gradle 中,你需要指定 Gradle 插件和其他项目级别的配置:

buildscript {ext.kotlin_version = "1.5.21"  // 设置 Kotlin 版本repositories {google()mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:4.2.2'classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"}
}allprojects {repositories {google()mavenCentral()}
}

4. 同步和构建

在修改了 Gradle 配置或依赖后,你需要同步项目,以便 Android Studio 可以识别这些更改并下载必要的依赖。这可以通过点击 Android Studio 的 "Sync Now" 提示或从菜单中选择 "File" -> "Sync Project with Gradle Files" 来完成。

5. 使用 Kotlin DSL

对于 Kotlin 开发者,还可以选择使用 Kotlin DSL 来编写 Gradle 脚本,这使用的是 .gradle.kts 文件而不是常规的 .gradle 文件。Kotlin DSL 提供了更好的类型安全和 Kotlin 语言特性:

plugins {kotlin("android")kotlin("android.extensions")
}dependencies {implementation(kotlin("stdlib-jdk7"))implementation("androidx.core:core-ktx:1.6.0")implementation("com.squareup.retrofit2:retrofit:2.9.0")
}

6. 使用变量和版本管理

为了更好地管理依赖版本,你可以在项目级 build.gradle 中定义变量,然后在模块级 build.gradle 中使用这些变量。这样可以确保依赖库的版本一致性并简化维护。

二、Maven

虽然 Maven 在 Android 开发中不如 Gradle 流行,但它在 Java 社区中仍然非常受欢迎,并被用于一些老的 Android 项目。它提供了一种更传统的、基于 XML 的配置方式。

尽管 Gradle 是 Android 开发的首选构建系统,但 Maven 仍然可以用于管理 Android 应用的依赖和构建过程,尤其是在某些企业和遗留项目中。下面是如何在使用 Kotlin 开发 Android 应用时,通过 Maven 进行包管理的介绍。

1. 创建 Maven 项目

首先,你需要一个 Maven 项目。如果你是从零开始,可以使用 Maven 的命令行工具来生成一个基本的项目结构。例如:

$ mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2. 添加 Android Maven 插件

为了使 Maven 支持 Android 应用的构建,你需要在你的 pom.xml 文件中添加 Android Maven 插件。这个插件提供了必要的工具和任务,用于编译 Android 代码、打包 APK 等。

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>apk</packaging><properties><kotlin.version>1.3.72</kotlin.version><android.maven.plugin.version>4.5.0</android.maven.plugin.version></properties><build><plugins><plugin><groupId>com.simpligility.maven.plugins</groupId><artifactId>android-maven-plugin</artifactId><version>${android.maven.plugin.version}</version><configuration><sdk><platform>29</platform></sdk></configuration><extensions>true</extensions></plugin></plugins></build><dependencies><!-- Kotlin standard library --><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>${kotlin.version}</version></dependency><!-- Additional dependencies --></dependencies>
</project>

3. 添加依赖

在 pom.xml 文件的 <dependencies> 部分中,你可以添加所需的库。比如说,如果你想使用 Retrofit 来处理网络请求,你可以这样添加:

<dependency><groupId>com.squareup.retrofit2</groupId><artifactId>retrofit</artifactId><version>2.9.0</version>
</dependency>

4. 构建和运行

使用 Maven 构建 Android 项目,你可以使用以下命令:

$ mvn clean install

这个命令会编译你的项目、运行测试、并生成 APK 文件。

5. 管理版本和属性

通过在 <properties> 标签中设置版本号和其他常用变量,可以更容易地管理和更新这些值。这在管理多个依赖项的版本时尤其有用。

注意事项

  • 插件支持: Android Maven 插件并不像 Gradle 那样受到广泛支持。确保你使用的插件是最新的,或者至少是兼容目前 Android SDK 版本的。
  • Android Studio 集成: Android Studio 对 Maven 的支持不如对 Gradle 的支持。虽然可以使用 Maven,但可能需要手动调整更多的配置。

三、JitPack

JitPack 是一个简单的包管理服务,它可以将任何 GitHub、GitLab、Bitbucket 或其他公共 Git 仓库中的 Java 或 Android 项目直接转换为 Maven 或 Gradle 可用的库。在使用 Kotlin 开发 Android 应用时,JitPack 提供了一种便捷的方式来引入那些不在 Maven 中心仓库或其他常见仓库中的依赖。

但是请注意,JitPack 默认支持的是 GitHub、GitLab 和 Bitbucket。对于其他托管平台如 Gitee,可能需要一些额外的设置或者不被直接支持。

以下是如何在使用 Kotlin 开发的 Android 应用中通过 Gradle 使用 JitPack 进行包管理的详细步骤:

1. 在项目中启用 JitPack

首先,你需要在项目的根级 build.gradle 文件(项目级别的配置文件)中添加 JitPack 仓库。打开这个文件,找到 allprojects 部分,并在 repositories 块中添加 JitPack 的 URL:

allprojects {repositories {google()mavenCentral()maven { url 'https://jitpack.io' }}
}

在“settings.gradle.kts”文件中,请添加如下内容:

dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()maven {url = uri("https://jitpack.io")}}
}

 这样配置后,你的项目就可以从 JitPack 仓库中获取依赖。

2. 添加依赖

接下来,在你的模块级别 build.gradle 文件(通常是 app/build.gradle)中添加需要的库作为依赖。你需要知道库的 GitHub 用户名或组织名、仓库名以及版本标签。

假设你想添加一个名为 SomeLibrary 的库,该库由用户 SomeUser 在 GitHub 上维护,并且你想使用标签 v1.0 的版本,你可以这样添加依赖:

dependencies {implementation 'com.github.SomeUser:SomeLibrary:v1.0'
}

版本可以是特定的发行版标签、提交哈希或者分支名。如果你想依赖一个特定的提交,你可以这样做:

dependencies {implementation 'com.github.SomeUser:SomeLibrary:commit-hash'
}

对于JitPack不支持的库比如Gitee, 需要处理私有库的权限问题。

由于库是私有的,您需要确保在构建过程中有权限访问这个库。这通常涉及到添加访问令牌或设置 SSH keys。

  • 使用 Access Token
    您可能需要在 JitPack 配置中或在构建服务器上设置环境变量,以使用您的私有访问 token。

  • 使用 SSH Keys
    如果您使用的是本地机器或某些 CI 系统,您可能需要配置 SSH keys 以允许访问 Gitee 的私有仓库。

注意事项:

  • JitPack 兼容性:确保 JitPack 支持从 Gitee 托管的仓库构建,因为 JitPack 主要支持 GitHub、GitLab 和 Bitbucket。
  • 私有库访问:确保您已经正确设置了访问私有库所需的认证方法。
  • 库版本标签:确保您在 Gitee 仓库中对您想要使用的提交使用了正确的版本标签。

3. 同步项目

添加完依赖后,不要忘记同步你的项目。可以通过点击 Android Studio 的 "Sync Now" 提示或从菜单中选择 "File" -> "Sync Project with Gradle Files" 来完成。

4. 使用库

一旦依赖被正确添加和同步,你就可以在项目中使用该库的类和资源了。

常见问题和注意事项

  • 私有仓库:如果你正在使用的库在一个私有的 Git 仓库中,你需要在 JitPack 网站上登录并授权它访问该库。JitPack 将提供一个特定的令牌,你可以在 URL 中使用它来访问私有库。
  • 动态版本:尽管支持使用分支名作为版本,这种做法可能会导致构建不稳定。建议尽可能使用固定的标签或提交哈希。
  • 网络问题:由于 JitPack 是一个在线服务,任何网络问题都可能影响到从 JitPack 拉取依赖的过程。确保你的网络连接稳定。
  • 性能考量:从 JitPack 加载依赖可能比从更常用的 Maven 中心仓库慢,因为如果库不在 JitPack 的缓存中,JitPack 需要实时构建这些库。

四、Bazel

Bazel 是一个由 Google 开发的多语言、快速且可扩展的构建系统,它支持多种编程语言和平台,包括用于 Android 应用开发的 Kotlin。Bazel 的优势在于其高效的依赖管理和增量构建能力,这使得它非常适合大型或多项目(monorepo)环境。

在使用 Kotlin 开发 Android 应用时,使用 Bazel 进行包管理和构建需要遵循以下步骤:

1. 安装 Bazel

首先,你需要在你的开发环境中安装 Bazel。你可以从 Bazel 官方网站下载适合你操作系统的版本,并按照提供的安装指南进行安装。

2. 设置 Android 工程

创建工作区

在你的项目根目录创建一个名为 WORKSPACE 的文件。这个文件告诉 Bazel 如何处理项目的外部依赖和设置。

# WORKSPACE file# 加载 Android 规则
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")# 设置 Android SDK 和 NDK(确保已经安装并正确设置环境变量)
android_sdk_repository(name = "androidsdk",api_level = 29,build_tools_version = "29.0.2"
)# Google Maven 依赖
RULES_JVM_EXTERNAL_TAG = "4.0"
RULES_JVM_EXTERNAL_SHA = "62133c1250...更多SHA值"http_archive(name = "rules_jvm_external",strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,sha256 = RULES_JVM_EXTERNAL_SHA,url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)load("@rules_jvm_external//:defs.bzl", "maven_install")maven_install(artifacts = ["org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72",# 列出其他 Maven 依赖],repositories = ["https://maven.google.com","https://repo.maven.apache.org/maven2",],
)
定义构建规则

接下来,在你的项目中创建一个或多个 BUILD 文件,这些文件定义了如何构建应用的具体规则。例如,创建一个简单的 Android 应用可能需要以下的 BUILD 配置:

# BUILD fileload("@rules_kotlin//kotlin:kotlin.bzl", "kt_android_library")kt_android_library(name = "app",srcs = glob(["src/main/kotlin/**/*.kt"]),resource_files = glob(["src/main/res/**"]),manifest = "src/main/AndroidManifest.xml",deps = ["@maven//:org_jetbrains_kotlin_kotlin_stdlib_jdk8",# 添加其他依赖],
)

3. 构建和运行

使用 Bazel 构建和运行你的 Android 应用,可以使用如下命令:

# 构建 APK
bazel build //path/to/your/app:app# 运行
bazel mobile-install //path/to/your/app:app

注意事项

  • 学习曲线:Bazel 拥有较高的学习曲线,特别是对于初学者和小型项目来说,可能会显得复杂。
  • 集成:虽然 Bazel 支持多种语言和平台,但与某些 IDE(如 Android Studio)的集成不如 Gradle。
  • 性能:Bazel 在大型项目中表现出色,尤其是在增量构建和缓存管理方面,可以显著提高构建效率。

五、CMake

对于包含原生 C++ 代码的 Android 应用,CMake 是一个重要的工具。它是 Android Native Development Kit (NDK) 的支持工具之一,用于构建本地代码库。

在开发使用 Kotlin 的 Android 应用时,通常不会直接使用 CMake 进行包管理,因为 CMake 主要用于管理 C++ 代码的构建过程。然而,在 Android 应用开发中,如果你的项目涉及到使用 Kotlin 与 C++ 的交互(即使用 JNI —— Java Native Interface),那么你可能需要配置 CMake 来构建你的本地(native)代码部分。

以下是如何在涉及 Kotlin 和 C++ 代码的 Android 应用中设置和使用 CMake 的基本步骤:

1. 安装 CMake

确保你的开发环境中已经安装了 CMake。对于 Android 开发,Android Studio 已经包含了需要的 CMake 工具,你只需在 Android Studio 中启用即可:

  • 打开 Android Studio。
  • 进入 "File" > "Project Structure" > "SDK Location".
  • 确认或安装 "CMake"。

2. 配置 CMakeLists.txt

在项目中创建一个 CMake 配置文件,通常命名为 CMakeLists.txt。这个文件将定义如何构建 C++ 源代码。假设你有一些 C++ 源文件需要编译,你可以创建如下的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.4.1)  # 指定 CMake 的最小版本add_library( # 设置库的名称native-lib# 将库设置为共享库。SHARED# 提供源文件的相对路径。src/main/cpp/native-lib.cpp )find_library( # 定义变量log-lib# 指定要查找的系统库。log )target_link_libraries( # 指定目标库native-lib# 目标库需要链接的库${log-lib} )

3. 更新 build.gradle

接下来,你需要在 build.gradle 文件中配置 CMake。打开模块级别的 build.gradle 文件(例如 app/build.gradle),并添加 externalNativeBuild 配置:

android {...defaultConfig {...externalNativeBuild {cmake {// 提供 CMakeLists.txt 文件的路径path "CMakeLists.txt"}}}// 配置 CMake 的版本和路径externalNativeBuild {cmake {version "3.10.2"path "CMakeLists.txt"}}
}

4. 编译和运行

通过以上设置,当你构建你的 Android 项目时,CMake 会被调用来编译你的 C++ 源代码,并将生成的库与你的应用一起打包。你可以使用 Android Studio 的标准构建和运行按钮来执行这些操作。

注意事项

  • JNI:使用 JNI 时,确保你熟悉 Java 和 C++ 之间的接口关系。正确地处理数据类型转换和生命周期管理是非常重要的。
  • 性能:使用 native 代码可以提高某些类型应用的性能,但同时也增加了复杂性。确保 native 代码的使用是出于性能必要性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMS垃圾回收器为什么被移除

CMS&#xff08;Concurrent Mark-Sweep&#xff09;垃圾回收器是Java虚拟机中一种以获取最短回收停顿时间为目标的收集器。CMS的主要特点是它允许垃圾回收线程与应用程序线程同时运行&#xff0c;尽可能减少应用程序的停顿时间。尽管它在多核处理器上表现良好&#xff0c;并且能…

笨方法自学python(三)-数学计算

数字和数学计算 这章练习里有很多的数学运算符号。我们来看一遍它们都叫什么名字 plus 加号-minus 减号/ slash 斜杠*asterisk 星号% percent 百分号< less-than 小于号greater-than 大于号< less-than-equal 小于等于号 greater-than-equal 大于等于号 print ("I …

JavaScript中,改变this的三种方法

在JavaScript中&#xff0c;this 关键字是一个特殊的变量&#xff0c;它在函数执行时确定了函数的上下文。通常&#xff0c;this 指向调用该函数的对象。但是&#xff0c;在某些情况下&#xff0c;我们可能需要改变 this 的指向。以下是三种常见的方法来改变 this 的指向&#…

优先队列全面讲解

主题&#xff1a; 优先队列是一种非常有用的数据结构&#xff0c;它让你能够管理一组数据&#xff0c;使得每次访问或移除数据时&#xff0c;总是得到当前集合中优先级最高&#xff08;或最低&#xff09;的那个元素。这个特性让优先队列非常适用于需要快速访问集合中最重要元…

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业 1.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是&#xff1a;main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段&#xff0c;getShell&am…

暗区突围哪里获得测试资格 暗区突围测试资格获取方法

在游戏业界的浩瀚星空中&#xff0c;《暗区突围》如同一颗璀璨新星&#xff0c;以其独树一帜的游戏模式和前所未有的沉浸式体验&#xff0c;迅速吸引了全球玩家的目光。它不仅仅是一款游戏&#xff0c;更像是一次对勇气、智慧与团队合作的深度探索。玩家在危机四伏的暗区中&…

程序人生 | 人生如棋,落子无悔

人生的开始&#xff0c;始于哭声&#xff0c;浮浮沉沉几十年。终了&#xff0c;一声长叹&#xff0c;在一片哭声中撒手离去。 人生的道路虽然漫长&#xff0c;但是关键就是那么几次机会的选择&#xff0c;可以决定此后几十年的光阴。 有个故事讲&#xff1a;古代有个人去砍柴…

.kat6.l6st6r勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 在数字时代的洪流中&#xff0c;网络安全领域的新挑战层出不穷。近期&#xff0c;.kat6.l6st6r勒索病毒的出现再次打破了传统安全防护的界限。这种新型勒索病毒不仅具有高超的加密技术&#xff0c;更以其独特的传播方式和隐蔽性&#xff0c;给全球用户带来了…

干货教程【AI篇】| 目前全球最强AI换脸工具swapface详细图文教程及整合包下载

需要这个工具整合包的小伙伴可以关注一下文章底部公众号&#xff0c;回复关键词【swapface】即可获取。 从我们的链接下载&#xff0c;得到这个exe文件 双击运行即可进入安装界面 如下图所示已经在安装中啦 安装好之后我们根据上面的安装路径找到要执行的文件 双击红框中的…

三国杀背后的图形化编程 变量跟踪与吐槽的故事

在周末的公司里&#xff0c;卧龙凤雏等几位员工终于结束了加班任务&#xff0c;他们每个人都显现出些许疲惫之态&#xff0c;但心情还算较为轻松愉悦。突然&#xff0c;有人提议玩上几局三国杀&#xff0c;以此来让大家放松一下身心。于是乎&#xff0c;几人纷纷掏出手机&#…

Atcoder Beginner Contest353 A~E题解

文章目录 [A - Buildings](https://atcoder.jp/contests/abc353/tasks/abc353_a)[B - AtCoder Amusement Park](https://atcoder.jp/contests/abc353/tasks/abc353_b)[C - Sigma Problem](https://atcoder.jp/contests/abc353/tasks/abc353_c)[D - Another Sigma Problem](http…

MVC:一种设计模式而非软件架构

在软件开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;经常被提及&#xff0c;但很多人对其定位存在误解。本文将澄清一个常见的误区&#xff1a;MVC是一种设计模式&#xff0c;而非软件架构。 一、MVC简介 MVC&#xff0c;即模型&#xff08;Model&a…

24寸2K显示器 - HKC G24H2

&#x1f525;&#x1f5a5;️ 嘿&#xff0c;大家好&#xff01;今天&#xff0c;我要给大家介绍一款超棒的显示器——HKCG24H2&#xff01;这款显示器可是个全能选手&#xff0c;无论你是工作狂人还是游戏迷&#xff0c;它都能满足你的需求&#xff01; &#x1f60e;&#x…

ICode国际青少年编程竞赛- Python-2级训练场-基础训练3

ICode国际青少年编程竞赛- Python-2级训练场-基础训练3 1、 d Item.x - Dev.x Dev.step(d)2、 d Spaceship.x - Item.x Spaceship.step(d)3、 d Item.y - Dev.y Dev.step(d)4、 for i in range(4):Spaceship.step(2)d Item[i].x - Dev.xDev.step(d)Dev.step(-d)5、…

VMware 不能拍摄快照

问题&#xff1a; 拍摄快照后&#xff0c;会出现这个弹窗&#xff0c;然后虚拟机就直接自动退出了&#xff0c;还会弹出一个框&#xff1a; 解决方法&#xff1a; 我用的是 window11 和 VMware16.0.0 这是因为VM16与window11&#xff0c;二者之间版本不兼容问题&#xff0c;可…

【CTF Web】XCTF GFSJ0477 backup Writeup(备份文件+源码泄漏+目录扫描)

backup X老师忘记删除备份文件&#xff0c;他派小宁同学去把备份文件找出来,一起来帮小宁同学吧&#xff01; 解法 使用 dirsearch 扫描目录。 dirsearch -u http://61.147.171.105:49361/下载&#xff1a; http://61.147.171.105:64289/index.php.bak打开 index.php.bak&am…

西蓝花病害检测(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.基于最新的YOLOv8训练的西蓝花病害检测模型&#xff0c;和基于PyQt5制作的可视化西兰花病害检测系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的三类西兰花病害&#xff1a;Downy Mildew, Black Rot, Bacterial Sp…

vuex核心概念-mutations

目录 一、mutations基本认知 二、mutations的基本使用 三、mutations传参语法 四、注意 五、辅助函数&#xff1a;mapMutations 一、mutations基本认知 目标&#xff1a;明确vuex同样遵循单向数据流&#xff0c;组件中不能直接修改仓库的数据。 通过 strict:true可以开启…

Hamon Odyssey

Hamon Odyssey Hamon Odyssey 题解解题思路&#xff1a;核心代码&#xff08;套个main函数就完事了&#xff09;Hamon Odyssey Hamon Odyssey 题解 CF原题&#xff0c;洛谷原题 拓(一定要看呐!)&#xff1a; & 的详解 解题思路&#xff1a; 先将所有数&&#xff0c;结…

Linux —— 信号(4)

Linux —— 信号&#xff08;4&#xff09; 信号的处理用户态和内核态 信号的捕捉sigaction sa_mask字段volatileSIGCHLD信号 我们今天接着来看信号&#xff1a; 信号的处理 信号的处理简单一句话就是在内核态处理的。 用户态和内核态 用户态和内核态是操作系统和计组中的概…