在开发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支持的渠道只有图中这些:

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

所以直接判别HarmonyOS的想法是不现实的。而经过std::env::args获取的体系标识,经过实测emui与HarmonyOS是一致的。也就没法用它来判别。

于是我想到安卓的getprop命令,在rust侧能否拿到它,实际查询了一下,发现用std::process::Command确实是可以拿到prop信息的,这儿我编写了一个check_description()方法,并将它输出到flutter侧。

拿我的魅族17pro测试,在页面输出如图:

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

看到了很多了解的prop了吧,这儿的ro.build.flyme.version就可以用来判别是否是flyme渠道,类似于emui,miui也可以经过ro.build.version.emuiro.miui.ui.version.name之类的进行判别,总之这些第三方厂商ui都会往里面塞一些自己家的信息。

HarmonyOS中会有哪些信息值得咱们注重的呢?

打印HarmonyOS的prop咱们会发现这两项以hw_sc最初的prop。

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

前者开发过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

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

咱们编写个简略的text()输出的页面,打印的成果如下:

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

而运用HarmonyOS 2.0的设备朋友忘了截图设备信息了,直接上输出页面的图:

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

最终,试试我的flyme会不会误辨认:

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

看来没问题。那么这个自建的platform有什么用呢?

假如你需求针对HarmonyOS,或许某些特定的厂商ui渠道调用其特有的api,或是处理特定渠道的bug,那么它或许就会帮很大的忙。

关于platform的探索就到这了,明天还得持续忙活我的shine_image的逻辑呢,不过假如我们喜欢这样的间章的话,之后我也会时不时出一点间章的文章,毕竟我仍是蛮喜欢折腾奇奇怪怪的东西。

我建立了一个flutter的初始项目体验小工程,把我文章写的一些东西展现在这边,而且用户可以看到它运作正常,我打算将它打包在apk,在下篇文章的时分,提供给有想要试玩的小伙伴,玩一玩。

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

假如觉得风趣,来个一键三连吧,大佬们!