当前位置: 首页 > news >正文

Android Gradle多渠道打包

目录

    • 1.多渠道打包是什么
    • 2.为什么需要多渠道打包
    • 3.多渠道配置
      • Variant
      • productFlavors
      • buildTypes
    • 3.构建变体组合
      • 关于组合
    • 4.渠道过滤
    • 5.渠道资源
      • 资源文件
      • 资源合并规则
      • 代码文件
      • SourceSets
    • 6. 渠道依赖项
    • 7.渠道统计
      • meta-data
      • BuildConfig
    • 8.管理渠道

1.多渠道打包是什么

多聚道打包指的是同一个应用生成多个不同的安装包,通常是APK文件,每个安装包可以包含不同的配置,资源。

2.为什么需要多渠道打包

1.数据统计:根据渠道区分来源,统计各个渠道的下载量和覆盖率;
2.精细化运营:根据数据分析来做营销和推广,提高应用的曝光
3.产品适配:需要适配不同厂商的系统API

3.多渠道配置

Variant

Variant是变体的意思,变体是指应用可以构建不同的版本,比如国内版和海外版,免费版和企业版等。
变体由多个构建类型组合而成,例如debug与release,以及构建脚本中定义的产品变种。

productFlavors

productFlavors翻译过来就是产品变种,用来定义不同的变体,每个变体可以有不同的配置和资源,最终打出来的包也不一样·

以华为、oppo为例子,在app/build.gradle文件中配置多渠道:

    flavorDimensions = ["version"]productFlavors {oppo {dimension = 'version'applicationId = 'com.example.gradlestudy.oppo'versionName = '1.0'versionCode = 1}huawei {dimension = 'version'applicationId = 'com.example.gradlestudy.huawei'versionName = '1.0'versionCode = 1}}

在productFlavors中通过create来创建渠道,并在渠道中按需配置属性参数。
比如applicationId所有渠道保持一致,这样可以保证一个设备只有一个应用安装,反正,如果想在一个设备上安装多个应用版本,也可以通过多渠道的方式来实现。
在build.gradle中defaultConfig{}中的配置为应用默认配置,都可以在渠道配置productFlavors{}中进行覆写和追加。
falvorDimensions表示产品变种的维度(Dimensions),是组的概念,同一个维度即为一个产品变种组,这里定义的是[version],名字可以自定义,也可以增加多个。
比如增加一个维度channel,比如要发布到Google Play和Amazon应用商店,这两个渠道可能有不同的品牌要求。

 flavorDimensions = ["version"]+["channel"]productFlavors {create("oppo") {dimension = 'version'applicationId = 'com.example.gradlestudy.oppo'versionName = '1.0'versionCode = 1}create("huawei") {dimension = 'version'applicationId = 'com.example.gradlestudy.huawei'versionName = '1.0'versionCode = 1}create("googlePlay") {dimension "channel"applicationId "com.example.gradlestudy.googleplay"versionName = '1.0'versionCode = 1}create("amazon") {dimension "channel"applicationId "com.example.gradlestudy.amazon"versionName = '1.0'versionCode = 1}}

每个维度的产品变种可以相互结合,生成不同的构建变体。例如,定义两个维度version和channel,每一个维度中包含两个产品风味,2*4=8的构建变体。

buildTypes

buildTypes是构建类型,用来定义构建类型配置,比如是否开启混淆,是否开启调试,通常包含debug和release两种类型。

    buildTypes {getByName("debug") {isDebuggable = true}getByName("release") {isMinifyEnabled = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")}}

在多渠道配置中,构建类型和产品变种(productFlavors)一起使用,可以形成不同组合的构建变体(Variants)
在这里插入图片描述

3.构建变体组合

在配置完多渠道之后,打包方式跟平常的Run的有些区别,以前是单一的构建变体,现在是多组合的构建变体。

在AndroidStudio右侧打开Gradle面板,在build目录下可以看到具体的构建选项。
在这里插入图片描述
assemble是最全的构建方式,也就说所有的构建变体组合都会执行打包操作
assembleDebug会一次性打出4个包,比如执行assembleDebug会打出huaweiAmazonDebug,oppoAmazonDebug,huaweiGooglePlayDebug,oppoGooglePlayDebug
在这里插入图片描述
除了从Gradle面板选择任务执行之外,也可以使用命令行执行,例如:

./gradlew assembleDebug
// or 
./gradlew assembleHuawei

关于组合

现在的构建配置是:

  • 2个维度(flavorDimensions): version,channel
  • 4个产品变种(productFlavors):oppo,huawei,googlePlay,amazon
  • 2个构建类型(buildTypes):debug,release

会构成2x4x2的组合

4.渠道过滤

在某些情况下,想在渠道构建中去掉某个渠道,这个时候可以创建变体过滤器来移除它。

    variantFilter{variant ->def flavors = variant.getFlavors()*.name // 获取所有维度的风味名称列表def buildTypeName = variant.buildType.nameprintln("names-------> ${variant.flavors*.name}----${variant.buildType.name}")if(flavors.contains("googlePlay") && flavors.contains("oppo") && buildTypeName == "debug"){println "忽略变体: ${flavors.join('-')}-${buildTypeName}"setIgnore(true)}}

可以看到Build Variants中不会再显示oppoGooglePlayDebug变体
在这里插入图片描述

  • 使用 variant.getFlavors() 获取所有维度的产品风味名称。
  • 使用 variant.buildType.name 获取构建类型名称。
  • 根据条件调用 setIgnore(true) 忽略不需要的变体。

5.渠道资源

随着市场多元化的发展,很多应用也出现了企业版,海外版,极速版等多种版本,对于渠道配置的定制诉求也越来越多,比如资源文件(文本、图片),以及代码

资源文件

以常见的App名称和Icon图标为例,默认在AndroidManifest.xml文件中的application标签中有如下配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:icon="@mipmap/ic_launcher"android:label="@string/app_name"></application>
</manifest>

android:icon和android:label分别引用的是app/src/main/目录下的mipmap图片资源和文本资源
在这里插入图片描述
这里的app/src/main目录为主目录,main相当于默认渠道,也可以新增其他渠道目录。
以huawei版为例子,在app/build.gradle文件中配置如下:

  • res文件夹下新增values文件夹,values文件夹下新增strings.xml文件,并配置华为版的应用名称
  • res文件夹下新增drawable和mipmap文件夹,并放置华为版的应用图标;

在这里插入图片描述

<resources><string name="app_name">GradleStudy huawei</string>
</resources>

这样在构建渠道变体华为的时候,Gradle会根据构建变体来找对应的目录文件,也就是说AndroidManifest.xml文件的android:icon和android:label引用的资源路径会从原来的main目录变为huawei目录。
在Build Variants中选择huaweiDebug变体
在这里插入图片描述
点击run查看运行效果
可以发现app应用图标和名字都换位huawei目录下对应的资源文件。

资源合并规则

  • 渠道构建时,渠道变体(huawei)会跟主变体(main)目录下的资源进行合并
    -如有同名配置资源,例如strings.xml文件中的app_name,则优先取渠道(huawei)配置资源进行覆盖,其他不同名的则进行合并;
  • layout文件、assets文件则是替换,渠道资源(huawei)优先于主变体(main)资源;

代码文件

代码文件不支持合并也不支持同名
比如在huawei渠道新增一个huaweiBean类,然后在main目录下也新增一个huaweiBean类,则会出现同名异常。
在这里插入图片描述
渠道中的代码为该渠道专属,只有在该渠道编译时才会与主变体main中的代码进行融合。
比如当切到oppoDebug渠道变体时,在main中就无法找到HuaweiBean类
在这里插入图片描述
如果oppo渠道想复用huawei渠道的代码可以使用sourceSets了。

SourceSets

sourceSets可以为渠道指定代码路径,以及res,manifest等资源文件路径。
如果oppo渠道想要复用huawei渠道的代码,我们就可以使用sourceSets来进行设置。
在app/build.gradle文件中配置如下:

    sourceSets {oppo {res {srcDirs 'src\\oppo\\res'java.srcDirs("src/oppo/java", "src/huawei/java")}}}

在oppo渠道配置中,指定代码路径,这样,在oppo渠道变体进行编译时,就会把src/huawei/java目录下的代码进行融合,从而实现复用huawei渠道代码的功能。
除了指定java,res目录下的代码文件之外,其他资源代码文件也是支持的,可以按需指定多个目录。

    sourceSets {oppo {res {java.srcDirs("src/oppo/java", "src/huawei/java")kotlin.srcDirs("src/huawei/kotlin")aidl.srcDirs("src/huawei/aidl")res.srcDirs("src/huawei/res")assets.srcDirs("src/huawei/assets")jniLibs.srcDirs("src/huawei/jniLibs")renderscript.srcDirs("src/huawei/rs")manifest.srcFile("src/huawei/AndroidManifest.xml")}}}

6. 渠道依赖项

除了资源文件和代码文件之外,我们的依赖可能会根据渠道有所不同,比如在做推送功能的时候,在打华为渠道包的时候,只依赖华为的推送,而不依赖oppo的推送,也就是根据渠道来配置依赖项。
当我们配置了渠道就会有对应的变体,[变体]+[依赖方式]就是渠道特有的依赖了。
以华为推送为例

dependencies {
huaweiImplementation("com.huawei.hms:push:6.11.0.300")
}

多渠道依赖方式:

  • 默认依赖:implementation
  • 渠道依赖:变体+Implementation,如huaweiImplementation
  • 构建类型:类型+Implementation,如debugImplementation
  • 组合变体:变体+类型+Implementation,如huaweiDebugImplementation

7.渠道统计

通过在打包前预置渠道信息,然后在运行时获取并上报,从而实现渠道的数据统计。
有两种方式

meta-data

meta-data标签通常在AndroidManifest.xml文件中使用,通过键值对的方式为组件提供附加配置信息。
常见的第三方渠道统计比如友盟,会在AndroidManifest.xml中使用标签通过占位符的方式,来存储渠道信息。
配置meta-data:

       <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_NAME}"/>

配置占位符:

    productFlavors {create("oppo") {manifestPlaceholders["UMENG_CHANNEL_NAME"] = "oppo"}create("huawei") {manifestPlaceholders["UMENG_CHANNEL_NAME"] = "huawei"}}

可以通过manifestPlaceholders来替换AndroidManifest.xml文件中的value的值,确保UMENG_CHANNEL_NAME要对应上。
获取渠道信息的方法:
通过PackageManager获取并读取meta-data信息

    fun getChannel(context:Context):String?{try {val applicationInfo = context.packageManager.getApplicationInfo(context.packageName,PackageManager.GET_META_DATA)if(applicationInfo.metaData!=null){return applicationInfo.metaData.getString("UMENG_CHANNEL")}}catch (e:PackageManager.NameNotFoundException){//处理异常}return null}

BuildConfig

BuildConfig通常用来存储一些常量信息,比如版本号,或者在buildTypes中根据构建环境来定义接口请求的域名地址等,BuildConfig会在编译时生成class文件。实际上在配置多渠道信息的时候,已经默认在BuildConfig中注入渠道信息了。
在这里插入图片描述
获取渠道:
调用BuildConfig.FLAVOR
如果想要自定义渠道信息,比如增加渠道号,也可以通过BuildConfig来存储
在Gradle8 +版本中,需要开启BuildConfig功能

    buildFeatures{buildConfig = true}
    productFlavors {create("oppo") {buildConfigField("int","CHANNEL_CODE","1001")}create("huawei") {buildConfigField("int","CHANNEL_CODE","1002")}}

配置完后重新运行就可以看到对应生成key的常量了
在这里插入图片描述

8.管理渠道

当渠道配置越来越多的时候,app目录下的build.gradle文件就会显得有些不易阅读和维护,这时候可以将配置模块化,把渠道相关配置抽成一个channel.gradle文件,然后在app/build.gradle文件中apply依赖进来,这样可以更好的管理和维护渠道项目的渠道配置,app/build.gradle文件也会少一些。
在项目根目录中新建channel.gradle文件,并配置如下:

android{flavorDimensions = ["version"]productFlavors {create("oppo") {dimension = 'version'applicationId = 'com.example.gradlestudy.oppo'versionName = '1.0'versionCode = 1manifestPlaceholders["UMENG_CHANNEL_NAME"] = "oppo"buildConfigField("int", "CHANNEL_CODE", "1001")}create("huawei") {dimension = 'version'applicationId = 'com.example.gradlestudy.huawei'versionName = '1.0'versionCode = 1manifestPlaceholders["UMENG_CHANNEL_NAME"] = "huawei"buildConfigField("int", "CHANNEL_CODE", "1002")}}sourceSets {huawei {res {srcDirs 'src\\huawei\\res'}}getByName("oppo") {res {srcDirs 'src\\oppo\\res'//java.srcDirs("src/oppo/java", "src/huawei/java")}}}
}
apply from:"../channel.gradle"

重新sync即可

相关文章:

Android Gradle多渠道打包

目录 1.多渠道打包是什么2.为什么需要多渠道打包3.多渠道配置VariantproductFlavorsbuildTypes 3.构建变体组合关于组合 4.渠道过滤5.渠道资源资源文件资源合并规则代码文件SourceSets 6. 渠道依赖项7.渠道统计meta-dataBuildConfig 8.管理渠道 1.多渠道打包是什么 多聚道打包…...

Day58 | 179. 最大数、316. 去除重复字母、334. 递增的三元子序列

179. 最大数 题目链接&#xff1a;179. 最大数 - 力扣&#xff08;LeetCode&#xff09; 题目难度&#xff1a;中等 代码&#xff1a; class Solution {public String largestNumber(int[] nums) {String[] strsnew String[nums.length];for(int i0;i<nums.length;i)str…...

LabVIEW发电机励磁系统远程诊断

变流器在风电系统中承担电能转换与控制的关键角色。它将发电机输出的低频、可变交流&#xff0c;通过整流、逆变等环节转为频率、电压稳定的交流&#xff0c;以满足电网接入要求&#xff1b;同时&#xff0c;根据实时风速调整发电机转速&#xff0c;实现最大功率追踪。 ​ 在某…...

性能比拼: Go vs Bun

本内容是对知名性能评测博主 Anton Putra Go (Golang) vs. Bun: Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 我对 Bun 在之前的基准测试中的出色表现感到惊讶&#xff0c;因此我决定将它与 Go …...

Kubernetes相关的名词解释Dashboard界面(6)

什么是Kubernetes Dashboard&#xff1f; Kubernetes Dashboard 是一个基于 Web 的用户界面&#xff0c;用于管理 Kubernetes 集群。它是 Kubernetes 官方提供的可视化工具&#xff0c;允许用户通过直观的图形界面而不是命令行来部署、管理和监控集群中的应用程序。 Dashboard…...

Linux网络编程 TCP---并发服务器:多进程架构与端口复用技术实战指南

知识点1【并发服务器—多进程版】 并发服务器&#xff1a;服务器可以同时服务多个客户端 首先复习一下服务器的创建过程&#xff08;如下图&#xff09; 1、监听套接字&#xff08;套接字→绑定→监听&#xff08;连接队列&#xff09;&#xff09; 2、利用accept从连接队列…...

(done) 吴恩达版提示词工程 1. 引言

url: https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 LLM 有两种&#xff1a; 1.基础 LLM&#xff0c;通过文本训练数据预测后面的内容。 这种 LLM 当你给它提问&#xff1a;What is…...

uniapp微信小程序实现sse

微信小程序实现sse 注&#xff1a;因为微信小程序不支持sse请求&#xff0c;因为后台给的是分包的流&#xff0c;所以我们就使用接受流的方式&#xff0c;一直接受&#xff0c;然后把接受的数据拿取使用。这里还是使用uniapp的原生请求。 上代码 //注意&#xff1a;一定要下…...

【TeamFlow】3 Rust 与 WebAssembly (Wasm) 深度应用指南

WebAssembly 是一种低级的类汇编语言&#xff0c;能在现代浏览器中高效执行。Rust 因其无 GC、内存安全和卓越性能&#xff0c;成为编译到 Wasm 的理想语言。 一、为什么选择 Rust Wasm 性能优势&#xff1a;Rust 生成的 Wasm 代码执行效率接近原生 内存安全&#xff1a;避免…...

C 语言的未来:在变革中坚守与前行

C 语言&#xff0c;作为编程语言领域的一位 “老将”&#xff0c;自诞生以来就一直扮演着至关重要的角色。历经数十年的发展&#xff0c;它的影响力依然广泛而深远。在科技飞速发展的今天&#xff0c;新的编程语言如雨后春笋般不断涌现&#xff0c;C 语言的未来发展走向成为了众…...

SQL注入之information_schema表

1 information_schema表介绍&#xff1a; information_schema表是一个MySQL的系统数据库&#xff0c;他里面包含了所有数据库的表名 SQL注入中最常见利用的系统数据库&#xff0c;经常利用系统数据库配合union联合查询来获取数据库相关信息&#xff0c;因为系统数据库中所有信…...

android framework开发的技能要求

作为Android Framework开发工程师,需要具备深入的系统底层理解能力和对Android架构的全面认知。以下是核心技能要求,分为技术能力和软实力两大方向: 一、核心技术能力 Android系统架构深度掌握 Binder机制:理解Binder驱动、ServiceManager、AIDL跨进程通信原理,能分析Bind…...

AWS EC2完全指南:如何快速搭建高性能云服务器?

一、什么是AWS EC2&#xff1f;云时代的虚拟服务器革命 AWS Elastic Compute Cloud&#xff08;EC2&#xff09;作为全球领先的云服务器解决方案&#xff0c;正在重新定义虚拟服务器的可能性。与传统VPS相比&#xff0c;EC2提供&#xff1a; 秒级弹性扩展&#xff1a;CPU/RAM按…...

go环境安装mac

下载go安装包&#xff1a;https://golang.google.cn/dl/ 找到对应自己环境的版本下载。 注意有二进制的包&#xff0c;也有图形界面安装的包。图形界面直接傻瓜式点就行了。 二进制的按照下面操作&#xff1a; 1、下载二进制包。 2、将下载的二进制包解压至 /usr/local目录…...

Python实现对大批量Word文档进行批量自动化排版(15)

前言 本文是该专栏的第15篇,后面会持续分享Python办公自动化干货知识,记得关注。 在本专栏上一篇文章《Python实现对目标Word文档进行自动化排版【4万字精讲】(14)》中,笔者已经详细介绍“基于Python,实现对目标docx格式的word文档进行自动化排版”的实战教学(文章附带…...

嵌入式面试题解析:二维数组,内容与总线,存储格式

在嵌入式系统领域&#xff0c;扎实掌握基础概念是应对面试的关键。本文通过典型面试题&#xff0c;详细解析核心知识&#xff0c;梳理易错点&#xff0c;并补充常见面试题&#xff0c;助力新手快速入门。 一、二维数组元素地址计算 题目 若二维数组 arr[0..M-1][0..N-1] 的首…...

【iOS】alloc init new底层原理

目录 前言 alloc alloc核心操作 cls->instanceSize(extraBytes) calloc obj->initInstanceIsa init 类方法&#xff1a; 实例方法&#xff1a; new 前言 笔者最近在进行对OC语言源码的学习&#xff0c;学习源码的过程中经常会出现一些从来没有遇见过的函数&…...

解决vscode找不到Python自定义模块,报错No module named ‘xxx‘

1、 首先在.vscode下的launch.json中添加"env": {“PYTHONPATH”: “${workspaceRoot}”} {"version": "0.2.0","configurations": [{省略其他配置"env": {"PYTHONPATH": "${workspaceRoot}"}}] }2、 …...

【某比特币网址请求头部sign签名】RSA加密逆向分析

目标&#xff1a;aHR0cDovL21lZ2FiaXQudmlwL21hcmtldA 直接搜索sign不方便定位&#xff0c;可以换个思路搜asi_uuid或者user_info 为什么搜这个&#xff0c;因为都是请求头里面的参数&#xff0c;基本上会在一起 实际上就是Object(h.a)((new Date).getTime()) 直接在这里打断点…...

【Docker项目实战】使用Docker部署Jupyter Notebook服务

【Docker项目实战】使用Docker部署Jupyter Notebook服务 一、 Jupyter Notebook介绍1.1 Jupyter Notebook 简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compos…...

Oracle高级语法篇 - 用户与角色关系

在Oracle数据库中&#xff0c;用户和角色是权限管理的核心概念。用户是数据库的使用者&#xff0c;而角色则是权限的集合。通过合理地分配角色给用户&#xff0c;可以简化权限管理&#xff0c;提高数据库的安全性和易用性。本文将详细讲解Oracle中用户和角色之间的关系&#xf…...

“小坝” 策略:始发站 buffer 控制与优化

端到端&#xff0c;这两个端是两个应用程序中的位置&#xff0c;第一个端指数据被产生处&#xff0c;第二个端指数据被消费处。更一般的&#xff0c;把数据发生的应用程序所在的主机视为数据始发站也是合理的。 网络中遍布 buffer&#xff0c;buffer 却是一把双刃剑的存在&…...

【esp32 点亮led】-解决不能闪烁问题

问题现象&#xff1a;将esp例程中的led例程下载到开发板中&#xff0c;led不能闪烁&#xff0c;串口查看&#xff0c;可以看到对应的led ON/led off 信息。 解决办法&#xff1a; 使用idf.py menuconfig 命令配置相应的引脚为GPIO模式&#xff0c;如下图所示&#xff0c;保存…...

自然语言处理(9)—— 共现词矩阵及Python实现

共现词矩阵 1. 概述2. 构建步骤3. 代码实现&#xff08;Python&#xff09;结语 共现词矩阵&#xff08;Co-occurrence Matrix&#xff09;是自然语言处理&#xff08;NLP&#xff09;中用于捕捉词语间语义关系的重要工具。共现矩阵通过统计词语在特定上下文窗口内的共现频率&a…...

缓存 --- Redis的三种高可用模式

缓存 --- Redis的三种高可用模式 主从复制&#xff08;Replication&#xff09;哨兵模式&#xff08;Sentinel&#xff09;集群模式&#xff08;Cluster&#xff09;总结对比选择建议 Redis 的高可用架构模式主要有三种&#xff1a;主从复制&#xff08;Replication&#xff09…...

飞帆中控件数据和 Vue 双向绑定

在 Vue 中&#xff0c;数据的双向绑定是指在视图和数据模型之间自动保持同步。Vue 实现双向绑定的核心特性是其 响应式系统&#xff0c;它能够追踪数据的变化并自动更新视图&#xff0c;反之亦然&#xff0c;视图的变化也可以影响数据。 Vue 提供了几种方式来实现数据双向绑定&…...

【外研在线-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

实现AWS Data Pipeline安全地请求企业内部API返回数据

需要编写一段Data Pipeline在AWS云上运行&#xff0c;它需要访问企业内部的API获取JSON格式的数据&#xff0c;企业有网关和防火墙&#xff0c;API有公司的okta身份认证&#xff0c;通过公司的域账号来授权访问&#xff0c;现在需要创建一个专用的域账号&#xff0c;让Data Pip…...

AI书籍大模型微调-基于亮数据获取垂直数据集

大模型的开源&#xff0c;使得每位小伙伴都能获得AI的加持&#xff0c;包括你可以通过AIGC完成工作总结&#xff0c;图片生成等。这种加持是通用性的&#xff0c;并不会对个人的工作带来定制的影响&#xff0c;因此各个行业都出现了垂直领域大模型。 垂直大模型是如何训练出来…...

cloudstudio学习笔记之openwebui

代码获取 git clone 参考资料 openwebui官网 https://docs.openwebui.com/getting-started/advanced-topics/development 后端启动 cd backend pip install -r requirements.txt -U sh dev.sh后端启动成功后的界面 在cloudstudio提供的vscode弹出的提示中打开浏览器并在末…...

Linux安装mysql_exporter

mysqld_exporter 是一个用于监控 MySQL 数据库的 Prometheus exporter。可以从 MySQL 数据库的 metrics_schema 收集指标&#xff0c;相关指标主要包括: MySQL 服务器指标:例如 uptime、version 等数据库指标:例如 schema_name、table_rows 等表指标:例如 table_name、engine、…...

Kubernetes控制平面组件:API Server代码基础概念

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

修改PointLIO项目

添加key_frame_info.msg消息 新建.msg文件&#xff0c;内容填写为&#xff1a; # Cloud Info Header header # cloud messages sensor_msgs/PointCloud2 key_frame_cloud_ori sensor_msgs/PointCloud2 key_frame_cloud_transed sensor_msgs/PointCloud2 key_frame_poses其中k…...

将 JSON 字符串转化为对象的详细笔记 (Java示例)

1. 主流 JSON 库的选择 在 Java 中&#xff0c;常用以下库进行 JSON 和对象之间的转换&#xff1a; Jackson&#xff1a;Spring 默认集成&#xff0c;性能优异&#xff0c;支持流式解析。FastJSON&#xff1a;阿里开发&#xff0c;速度快&#xff0c;但需注意版本安全性。Gso…...

基于Docker+k8s集群的web应用部署与监控

项目架构图 server ip master 192.168.140.130 node1 192.168.140.131 node2 192.168.140.132 ansible 192.168.140.166 jumpserver 192.168.100.133 firewall 192.168.1.86 nfs 192.168.140.157 harbor 192.168.140.159 Promethethus 192.168.140.130 Jen…...

Java(自用查看版)

目录 1.java的基本运行 2、基本格式 注释 标识名 关键字 常量 整型常量 浮点数&#xff1a; 字符常量&#xff1a; 字符串常量 布尔 null值 变量 整型变量&#xff1a; 浮点变量: 字符变量: 布尔变量&#xff1a; 类型转换 自动类型转换 强制类型转换 运算符 …...

头歌java课程实验(函数式接口及lambda表达式)

第1关&#xff1a;利用lambda表达式对Book数组按多个字段进行排序 任务描述 本关任务&#xff1a;利用Comparator接口完成对Book数组同时按多个字段进行排序。 编程要求 1、本任务共有三个文件&#xff0c;可查看各文件的内容 2、无需修改SortBy.java枚举文件及Book.java类文…...

Jsp技术入门指南【九】详细讲解JSTL

Jsp技术入门指南【九】详细讲解JSTL 前言一、什么是JSTL&#xff1f;&#xff08;JavaServer Pages Standard Tag Library&#xff09;二、使用JSTL前的准备三、核心标签库常用标签详解1. <c:out>&#xff1a;输出内容&#xff08;替代<% %>&#xff09;2. <c:i…...

【C语言】用铁路系统来类比流,管道,进程,线程,内存,输入输出等

用**铁路网络**来比喻计算机中的这些概念会非常形象。下面是一个完整的类比体系,帮助你直观理解它们之间的关系: --- ### **1. 核心角色对照表** | **计算机概念** | **铁路网络比喻** | |--------…...

PCA——主成分分析数学原理及代码

主成分分析 PCA的目的是&#xff1a;对数据进行一个线性变换&#xff0c;在最大程度保留原始信息的前提下去除数据中彼此相关的信息。反映在变量上就是说&#xff0c;对所有的变量进行一个线性变换&#xff0c;使得变换后得到的变量彼此之间不相关&#xff0c;并且是所有可能的…...

[Windows] Adobe Camera Raw 17.2 win/Mac版本

[Windows] Adobe Camera Raw 链接&#xff1a;https://pan.xunlei.com/s/VOOIAXoyaZcKAkf_NdP-qw_6A1?pwdpd5k# Adobe Camera Raw&#xff0c;支持Photoshop&#xff0c;lightroom等Adobe系列软件&#xff0c;对相片无损格式进行编辑调色。 支持PS LR 2022 2023 2024 2025版…...

基于计算机视觉的行为检测:从原理到工业实践

一、行为检测的定义与核心价值 行为检测(Action Recognition)是计算机视觉领域的关键任务,旨在通过分析视频序列理解人类动作的时空特征。其核心价值体现在时序建模和多尺度分析能力上——系统需要捕捉动作的起始、发展和结束全过程,同时适应不同持续时间(0.1秒至数分钟)…...

基于 OpenCV 的图像与视频处理

基于 OpenCV 的图像处理 一、实验背景 OpenCV 是一个开源的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、目标检测等领域。通过学习 OpenCV&#xff0c;可以快速实现图像和视频的处理功能&#xff0c;为复杂的应用开发 奠定基础。本实验旨在通过实际代码示例&…...

B树的异常恢复

B-Tree & Crash Recovery B树作为平衡的n叉树 高度平衡树 许多实用的二叉树&#xff08;如AVL树或红黑树&#xff09;被称为高度平衡树&#xff0c;这意味着树的高度&#xff08;从根节点到叶子节点&#xff09;被限制为Ο(log &#x1d441;)&#xff0c;因此查找操作的…...

Centos9 离线安装 MYSQL8

centos 9 离线安装 mysql 8 参考教程 1. 官网下载mysql 下载地址 2. 将文件传输到Centos中解压 软件全部安装到了/opt中 在opt中新建mysql目录&#xff0c;解压到mysql目录中 tar -xvf mysql压缩文件 mysql[rootcentoshost mysql]# ls mysql-community-client-8.4.5-1.e…...

【RabbitMQ | 第2篇】RabbitMQ 控制台实现消息路由 + 数据隔离

文章目录 同步调用和异步调用MQRabbitMQ1. RabbitMQ控制台实现交换机路由到队列1.1 创建队列1.2 将消息发送给交换机&#xff0c;是否会到达队列 2. RabbitMQ控制台实现数据隔离2.1 添加一个用户2.2 创建新的虚拟主机 同步调用和异步调用 同步调用是指完成一个功能&#xff0c…...

算法—选择排序—js(场景:简单实现,不关心稳定性)

选择排序原理&#xff1a;&#xff08;简单但低效&#xff09; 每次从未排序部分选择最小元素&#xff0c;放到已排序部分的末尾。 特点&#xff1a; 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(1) 不稳定排序 // 选择排序 function selectionSort(arr) {for (let …...

龙舟中国行走进湖南娄底 2025湖南省龙舟联赛娄底站盛大举行

鼓声震天破碧波&#xff0c;百舸争流显豪情。2025年4月20日星期日&#xff0c;"龙舟中国行2025"首站——龙舟中国行走进湖南娄底2025湖南省龙舟联赛娄底双峰站在双峰县湄水河育才桥至风雨桥水域火热开赛。12支劲旅劈波斩浪&#xff0c;在青山绿水间上演传统与现代交织…...

重构之去除多余的if-else

一、提前返回&#xff08;Guard Clauses&#xff09; 适用场景&#xff1a;当 else 块仅用于处理异常或边界条件时。 优化前&#xff1a;if (isValid) {doSomething(); } else {return; }优化后&#xff1a;if (!isValid) return; // 提前处理异常&#xff0c;主流程保持简洁…...

【Vim】vim的简单使用

文章目录 1. vi的模式2. 按键使用说明2.1 一般命令模式光标移动替换和查找删除/复制/粘贴 2.2 编辑模式插入/替换 2.3 命令行模式保存/退出环境修改 3. vim的缓存4. vim可视区块5. vim多文件编辑6. vim多窗口功能7. vim关键词补全 1. vi的模式 一般命令模式&#xff1a;以vi打…...