背景介绍
很多应用在纯血鸿蒙系统中功能无法正常使用,这是因为纯血鸿蒙是通过卓易通安装的软件,运行在一个独立的虚拟机中与鸿蒙系统是完全隔离开的。这部分用户反馈我们每次都只能手动纠正标签,解决不了,看着干着急。 那是否有什么办法来判断用户的手机是否是纯血鸿蒙系统呢?
判断方法
常见的错误方法
-
按手机机型判断
- 比如当前常见的业务代码中有类似的判断方法:
typescriptpublic static boolean isHarmonyOs() { boolean brand = "HUAWEI".equalsIgnoreCase(Build.BRAND) || "HONOR".equalsIgnoreCase(Build.BRAND); if (!brand) return false; // 下面的代码在冷启动阶段会有发生 ANR 风险,因此除特点机型,没必要执行下述代码 try { Class<?> buildExClass = Class.forName("com.huawei.system.BuildEx"); Object osBrand = buildExClass.getMethod("getOsBrand").invoke(buildExClass); if (osBrand == null) return false; return "harmony".equalsIgnoreCase(osBrand.toString()); } catch (Throwable x) { return false; } }
这种方式只能判断是否是鸿蒙系统而非纯血鸿蒙系统,且采用反射方法大概率会调用失败并且存在ANR风险
-
按系统版本判断
- 实际上是不可行的,因为是否是纯血鸿蒙与系统版本无关
- 比如从用户反馈中找到过机型为HUAWEI ALN-AL00 (12)的纯血鸿蒙系统与非纯血鸿蒙系统
正确的判断方法
通过分析系统参数对比,发现可以通过phoneDisplay
和phoneModel
的规则来判断是否是HarmonyOS NEXT:
- 纯血鸿蒙系统 :
phoneDisplay
是以"System"开头的 - 非纯血鸿蒙系统 :
phoneDisplay
是以phoneModel
开头的
参数对比分析
HUAWEI ALN-AL00 (12)机型对比
是否是纯血鸿蒙 | phoneDisplay | phoneModel |
---|---|---|
是 | System 104.5.0.001(60 H5) | ALN-AL00 |
否 | ALN-AL00 4.2.0.183(C00E165R4P16) | ALN-AL00 |
其他机型对比
HUAWEI PLR-AL50 (12)
是否是纯血鸿蒙 | phoneDisplay | phoneModel |
---|---|---|
是 | System 104.5.0.001(60 FA) | PLR-AL50 |
否 | PLR-AL50 4.3.0.160(SP3C00E160R7P7) | PLR-AL50 |
HUAWEI ALT-AL10 (12)
是否是纯血鸿蒙 | phoneDisplay | phoneModel |
---|---|---|
是 | System 104.5.0.001(60 CK) | ALT-AL10 |
否 | ALT-AL10 4.2.0.182(C00E162R7P18)I | ALT-AL10 |
代码实现
kotlin
fun isHarmonyOSNEXT(): Boolean {
// 判断是否是华为brand
val isHuaWeibrand = (
"HUAWEI".equals(Build.BRAND, ignoreCase = true)
|| "HONOR".equals(Build.BRAND, ignoreCase = true))
if (isHuaWeibrand) {
// 判断是不是纯血鸿蒙
val phoneDisplay = Build.DISPLAY
return phoneDisplay.startsWith("System")
}
return false
}
上述代码已经在纯血鸿蒙和非纯血鸿蒙机型上验证通过。在实际项目中我们可以添加更多判断防止误判,如仅在非play渠道判断。
应用场景
有了检测方法后,我们可以:
- 添加App日志标签:用户反馈时直接打上一个"纯血鸿蒙"的标签
- 用户提醒:在首页等地方提醒用户应用不兼容纯血鸿蒙系统
- 完善相关业务:在相关业务中完善相关提醒,降低用户反馈