当前位置: 首页 > 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…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...