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

Posted 上马定江山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了] 关于重写platform判断平台的一些尝试相关的知识,希望对你有一定的参考价值。

在开发shine_image思考的时候,我在空闲时间写下这两段代码。主要是借用rust来对宿主平台进行判断。

由于flutter本身的platform判断不了鸿蒙与各家厂商的系统ui,而我是能不写双端代码就不写的原则,所以简单的尝试了下,倒是没想到成功的如此简单。

首先我们先在rust侧,编写一个enum

pub enum Platform 
    Unknown,
    android,
    ios,
    Windows,
    Unix,
    MacIntel,
    MacApple,
    Wasm,
    HarmonyOSVersion2,
    HarmonyOSVersion3,

就是各个系统,我判断了HarmonyOS系统,其实如果你想判断miui,emui,flyme,烂橘子之类的,都是可以的,后面会说明。

由于不做处理,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平台,类似于emui,miui也可以通过ro.build.version.emuiro.miui.ui.version.name之类的进行判断,总之这些第三方厂商ui都会往里面塞一些自己家的信息。

HarmonyOS中会有哪些信息值得我们重视的呢?

打印HarmonyOS的prop我们会发现这两项以hw_sc开头的prop。

前者开发过ets或者ark-ui的大概就很熟悉,它是鸿蒙的api版本,根据我个人的ets开发经历,在api4以上就是HarmonyOS了,而api8以上则是最新的HarmonyOS 3.0

那么剩下的就很简单了,编写一个platform()方法,该方法返回一个Platformenum

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官方认证微信卡片免费领取↓↓↓

以上是关于] 关于重写platform判断平台的一些尝试的主要内容,如果未能解决你的问题,请参考以下文章

CUBA-Platform将全面助力中国开发者

Java基础--关于Object的一些通用方法

VERBOSE-2:Platform_view_layer.cc(28) - 尝试嵌入平台视图,但 PaintContext 不支持嵌入

linux设备驱动之platform平台总线工作原理

Azure Data Platform数据平台的选择

Azure Data Platform数据平台的选择