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

升级Room引发的惨案!!

kotlin升级

在升级kotlin的时候,直接升级到大版本的kotlin(比如1.7以上),直接报错,只是报错不知道原因。
koltin Release details
后来把koltin版本改成1.6.0,报如下的错,我们才知道gradle是需要先升级的

所以 升级kotlin版本有问题,可以换一个别的kotlin版本试试
在这里插入图片描述
gradle升级也是一堆坑,我一开始想升级到比较新的版本7.3.3
Android Gradle 插件版本说明

可以在 Android Studio 的 File > Project Structure > Project 菜单中指定插件版本
在这里插入图片描述
但是,升级到最新版本报各种错,而且语法也变了。

7.3.3是gradle的版本,是gradle-wrapper中配置的,7.2.1是gradle的插件版本,这两个得匹配才行,在上面的文章中有对应说明。
gradle插件是配置在这儿的在这里插入图片描述
后来妥协了,只要6.1.1以上就行
gradle是6.3,gradle插件是4.0.1

kotlin 1.6.0 会在kaptGenerateStubDebugKolin卡住

不知道为什么,把kotlin版本换成了1.6.10正常了

gradle 升级过程中有个报错

gradle是6.3,gradle插件是4.0.1

没有这个问题

Caused by: java.lang.RuntimeException: Direct local .aar file dependencies are not supported when building an AAR. The resulting AAR would be broken because the classes and Android resources from any local .aar file dependencies would not be packaged in the resulting AAR. Previous versions of the Android Gradle Plugin produce broken AARs in this case too (despite not throwing this error). The following direct local .aar file dependencies of the :modules:module_push project caused this error: /Users/zhongyili/work/AndroidStudioProjects/sohuvideo_gradle/modules/module_push/libs/vivo_pushSDK_v3.0.0.4_484.aar, /Users/zhongyili/work/AndroidStudioProjects/sohuvideo_gradle/modules/module_push/libs/com.heytap.msp.aarat com.android.build.gradle.tasks.BundleAar.getHasLocalAarDeps(BundleAar.kt:61)at jdk.internal.reflect.GeneratedMethodAccessor603.invoke(Unknown Source)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue$1$1.create(AbstractNestedRuntimeBeanNode.java:79)at org.gradle.internal.deprecation.DeprecationLogger.whileDisabled(DeprecationLogger.java:225)at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue$1.get(AbstractNestedRuntimeBeanNode.java:75)at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue.call(AbstractNestedRuntimeBeanNode.java:145)at org.gradle.api.internal.tasks.properties.AbstractValidatingProperty.validate(AbstractValidatingProperty.java:39)at org.gradle.api.internal.tasks.properties.DefaultTaskProperties.validate(DefaultTaskProperties.java:193)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.validate(ExecuteActionsTaskExecuter.java:505)at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:50)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:192)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:184)at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)... 116 more

这个意思是,library被打成aar包,里面放的aar包不会被打进最终的aar包里面,这个应该是gradle版本不同导致的,之前没升级gradle之前没事。
修改办法,在library中如下修改

-    implementation files('libs/vivo_pushSDK_v3.0.0.4_484.aar')
-    implementation files('libs/com.heytap.msp.aar')
+
+    compileOnly(name: 'vivo_pushSDK_v3.0.0.4_484', ext: 'aar')
+    compileOnly(name: 'com.heytap.msp', ext: 'aar')

把编译方式从implementation变成compileOnly

在工程的build.gradle文件中加入如下代码:

allprojects {repositories {flatDir { dirs '../frameworks/baseAarInfoLib/libs', '../baseAarInfoLib/libs', '../modules/module_push/libs' }}
}

其实就是把library中的libs文件夹作为aar包的加载源。

在application module的build.gradle文件中加入如下代码:

    api(name: 'vivo_pushSDK_v3.0.0.4_484', ext: 'aar')api(name: 'com.heytap.msp', ext: 'aar')

room升级到2.5.0

升级koltin原因就是升级了room,导致了gradle也升级

通过Android studio build 结果编译的时候一直报错,也看不出什么错
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution

得通过下面的命令编译,能看到错误信息

./gradlew assembleDebug --stacktrace
Caused by: java.lang.IllegalArgumentException: Modifiers [PRIVATE] are not allowed on Kotlin parameters. Allowed modifiers: [VARARG, NOINLINE, CROSSINLINE]at com.squareup.kotlinpoet.ParameterSpec.<init>(ParameterSpec.kt:41)at com.squareup.kotlinpoet.ParameterSpec.<init>(ParameterSpec.kt:29)at com.squareup.kotlinpoet.ParameterSpec$Builder.build(ParameterSpec.kt:157)at com.squareup.kotlinpoet.FunSpec$Builder.addParameter(FunSpec.kt:500)at permissions.dispatcher.processor.impl.kotlin.KotlinBaseProcessorUnit.createPermissionRequestClass(KotlinBaseProcessorUnit.kt:452)at permissions.dispatcher.processor.impl.kotlin.KotlinBaseProcessorUnit.createPermissionRequestClasses(KotlinBaseProcessorUnit.kt:415)at permissions.dispatcher.processor.impl.kotlin.KotlinBaseProcessorUnit.createFile(KotlinBaseProcessorUnit.kt:43)at permissions.dispatcher.processor.impl.kotlin.KotlinBaseProcessorUnit.createFile(KotlinBaseProcessorUnit.kt:17)at permissions.dispatcher.processor.PermissionsProcessor.processKotlin(PermissionsProcessor.kt:68)at permissions.dispatcher.processor.PermissionsProcessor.process(PermissionsProcessor.kt:58)at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt:90)at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:188)at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980)... 38 more

通过如下命令能知道依赖关系

 ./gradlew :sohuVideoMobile:dependencies > /Users/zhongyili/Downloads/depen6
kapt
+--- androidx.room:room-compiler:2.5.0
|    +--- androidx.room:room-common:2.5.0
|    |    +--- androidx.annotation:annotation:1.3.0
|    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
|    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
|    |         |    +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
|    |         |    \--- org.jetbrains:annotations:13.0
|    |         \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
|    |              \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    +--- androidx.room:room-compiler-processing:2.5.0
|    |    +--- com.google.auto:auto-common:0.11
|    |    |    \--- com.google.guava:guava:29.0-jre -> 31.1-jre
|    |    |         +--- com.google.guava:failureaccess:1.0.1
|    |    |         +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
|    |    |         +--- com.google.code.findbugs:jsr305:3.0.2
|    |    |         +--- org.checkerframework:checker-qual:3.12.0
|    |    |         +--- com.google.errorprone:error_prone_annotations:2.11.0
|    |    |         \--- com.google.j2objc:j2objc-annotations:1.3
|    |    +--- com.google.auto.value:auto-value-annotations:1.6.3
|    |    +--- com.google.devtools.ksp:symbol-processing-api:1.7.20-1.0.6
|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    |    +--- com.google.guava:guava:31.1-jre (*)
|    |    +--- com.intellij:annotations:12.0
|    |    +--- com.squareup:javapoet:1.13.0
|    |    +--- com.squareup:kotlinpoet:1.12.0
|    |    |    +--- org.jetbrains.kotlin:kotlin-reflect:1.7.0
|    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.7.20 (*)
|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0 -> 1.7.20 (*)
|    |    +--- com.squareup:kotlinpoet-javapoet:1.12.0
|    |    |    +--- com.squareup:kotlinpoet:1.12.0 (*)
|    |    |    +--- com.squareup:javapoet:1.13.0
|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0 -> 1.7.20 (*)
|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 (*)
|    |    \--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0
|    |         \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.7.20 (*)
|    +--- androidx.room:room-migration:2.5.0
|    |    +--- androidx.room:room-common:2.5.0 (*)
|    |    +--- com.google.code.gson:gson:2.9.0
|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    +--- com.google.auto:auto-common:0.11 (*)
|    +--- com.google.auto.value:auto-value-annotations:1.6.3
|    +--- com.google.devtools.ksp:symbol-processing-api:1.7.20-1.0.6 (*)
|    +--- com.intellij:annotations:12.0
|    +--- com.squareup:javapoet:1.13.0
|    +--- com.squareup:kotlinpoet:1.12.0 (*)
|    +--- com.squareup:kotlinpoet-javapoet:1.12.0 (*)
|    +--- commons-codec:commons-codec:1.15
|    +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    +--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0 (*)
|    \--- org.xerial:sqlite-jdbc:3.36.0
+--- com.alibaba:arouter-compiler:1.5.1
|    +--- com.alibaba:arouter-annotation:1.0.6
|    +--- com.squareup:javapoet:1.8.0 -> 1.13.0
|    +--- org.apache.commons:commons-lang3:3.5
|    +--- org.apache.commons:commons-collections4:4.1
|    \--- com.alibaba:fastjson:1.2.48
\--- com.github.permissions-dispatcher:permissionsdispatcher-processor:4.9.2+--- androidx.annotation:annotation:1.0.0 -> 1.3.0+--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0 -> 0.5.0 (*)+--- com.squareup:javapoet:1.9.0 -> 1.13.0+--- com.squareup:kotlinpoet:1.3.0 -> 1.12.0 (*)+--- com.github.permissions-dispatcher:permissionsdispatcher-annotation:4.9.2\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.20 -> 1.7.20 (*)

这个不好搞,我把permissionsdispatcher升级到最新版本还是报这个错。我研究了一下com.squareup:kotlinpoet:1.12.0 是androidx.room:room-compiler:2.5.0引用的,这样会把permissionsdispatcher引用的kotlinpoet版本也会从1.3.0变成1.12.0

,然后就报上面的错了。即便,我强制让kotlinpoet是1.3.0版本,room2.5.0又报错了,它得用kotlinpoet1.12.0版本。这两个库使用kotlinpoet的版本有冲突

permissionsdispatcher升级折腾了几小时,包名进行了改变

妈蛋,解决不了了

可能是room版本太新,降低到2.4.3

把room版本降低到2.4.3,library aar包的问题和permissionsdispatcher的问题都没有了。

最终的配置是:
gradle是6.3,gradle插件是4.0.1,kotlin 1.6.10,room 2.4.3

太难了,折腾了我三四天

相关文章:

升级Room引发的惨案!!

kotlin升级 在升级kotlin的时候&#xff0c;直接升级到大版本的kotlin&#xff08;比如1.7以上&#xff09;&#xff0c;直接报错&#xff0c;只是报错不知道原因。 koltin Release details 后来把koltin版本改成1.6.0&#xff0c;报如下的错&#xff0c;我们才知道gradle是需…...

RPC框架:一文带你搞懂RPC

RPC是什么&#xff08;GPT答&#xff09; ChatGPT回答&#xff1a; RPC(Remote Procedure Call)是一种分布式应用程序的编程模型&#xff0c;允许程序在不同的计算机上运行。它以一种透明的方式&#xff0c;将一个程序的函数调用定向到远程系统上的另一个程序&#xff0c;而使…...

电子招标采购系统源码—企业战略布局下的采购寻源

​ 智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0…...

P16 激活函数与Loss 的梯度

参考&#xff1a;https://www.ngui.cc/el/507608.html?actiononClick这里面简单回顾一下PyTorch 里面的两个常用的梯度自动计算的APIautoGrad 和 Backward, 最后结合 softmax 简单介绍一下一下应用场景。目录&#xff1a;1 autoGrad2 Backward3 softmax一 autoGrad输入 x输出损…...

ThinkPHP5美食商城系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP5美食商城系统一 介绍 此美食商城系统基于ThinkPHP5框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。用户注册登录后可购买美食&#xff0c;个人中心&#xff0c;评论和反馈等&#xff…...

Vue3 - $refs 使用教程,父组件调用获取子组件数据和方法(setup() / <script setup>)

前言 在 Vue2 中父组件使用 $refs 调用子组件数据和方法非常简单,但在 Vue3 中这种方法行不通了。 本文实现了 Vue3 中父组件使用 $refs 获取调用子组件数据和方法教程, 并且提供了 setup() 与 <script setup> 两种 “开发模式” 的示例代码,请根据需要进行选择。 网…...

华为OD机试 - 众数和中位数(Python)| 真题+思路+考点+代码+岗位

众数和中位数 题目 众数是指一组数据中出现次数多的数 众数可以是多个中位数是指把一组数据从小到大排列,最中间的那个数, 如果这组数据的个数是奇数,那最中间那个就是中位数 如果这组数据的个数为偶数,那就把中间的两个数之和除以 2 就是中位数查找整型数组中元素的众数并…...

一眼万年的 Keychron 无线机械键盘

一眼万年的 Keychron 无线机械键盘 一款好的键盘对于程序员或者喜欢码字的人来说是非常重要的&#xff0c;而最近博主入手了自己的第一款机械键盘——Keychron 无线机械键盘。 机械键盘特点 有独立轴体&#xff0c;通过两个簧接触&#xff0c;来触发信号&#xff0c;价格相对贵…...

自动化测试高频面试题(含答案)

Hello&#xff0c;你们的好朋友来了&#xff01;今天猜猜我给大家带来点啥干货呢&#xff1f;最近很多小伙伴出去面试的时候经常会被问到跟自动化测试相关的面试题。所以&#xff0c;今天特意给大家整理了一些经常被公司问到的自动化测试相关的面试题。停&#xff0c;咱先收藏起…...

3、按键扫描检测处理

说明&#xff1a;本文处理按键的短按、长按检测执行&#xff0c;非矩阵按键 硬件可以类似如下连接即可&#xff0c;无需放置上下拉电阻&#xff1b; 按键动作分长按、短按(弹起时执行)两种 按下不放执行长按&#xff0c;但松开按键时不予执行短按函数 多个按键可以同时操作 按…...

集中式存储和分布式存储

分布式存储是相对于集中式存储来说的&#xff0c;在介绍分布式存储之前&#xff0c;我们先看看什么是集中式存储。不久之前&#xff0c;企业级的存储设备都是集中式存储。所谓集中式存储&#xff0c;从概念上可以看出来是具有集中性的&#xff0c;也就是整个存储是集中在一个系…...

【机器学习数据集】如何获得机器学习的练习数据?

一、scikit-learn自带数据集Scikit-learn内置了很多可以用于机器学习的数据&#xff0c;可以用两行代码就可以使用这些数据。自带的小的数据集为&#xff1a;sklearn.datasets.load_<name>load_bostonBoston房屋价格回归506*13fetch_california_housing加州住房回归20640…...

【编程实践】使用 Kotlin HTTP 框架 Fuel 实现 GET,POST 接口 kittinunf.fuel【极简教程】

目录 Fuel 简介 实现代码 GET网络请求用法(有三种写法࿰...

大数据DataX(一):DataX的框架设计和插件体系

文章目录 DataX的框架设计和插件体系 一、DataX是什么...

软考高级信息系统项目管理师系列之十一:项目进度管理

软考高级信息系统项目管理师系列之十一:项目进度管理 一、进度管理领域输入、输出、工具和技术表二、项目进度管理1.项目进度管理过程2.项目进度管理三、项目进度管理过程1.项目进度管理2.工作包和活动3.活动清单4.活动属性5.项目进度网络图6.资源日历7.活动资源需求8.资源分解…...

vue2版本《后台管理模式》(下)

文章目录前言一、home 页以下都属于home子组件二、header 头部 组件二、Menu 页面三、Bread 面包屑四、Footer五 、分页器&#xff1a; Pageing![在这里插入图片描述](https://img-blog.csdnimg.cn/fbe9bb7e84a04ccda4d3fc9f4ab9c36b.png#pic_center)六、权限管理总结前言 这章…...

软考中级-程序设计语言

&#xff08;1&#xff09;解释器解释源程序时不生成独立的目标代码&#xff0c;源程序和解释程序都参与到程序执行中。&#xff08;2&#xff09;编译器编译时生成独立的目标代码&#xff0c;运行时是运行与源程序等价的目标程序&#xff0c;源程序不参与执行。阶段补充&#…...

Sphinx : 高性能SQL全文检索引擎

Sphinx是一款基于SQL的高性能全文检索引擎&#xff0c;Sphinx的性能在众多全文检索引擎中也是数一数二的&#xff0c;利用Sphinx&#xff0c;我们可以完成比数据库本身更专业的搜索功能&#xff0c;而且可以有很多针对性的性能优化。 Sphinx的特点 快速创建索引&#xff1a;3分…...

ansible实战应用系列教程6:管理ansible变量

ansbile实战应用系列教程6:管理ansible变量 Ansible VariablesNaming VariablesDefining Variables在playbook中定义变量Defining Variables in Playbooks在playbooks中使用VariablesHost Variables and Group Variables使用group_vars和host_vars目录命令行定义全局变量Varia…...

java8新特性Stream流中anyMatch和allMatch和noneMatch的区别详解

1、anyMatch 判断数据列表中是否存在任意一个元素符合设置的predicate条件&#xff0c;如果是就返回true&#xff0c;否则返回false。 接口定义&#xff1a; boolean anyMatch(Predicate<? super T> predicate); 方法描述&#xff1a; 在anyMatch 接口定义中是接收 Pr…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...