2023年Android现代开发
2023年现代Android开发
下面与大家分享如何构建具有2023年最新趋势的Android应用程序。
 
Android是什么?
Android 是一种基于 Linux 内核并由 Google 开发的开源操作系统。它用于各种设备,包括智能手机、平板电脑、电视和智能手表。
目前,Android 是世界上移动设备使用最多的操作系统;根据statcounter的一份最近 12 个月的样本报告,Android 的市场份额为71.96%。
接下来,我将提及我认为对于在 Android 上构建现代应用程序很重要的工具、库、体系结构、指南和其他实用程序的列表。
Kotlin
Kotlin 是由JetBrains开发的一种编程语言。由谷歌推荐,谷歌于 2017 年 5 月正式宣布Kotlin作为Android开发语言。它是一种与 Java 兼容并可以运行在 JVM 上的现代编程语言,这使得它在 Android 应用程序开发中的采用速度非常快。
 
不管你是不是Android新手,你都应该把Kotlin作为你的首选,不要逆水行舟🏊🏻😎,Google在Google I/O 2019上宣布了这种做法。有了Kotlin,你将可以使用所有现代语言的特性,包括协程的强大功能和使用为 Android 生态系统开发的现代库。
Kotlin官网
 https://kotlinlang.org/docs/home.html
Jetpack Compose
Jetpack Compose 是 Android 推荐的用于构建原生 UI 的现代工具包。它简化并加速了 Android 上的 UI 开发。
 
Jetpack Compose 文档
 https://developer.android.com/jetpack/compose
Jetpack Compose 是 Android Jetpack 库的一部分,使用 Kotlin 编程语言轻松创建原生用户界面。此外,它还与其他 Android Jetpack 库(例如 LiveData 和 ViewModel)集成,以便更轻松地构建响应式和可维护的 Android 应用程序。
Jetpack Compose 的一些主要功能包括:
- 声明式用户界面。
 - 可定制的小部件。
 - 易于与现有代码集成。
 - 实时预览。
 - 改进的性能。
 
资源
-  
官方文档
https://developer.android.com/jetpack/compose -  
Jetpack Compose 路线图
https://developer.android.com/jetpack/androidx/compose-roadmap -  
课程
https://developer.android.com/courses/jetpack-compose/course -  
Compose 到 Kotlin 兼容性映射
https://developer.android.com/jetpack/androidx/releases/compose-kotlin 
Android Jetpack
Jetpack 是一套库,可帮助开发人员遵循最佳实践、减少样板代码并编写可跨 Android 版本和设备一致工作的代码,以便开发人员可以专注于他们关心的代码。
 
Android Jetpack 文档
 https://developer.android.com/jetpack
它的一些最常用的工具是:
-  
ViewModel
https://developer.android.com/topic/libraries/architecture/viewmodel -  
Room
https://developer.android.com/training/data-storage/room -  
DataStore
https://developer.android.com/topic/libraries/architecture/datastore -  
WorkManager
https://developer.android.com/topic/libraries/architecture/workmanager -  
Navigation
https://developer.android.com/guide/navigation -  
CameraX
https://developer.android.com/training/camerax -  
Compose
https://devjorgecastro.medium.com/modern-android-app-development-in-2023-ff445d3652b4#af4e 
Material Design

 Material Design 是一个适应性强的指南、组件和工具系统,支持用户界面设计的最佳实践。在开源代码的支持下,Material Design 简化了设计人员和开发人员之间的协作,并帮助团队快速构建精美的产品。
官网
 https://m3.material.io/
Material Design 得到了 Google 的设计师和开发人员的支持,这将使我们有一个指南来处理 Android、Flutter 和 Web 的 UI/UX。
目前,Material Design 的最新版本是 3。
Clean Arch

它基于通过将软件划分为层来实现职责分离。
特征
- 独立于框架。
 - 可测试。
 - 独立于用户界面。
 - 独立于数据库。
 - 独立于任何外部机构。
 - 依赖规则
 
作者在他的文章
The Clean Code Blog中很好地描述了依赖规则
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
使该体系结构起作用的最重要规则是依赖规则。这条规则说源代码依赖只能指向内部。内圈中的任何人都无法对外圈中的事物一无所知。特别是,在外圈中声明的名称不得在内圈中的代码中提及。这包括函数、类。变量,或任何其他命名的软件实体。
Clean Arch Blog
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
Android 中的Clean Arch
- 表示:活动、片段、视图模型、其他视图组件。
 - 域:用例、实体、存储库和其他域组件。
 - 数据:存储库实现、映射器、DTO 等。
 

Presentation Layer的架构模式
架构模式是一种更高级别的策略,旨在帮助设计软件架构,其特点是在可重用框架内为常见架构问题提供解决方案。架构模式类似于设计模式,但它们的规模更大,并且解决更多的全局问题,例如系统的整体结构、组件之间的关系以及数据的管理方式。
在表示层中,我们有一些架构模式,其中我想强调以下几点:
- MVVM
 - MVI
 
Android 架构指南
https://developer.android.com/topic/architecture
依赖注入
依赖注入是一种软件设计模式,它允许客户端从外部源获取其依赖项,而不是自己创建它们。它是一种用于在对象及其依赖项之间实现控制反转 (IoC) 的技术。
- Hilt ❤️
https://developer.android.com/training/dependency-injection/hilt-android - Dagger
https://dagger.dev/ - Koin
https://insert-koin.io/ 
模块化
模块化是一种软件设计技术,它允许您将应用程序划分为独立的模块,每个模块都有自己的功能和责任。
 
模块化的好处
可重用性:通过拥有独立的模块,它们可以在应用程序的不同部分甚至其他应用程序中重用。
严格的可见性控制:模块使您能够轻松控制向代码库的其他部分公开的内容。
可定制的交付:Play Feature Delivery使用应用程序包的高级功能,允许您有条件地或按需交付应用程序的某些功能。
可扩展性:通过拥有独立的模块,可以在不影响应用程序其他部分的情况下添加或删除功能。
易于维护:通过将应用程序划分为独立的模块,每个模块都有自己的功能和职责,代码更容易理解和维护。
易于测试:通过拥有独立的模块,它们可以被隔离测试,这使得检测和修复错误变得容易。
架构改进:模块化有助于改进应用程序的架构,从而更好地组织和构建代码。
改善协作:通过拥有独立的模块,开发人员可以同时处理应用程序的不同部分,而不会受到干扰。
构建时间:一些 Gradle 功能,例如增量构建、构建缓存或并行构建,可以利用模块化来提高构建性能。
更多信息参考官方文档
https://developer.android.com/topic/modularization
网络
- OkHttp
https://square.github.io/okhttp/ - Retrofit
https://square.github.io/retrofit/ 
序列化
在本节中,我想提一下我认为的两个重要工具:Moshi与 Retrofit 和Kotlin Serialization一起广泛使用,这是 Jetbrain 的 Kotlin 团队的赌注。
-  
Moshi
https://github.com/square/moshi -  
Kotlin Serialization
https://github.com/Kotlin/kotlinx.serialization 
Moshi和Kotlin Serialization是 Kotlin 和 Java 的两个序列化/反序列化库,允许您将对象转换为 JSON 或其他序列化格式,反之亦然。两者都提供了针对移动和桌面应用程序优化的用户友好界面。Moshi 主要关注 JSON 序列化,而 Kotlin 序列化支持各种序列化格式,包括 JSON。
图片加载
要从 Internet 加载图像,可以使用多个第三方库来帮助您处理该过程。图像加载库为您做了很多繁重的工作;它们处理缓存(因此您不会多次下载图像)和网络逻辑以下载图像并将其显示在屏幕上。
-  
Android官方文档
https://developer.android.com/jetpack/compose/graphics/images/loading -  
Coil
https://github.com/coil-kt/coil#jetpack-compose -  
Glide
https://bumptech.github.io/glide/int/compose.html 
react及线程管理

 当我们谈论反应式编程和异步过程时,我们的第一个选择是Kotlin Coroutines;多亏了Suspension Functions,Flow我们可以满足所有这些需求。但是,我相信在本节中值得强调RxJava甚至在 Android 应用程序开发中的重要性。对于我们这些已经使用 Android 多年的人来说,我们知道 RxJava 是一个非常强大的工具,具有大量用于处理数据流的功能。我仍然认为 RxJava 是今天值得考虑的一个有趣的替代方案。
- Kotlin Coroutines(suspend 及Flow API)
https://github.com/Kotlin/kotlinx.coroutines/blob/master/README.md#using-in-your-projects - RxJava
https://github.com/ReactiveX/RxJava 
本地存储
LocalStore
 构建移动应用程序的一个重点是能够在本地持久保存数据,例如一些会话数据或缓存数据等。根据您的应用需求选择正确的存储选项非常重要。我们可以存储键值对等非结构化数据或数据库等结构化数据。请记住,这一点并未提及我们可用的所有类型的本地存储(例如文件存储),仅提及允许我们保存数据的工具。
 
- DataStore
https://developer.android.com/topic/libraries/architecture/datastore - EncryptedSharedPreferences
https://developer.android.com/reference/androidx/security/crypto/EncryptedSharedPreferences 
测试
Testing
- JUnit 5
https://junit.org/junit5/ - Mockk
https://mockk.io/ANDROID.html - Espresso
https://developer.android.com/training/testing/espresso - Robolectric
https://robolectric.org/ 
R8 optimizations
R8 是默认编译器,可将项目的 Java 字节码转换为可在 Android 平台上运行的 DEX 格式。它是一种工具,通过缩短类及其属性的名称,消除项目中未使用的代码和资源,帮助我们混淆和减少应用程序的代码。要了解更多信息,请查看有关收缩、混淆和优化您的应用程序的Android 文档。
https://developer.android.com/studio/build/shrink-code

- Code shrinking
 - Resource shrinking
 - Obfuscation
 - Optimization
 
Play Feature Delivery
Google Play 的应用服务模型称为 Dynamic Delivery,它使用 Android App Bundle 为每个用户的设备配置生成和提供优化的 APK,因此用户仅下载运行您的应用所需的代码和资源。
Android文档
 https://developer.android.com/guide/playcore/feature-delivery

自适应布局
Adaptive layouts
 
 随着具有不同形状因素的移动设备使用的增长,我们需要有工具使我们能够使用适应不同类型屏幕的 Android 应用程序。这就是 Android 为我们提供Window Size Classes的原因,简单来说,它是三大屏幕格式组,它们标记了我们开发设计的关键点。有了这个,我们避免了考虑许多屏幕设计的复杂性,将我们的可能性减少到 3 组,即:Compat、Medium和Expanded 。
 Windows 尺寸等级
 
 
 支持不同的屏幕尺寸
 https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes
我们拥有的另一个重要资源是Canonical Layouts,它们是预定义的屏幕设计,可用于我们 Android 应用程序中的大多数场景,并向我们展示了如何使其适应大屏幕的指南。
Canonical Layouts
https://m3.material.io/foundations/adaptive-design/canonical-layouts

 其他一些资源
 3 things to know about Form Factors at Google I/O 2022
 https://android-developers.googleblog.com/2022/05/form-factors-google-io-22.html
Playlist: Form Factors at Google I/O
 https://www.youtube.com/playlist?list=PLWz5rJ2EKKc_seN7mrwgU7mDYKA0hq_ib
Form-Factor Training
 https://developer.android.com/courses/pathways/jetpack-compose-for-android-developers-5
Form Factors at Google I/O 2022 (2)
 https://www.youtube.com/playlist?list=PLWz5rJ2EKKc_seN7mrwgU7mDYKA0hq_ib
性能表现

 当我们为 Android 开发应用程序时,我们必须确保更好的用户体验,不仅在应用程序开始时,而且在整个执行过程中。出于这个原因,拥有使我们能够对可能影响应用程序性能的情况进行预防性分析和持续监控的工具非常重要,因此这里列出了可以帮助您实现此目的的工具:
- Benchmark
https://developer.android.com/topic/performance/benchmarking/benchmarking-overview - Baseline Profiles
https://developer.android.com/topic/performance/baselineprofiles/overview - App Startup
https://developer.android.com/topic/libraries/app-startup - Firebase Performance Monitoring
https://firebase.google.com/docs/perf-mon - JankStats library
https://developer.android.com/topic/performance/jankstats 
应用内更新
当您的用户让您的应用程序在他们的设备上保持最新时,他们可以尝试新功能,并从性能改进和错误修复中受益。尽管某些用户在其设备连接到不按流量计费的连接时启用后台更新,但可能需要提醒其他用户安装更新。应用内更新是一项 Google Play 核心库功能,可提示活跃用户更新您的应用。
运行 Android 5.0(API 级别 21)或更高版本的设备支持应用内更新功能。此外,仅 Android 移动设备、Android 平板电脑和 Chrome 操作系统设备支持应用内更新。
_应用内更新文档
 https://developer.android.com/guide/playcore/in-app-updates
 
应用内评论
Google Play 应用内评论 API 可让您提示用户提交 Play 商店评分和评论,而无需离开您的应用或游戏。
通常,应用内评论流程可以在应用的整个用户旅程中随时触发。在此流程中,用户可以使用 1 到 5 星系统对您的应用进行评分并添加可选评论。提交后,评论将发送到 Play 商店并最终显示。
为保护用户隐私并避免 API 滥用,您的应用应遵循有关何时请求应用内评论和评论提示设计的严格指南。
应用内评论文档
https://developer.android.com/guide/playcore/in-app-review

辅助功能

 辅助功能是软件设计和构造中的一个重要功能,除了改善用户体验外,它还为需要辅助功能的人提供使用应用程序的能力。该概念旨在改善的一些残障人士包括:有视力问题、色盲、听力问题、灵活性问题和认知障碍等的人。
注意事项:
- 增加文本可见性(颜色对比度、可调整大小的文本)
 - 使用大而简单的控件
 - 描述每个 UI 元素
 
辅助功能官方文档
 https://developer.android.com/guide/topics/ui/accessibility
安全

 安全性即使不是最重要的方面,也是我们在开发保护设备完整性、数据安全性和用户信任的应用程序时必须考虑的因素,这就是为什么我在下面列出一系列帮助您实现此目的的提示。
- 加密敏感数据和文件:使用
EncryptedSharedPreferences和EncryptedFile。 - 应用基于签名的权限:
 - 在您可以控制的应用程序之间共享数据时,使用基于签名的权限。
 
< manifest  xmlns:android = "http://schemas.android.com/apk/res/android" package = "com.example.myapp" > < permission  android:name = "my_custom_permission_name" android:protectionLevel = "signature" / >
 
- 不要将应用程序配置所需的密钥、令牌或敏感数据直接放在项目存储库中的文件或类中。请改用
local.properties。 
Version Catalogs
Gradle 提供了一种集中管理项目依赖项的标准方式,称为版本目录;7.0版本试验引入,7.4版本正式发布。
优势:
- 对于每个目录,Gradle 都会生成类型安全的访问器,以便您可以在 IDE 中轻松添加具有自动完成功能的依赖项。
 - 每个目录对构建的所有项目都是可见的。它是声明依赖项版本并确保对该版本的更改适用于每个子项目的中心位置。
 - 目录可以声明依赖包,它们是通常一起使用的“依赖组”。
 - 目录可以将依赖项的组和名称与其实际版本分开,并使用版本引用代替,从而可以在多个依赖项之间共享版本声明。
 
Catalogs更多信息
 https://docs.gradle.org/current/userguide/platforms.html
Logger
logger是一种软件工具,用于记录有关程序执行的信息;重要事件、错误、调试消息和其他可能有助于诊断问题或了解程序工作方式的信息。记录器可以配置为将消息写入不同的位置,例如日志文件、控制台、数据库,或者通过将消息发送到日志服务器。
Timber
 https://github.com/JakeWharton/timber
Linter

 Linter 是一种编程工具,用于分析程序源代码以发现代码中潜在的问题或错误。这些问题可能是句法、不合适的代码风格、缺乏文档、安全问题等等,它们会对代码的质量和可维护性产生影响。
- Android Lint
https://medium.com/swlh/what-is-android-lint-17fa0d87abb2 - Detekt
https://detekt.dev/ - Ktlint
https://pinterest.github.io/ktlint/ 
相关文章:
2023年Android现代开发
2023年现代Android开发 下面与大家分享如何构建具有2023年最新趋势的Android应用程序。 Android是什么? Android 是一种基于 Linux 内核并由 Google 开发的开源操作系统。它用于各种设备,包括智能手机、平板电脑、电视和智能手表。 目前,…...
自然语言处理(NLP)在医疗领域的应用
自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。在各个领域都有其应用。 其在生物医学领域迅速发展,已经…...
计算机中的浮点数运算
计算机中的浮点数 计算机中以固定长度存储浮点数的方式,造成了浮点数运算过程容易产生上溢和下溢。以float32为例, 其标记位占1bit,指数位占8bit,小数部分占23bit 经典下溢场景 不满足精度导致截断误差 #include <iostream> #include <iomanip> usin…...
看了字节跳动月薪20K+测试岗面试题,让我这个工作3年的测试工程师,冷汗直流....
朋友入职已经两周了,整体工作环境还是非常满意的!所以这次特意抽空给我写出了这份面试题,而我把它分享给伙伴们,面试&入职的经验! 大概是在2月中的时候他告诉我投递了字节跳动并且简历已通过,2月23经过…...
这两天最好的ChatGPT应用;使用Notion AI提升效率的经验(13);AI编程与程序员的生存 | ShowMeAI日报
👀日报合辑 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 硅谷银行风波中,OpenAI 创始人大方帮助硅谷初创公司:钱先拿着用,有了再还 OpenAI 创始人 Sam Altman 的弟弟…...
Linux 内核likely与unlikey
内核源码的时候经常可以看到likely()和unlikely()函数,这两个函数的作用是什么?-- 先得学一学GCC提供的内建函数!! likely和unlikely内核中的定义 # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __built…...
成功解决主从同步异常之Slave_IO_Running显示为No的问题
前言 MySQL主从同步在做的过程中很容易出问题, 尤其是双主配置,参数多,需要在两台服务器中反复操作,容易搞错导致失败,这里汇总的是主从同步异常之Slave_IO_Running显示为No的解决方案。 文章目录 前言一. 问题重现二. 排查过程2.1 查看UUID是否相同,并修改2.2 修改完UU…...
面试阿里测开岗失败后,被面试官在朋友圈吐槽了......
前一阵子有个徒弟向我诉苦,说自己在参加某大厂测试面试的时候被面试官怼得哑口无言,场面让他一度十分尴尬印象最深的就是下面几个问题:根据你以前的工作经验和学习到的测试技术,说说你对质量保证的理解?非关系型数据库…...
蓝桥杯嵌入式--字符串比较在串口通信中的应用
前言今天做了个模拟题,大致意思是接收上位机发的字符串,然后执行相应操作。思路很明确,就是把接收到的内容进行比较,但是从前我只学过比较数字的方式,即直接用“”进行比较,但是字符串不能使用这个方法&…...
考研408每周一题(2019 41)
2019年(单链表) 41.(13分)设线性表L(a1,a2,a3,...,a(n-2),a(n-1),an)采用带头结点的单链表保存,链表中的结点定义如下: typedef struct node {int data;struct node *next; } NODE; 请设计一个空间复杂度为O(1)且时间上尽可能高效的算法&…...
Angular学习笔记(一)
以下内容基于Angular 文档中文版的学习 目录 使用Angular CLI 工具创建项目 HTML标签中{{}}插入值,[]绑定属性,()绑定事件,[(ngModel)]双向绑定 绑定属性 类和样式绑定 事件绑定 双向绑定 循环 IF 定义输入属性 定义输出事件 特殊符号 模板引用变量 页面跳转(路由…...
Linux用户和权限 —— 操作演示
Linux用户和权限——操作演示认知root用户用户、用户组管理查看权限控制修改权限控制- chmod修改权限控制- chownLinux系列: Linux基本命令 —— 操作演示 认知root用户 root用户(超级管理员) 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。…...
【华为OD机试真题2023 JAVA】单核CPU任务调度
华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 单核CPU任务调度 知识点队列优先级队列 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 现在有一个CPU和一些任务需要处理,已提前获知每个任务的任务ID、优先级、所需执行时间和到达时间。 CPU同时只…...
News乐鑫科技亮相德国嵌入式展 Embedded World 2023!
3 月 14 日,德国纽伦堡嵌入式展 Embedded World 2023 火热启幕。本届 Embedded World 主题为 “embedded. responsible. sustainable”,乐鑫科技 (688018.SH) 携众多 AIoT 科技成果亮相展会,致力于打造更智能、更互联、更绿色的物联网未来。…...
java如何创建线程
java如何创建线程1. java如何创建线程1.1 通过继承Thread类来创建线程1.2 通过实现Runnable接口来创建线程1.3 通过匿名内部类来创建线程1.4 lambda表达式1.5 通过实现Runnable接口的方式创建线程目标类的优缺点1. java如何创建线程 一个线程在Java中使用一个Thread实例来描述…...
要是早看到这篇文章,你起码少走3年弯路,20年老程序员的忠告
文章目录前言一、程序员的薪资是怎么样的?二、我现在的情况适合做程序员吗?三、大学期间到底应该学些什么?四、工作还是考研?五、总结前言 我是龙叔,一名工作了20多年的退休老程序员。 如果你在工作之前看到这篇文章…...
IP地址的分类
1. 前言 最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。 同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工…...
win10下使用docker运行部署nginx,mysql
一、docker的步骤:1.进入docker官网下载安装包2.打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图:3.重新启动电脑4.启动Docker在桌面找到Docker for Windows快捷方式࿰…...
sprinboot车辆充电桩
sprinboot车辆充电桩演示录像2022开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:ecli…...
仿京东放大镜效果的实现
仿京东放大镜 (1) 整个案例可以分为三个功能模块 (2) 鼠标经过小图片盒子, 黄色的遮挡层 和 大图片盒子显示,离开隐藏2个盒子功能 (3)黄色的遮挡层跟随鼠标功能。 (4&…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...
Yolo11改进策略:Block改进|FCM,特征互补映射模块|AAAI 2025|即插即用
1 论文信息 FBRT-YOLO(Faster and Better for Real-Time Aerial Image Detection)是由北京理工大学团队提出的专用于航拍图像实时目标检测的创新框架,发表于AAAI 2025。论文针对航拍场景中小目标检测的核心难题展开研究,重点解决…...

