[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=false2. 添加 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 代码的使用是出于性能必要性。
相关文章:
[Android]常见的包管理方式
在Android开发中,包管理主要是通过构建和依赖管理工具来处理。下面列举了几种最常见和主流的包管理方式: 一、Gradle Gradle 是 Android 官方推荐的构建工具,几乎成为了 Android 开发的标准。它支持自定义构建逻辑、依赖管理、多项目构建等…...
 
每日10亿数据的日志分析系统OOM
背景 一个每日10亿数据的日志清洗系统,主要工作就是从消息队列中消费各种各样的日志,然后对日志进行清洗,例如:用户敏感信息(姓名、手机号、身份证)进行脱敏处理,然后把清理完的数据交付给其他系统使用。 我们项目中,…...
 
智能驱动,精准管理:打造高效干部管理系统
干部管理系统是现代组织管理中不可或缺的工具,它通过信息技术的应用,提高了干部管理的效率和准确性。干部管理系统的主要功能包括: 1. 信息管理:系统可以存储和管理干部的个人信息,包括基本资料、工作经历、教育背景、…...
 
轮式机器人简介
迄今为止,轮子一般是移动机器人学和人造交通车辆中最流行的运动机构。它可达到很高的效率, 如图所示, 而且用比较简单的机械就可实现它的制作。 另外,在轮式机器人设计中,平衡通常不是一个研究问题。 因为在所有时间里,轮式机器人一般都被设计成在任何时间里所有轮子均与地接…...
已知哈夫曼节点个数,求哈夫曼字符编码数
哈夫曼编码(Huffman Coding)是一种用于无损数据压缩的嫡编码(权编码)算法。 在哈夫曼树中,每个叶子节点都代表一个字符,而节点的权重通常代表字符的频率。在哈夫曼编码中,每个字符都会被赋予一个二进制编码。为了获得这些编码,我…...
Kubernetes Cluster IP,Node IP,Pod IP间通信原理解析
目录 1、Cluster IP2、Node IP3、NodePort4、Pod IP5、LoadBalancer6、三种IP间通信6.1、Pod IP 与 Pod IP 通信6.2、Pod IP 与 Cluster IP 通信6.3、Node IP 与 Pod IP 通信6.4、Node IP 与 Cluster IP 7、YAML 示例7.1、ClusterIP Service7.2、LoadBalancer Service 1、Clust…...
 
随机链表的深拷贝
1.题目 解题思路一:暴力求解,先创建新链表,然后把旧链表中的val和next指针给复制到新链表中,根据旧链表中的random指针所指向的旧链表中的val值找到所对应的节点,记录该节点的位置,就像数组一样,…...
328_C++_HTTP_HTTP协议传输data数据,为什么要进行base64编解码操作?
http传输data数据的时候,为什么必须进行base64转码后才能有效发送,接收方也必须base64转码后才能有效接受? HTTP HTTP传输数据时,使用Base64编码并不是必须的,但它确实在某些情况下非常有用。以下是为什么在某些情况…...
 
【二叉树】Leetcode N 叉树的层序遍历
题目讲解 429. N 叉树的层序遍历 算法讲解 在做层序遍历的时候由于它的每一个结点是有val vector child组成,所以在做层序遍历的时候需要考虑它每一层结点的个数,那我们就可以使用一个queue保存每一层的结点;那么我们在做第一层的时候&am…...
 
Spring AI
目录 一、Spring AI 1、Spring AI简介 1.1、四次工业革命发展和变革 1.2、什么是人工智能? 1.3、人工智能的发展历程 1.4、什么是大模型? 1.5、如何训练大模型? 一、Spring AI 1、Spring AI简介 Spring AI Java接入人工智能大模型 1.1、四次工业革命发展和变革 人类…...
fiori SAP ui5 动态改变控件颜色
使用CustomData动态改变控件颜色 有时候我们需要改变控件颜色,对于高度封装的控件,显然改变控件CSS是比较困难的,幸好SAP UI5预设了一个customData的属性,每个控件都能使用她。 如下代码是判断汇率是否有改变,如果改…...
RabbitMQ php amqp
Linux debian 安装 Windows php amqp 扩展 PECL :: Package :: amqp 将 php_amqp.dll 复制到 php 的 ext 目录下 将 rabbitmq.4.dll 复制到 c:\windows\system32 目录下 php.ini extensionamqp...
 
对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:falses 思路:我刚开始是想着用…...
浅浅总结SQL中的事务.
在现实生活中有很多的线上支付的场景,当支付的时候,一方资金减少,另一方资金增加,在执行前后,两者的总体数额需要相同,为了保证这个操作的完整,所以提出了事务,那我们先来去写一个示例ÿ…...
 
C++ | Leetcode C++题解之第76题最小覆盖子串
题目: 题解: class Solution { public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const au…...
 
什么可以替代iframe?
网页嵌套中,iframe曾几何时不可一世,没有其他更好的选择! iframe即内联框架,作为网页设计中的一种技术,允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利,但也存在多方面的缺陷…...
HTTP/1.0、HTTP/1.1、HTTP/2.0区别
文章目录 区别HTTP/1.0HTTP/1.11. 持久连接(长连接)2. 管道化3. Host头字段4. 分块传输编码5. 缓存机制6. 请求方法 HTTP/2.01. 二进制分帧2. 多路复用3. 服务器推送4. 优先级设置5. 头信息压缩6. 安全性7. 流量控制 区别 特性HTTP/1.0HTTP/1.1HTTP/2.0…...
 
鸿蒙内核源码分析(文件句柄篇) | 你为什么叫句柄
句柄 | handle int open(const char* pathname,int flags); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd);只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大…...
 
2024.5.8 关于 SpringCloud —— Ribbon 的基本认知
目录 Ribbon 负载均衡原理 工作流程 Ribbon 负载均衡规则 Ribbon 负载均衡自定义化 代码方式修改规则 配置文件方式修改规则 小总结 Ribbon 设定饥饿加载 Ribbon 负载均衡原理 工作流程 order-service 使用 RestTemplate 发送请求,随后该请求将会被 Ribbon 所…...
Lua 协程模拟 Golang 的 go defer 编程模式
封装go函数用于创建并启动一个协程: ---go函数创建并启动一个协程 ---param _co_task function 函数原型 fun(_co:thread) function go(_co_task)local co coroutine.create(_co_task) -- 创建一个暂停的协程coroutine.resume(co, co) -- 调用coroutine.resume激活…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
 
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
 
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
 
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
 
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
