[间章] 关于重写platform判断平台的一些尝试

发布时间:2026/11/3 8:19:12

[间章] 关于重写platform判断平台的一些尝试 在开发shine_image思考的时候我在空闲时间写下这两段代码。主要是借用rust来对宿主平台进行判断。由于flutter本身的platform判断不了鸿蒙与各家厂商的系统ui而我是能不写双端代码就不写的原则所以简单的尝试了下倒是没想到成功的如此简单。首先我们先在rust侧编写一个enum。pub enum Platform { Unknown, Android, Ios, Windows, Unix, MacIntel, MacApple, Wasm, HarmonyOSVersion2, HarmonyOSVersion3, }就是各个系统我判断了HarmonyOS系统其实如果你想判断miuiemuiflyme烂橘子之类的都是可以的后面会说明。由于不做处理HarmonyOS会被默认识别为Android但它又是个很特别的系统所以重视一些。然后我们通过rust的cfg!()宏进行判断宿主环境。由于cfg支持的平台只有图中这些所以直接判断HarmonyOS的想法是不现实的。而通过std::env::args获取的系统标识经过实测emui与HarmonyOS是一致的。也就没法用它来判断。于是我想到安卓的getprop命令在rust侧能否拿到它实际查询了一下发现用std::process::Command确实是可以拿到prop信息的这里我编写了一个check_description()方法并将它输出到flutter侧。拿我的魅族17pro测试在页面输出如图看到了很多熟悉的prop了吧这里的ro.build.flyme.version就可以用来判断是否是flyme平台类似于emuimiui也可以通过ro.build.version.emui与ro.miui.ui.version.name之类的进行判断总之这些第三方厂商ui都会往里面塞一些自己家的信息。而HarmonyOS中会有哪些信息值得我们重视的呢打印HarmonyOS的prop我们会发现这两项以hw_sc开头的prop。前者开发过ets或者ark-ui的大概就很熟悉它是鸿蒙的api版本根据我个人的ets开发经历在api4以上就是HarmonyOS了而api8以上则是最新的HarmonyOS 3.0。那么剩下的就很简单了编写一个platform()方法该方法返回一个Platform的enum。pub fn platform() - Platform { if cfg!(windows) { Platform::Windows } else if cfg!(target_os android) { let output Command::new(getprop) .arg(hw_sc.build.os.apiversion) .output() .expect(获取prop失败); let android_text String::from_utf8(output.stdout).expect(u8字符转换为string出现错误); let use_text android_text.trim(); if use_text.is_empty() { return Platform::Android; } let android_number use_text.parse::i32().expect(字符串转换为整形出现错误); if android_number 4 android_number 8{ return Platform::HarmonyOSVersion2; }else if android_number 8 { return Platform::HarmonyOSVersion3; } else { return Platform::Android; } } else if cfg!(target_os ios) { Platform::Ios } else if cfg!(all(target_os macos, target_arch aarch64)) { Platform::MacApple } else if cfg!(target_os macos) { Platform::MacIntel } else if cfg!(target_family wasm) { Platform::Wasm } else if cfg!(unix) { Platform::Unix } else { Platform::Unknown } }这样我们就成功的实现了编写一个我们自己的platform事不宜迟我们赶紧测试一下吧这里我找了两个拥有HarmonyOS设备的朋友。一个是HarmonyOS 3.0一个是HarmonyOS 2.0。我们编写个简单的text()输出的页面打印的结果如下:而使用HarmonyOS 2.0的设备朋友忘了截图设备信息了直接上输出页面的图:最后试试我的flyme会不会误识别:看来没问题。那么这个自建的platform有什么用呢如果你需要针对HarmonyOS或者某些特定的厂商ui平台调用其特有的api或是处理特定平台的bug那么它可能就会帮很大的忙。关于platform的探索就到这了明天还得继续忙活我的shine_image的逻辑呢不过如果大家喜欢这样的间章的话之后我也会时不时出一点间章的文章毕竟我还是蛮喜欢折腾奇奇怪怪的东西。我建立了一个flutter的初始项目体验小工程把我文章写的一些东西展示在这边并且用户可以看到它运作正常我打算将它打包在apk在下篇文章的时候提供给有想要试玩的小伙伴玩一玩。作者琼八万链接https://juejin.cn/post/7182638122901962811最后如果想要成为架构师或想突破20~30K薪资范畴那就不要局限在编码业务要会选型、扩展提升编程思维。此外良好的职业规划也很重要学习的习惯很重要但是最重要的还是要能持之以恒任何不能坚持落实的计划都是空谈。如果你没有方向这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》帮大家将杂乱、零散、碎片化的知识进行体系化的整理让大家系统而高效地掌握Android开发的各个知识点。相对于我们平时看的碎片化内容这份笔记的知识点更系统化更容易理解和记忆是严格按照知识体系编排的。全套视频资料一、面试合集二、源码解析合集三、开源框架合集欢迎大家一键三连支持若需要文中资料直接点击文末CSDN官方认证微信卡片免费领取↓↓↓
延伸阅读

更多相关文章

2026/11/1 6:30:44

Android:解决 MVI 架构实战痛点

说在前头: 纪晓岚问和珅,为何他们往灾民粥里掺沙子,和珅道:“你是有所不知啊,如不掺沙子,灾民怕是一口粥也喝不上啊”。 同理,架构的存在是为 “在实际开发过程中消除不可预期问题”&#xff0c…

2026/11/3 0:18:46

Jetpack Compose : 一学就会的自定义下拉刷新加载更多

前言 一个成熟Androider的标志是自定义下拉刷新&加载更多😁 自定义下拉刷新你会怎么做? 因为我这个人比较懒(其实就是菜),所以直接拿Compose自带的下拉刷新来修改。 这里先上效果图,第一张是Compose…

2026/10/23 19:09:54

腾讯、阿里团队共同出品,Android音视频开发进阶指南

随着5G时代的到来,短视频逐步占据了人们的日常生活。现在,也有越来越多的公司高薪招聘音视频开发的人才,一个稍有经验的音视频人才现在可能会有3-4家公司抢着要。因此,对音视频人才的需求也从小众变成了大众,这更多的是…

2026/11/3 8:15:20

Redis 8 内置 AI:向量检索、语义缓存与 Agent 记忆实践

1. Redis 到底接了个什么样的 AI先给结论:这里说的"Redis 已正式接入 AI",不是哪个第三方中间件套了个壳,而是 Redis 官方在 2024 年底把 AI 能力直接做进了主版本。Redis 8 开始内置向量检索、语义缓存、自然语言查询这些能力&…

2026/11/3 8:15:20

移动端热修复技术:Hotfix与Tinker对比与实践指南

1. 移动端热修复技术概述在移动应用开发领域,热修复技术已经成为现代App迭代过程中不可或缺的基础能力。不同于传统的全量更新方式,热修复允许开发者在无需重新发布安装包的情况下,动态修复线上应用的代码缺陷和逻辑错误。这种技术显著提升了…

2026/11/3 8:15:20

本地播放器歌单系统:队列持久化、稳定排序与M3U8容错

做本地音乐播放器这件事,最容易被低估的从来不是解码,也不是界面皮肤,而是歌单。歌单队列保存、排序、M3U8 导入导出这几件事,看着像是增删改查的体力活,真上手做进 Folia 这样的本地播放器里,你会发现它牵…

2026/11/3 8:15:20

C#上位机大数据处理优化实战:性能提升10倍

1. 工业级C#上位机大数据处理优化实战最近接手了一个锂电工厂的C#上位机项目,遇到了一个相当棘手的问题:需要处理20台电芯检测设备每秒产生的8万条数据,同时还要支持5000万条历史数据的批量分析和报表生成。上线第一天就遭遇了CPU飙高、内存溢…

2026/11/3 8:15:19

Hotfix与Tinker:移动端热修复技术对比与实践

1. 移动端热修复技术概述在移动应用开发领域,热修复技术已经成为现代App迭代过程中不可或缺的基础能力。想象一下这样的场景:你的应用刚上线就发现了一个导致崩溃的严重bug,按照传统方式需要重新打包、提交审核、等待应用商店审核&#xff08…

2026/11/3 8:10:19

Redis缓存穿透、击穿与雪崩问题解析与解决方案

1. Redis缓存三大问题概述在当今的高并发系统架构中,Redis作为内存数据库已经成为不可或缺的组件。然而,随着业务规模的扩大,我们经常会遇到三种典型的缓存问题:穿透、击穿和雪崩。这些问题看似相似,实则有着本质的区别…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑