HarmonyOS鸿蒙Next中Android App装在纯血鸿蒙手机上怎么样可以获取到HarmonyOS鸿蒙Next版本信息?

HarmonyOS鸿蒙Next中Android App装在纯血鸿蒙手机上怎么样可以获取到HarmonyOS鸿蒙Next版本信息?

private fun getHuaweiRom(): String {

    val display = android.os.Build.DISPLAY

    // 1. UI层(最稳定,优先级最高)
    Regex("""HarmonyOS\s?(\d+(\.\d+)*)""", RegexOption.IGNORE_CASE)
        .find(display)
        ?.value
        ?.let { return it }

    // 2. Harmony 属性(兼容 4.0 这种纯数字)
    val hw = prop("hw_sc.build.platform.version")
    if (hw.isNotBlank()) {
        return if (hw.startsWith("HarmonyOS", true)) {
            hw
        } else {
            "HarmonyOS $hw"
        }
    }

    // 3. incremental(部分机型)
    val incremental = prop("ro.build.version.incremental")
    if (incremental.startsWith("HarmonyOS", true)) {
        return incremental
    }

    // 4. EMUI(兜底)
    val emui = prop("ro.build.version.emui")
    if (emui.isNotBlank()) {
        return "EMUI $emui"
    }

    return "Android ${androidVersion()}"
}
private fun prop(key: String): String {
    return try {
        val clazz = Class.forName("android.os.SystemProperties")
        val method = clazz.getMethod("get", String::class.java)
        (method.invoke(null, key) as String).trim()
    } catch (e: Exception) {
        ""
    }
}

现在在纯血鸿蒙手机上,在关于手机页看到HarmonyOS版本 6.0.0 软件版本6.0.0.130(SP27C00E130R3P8),但实际获取到的是HarmonyOS 4.0.0

怎么样在Android App里获取到6.0.0、6.0.0.130(SP27C00E130R3P8)这些信息?


更多关于HarmonyOS鸿蒙Next中Android App装在纯血鸿蒙手机上怎么样可以获取到HarmonyOS鸿蒙Next版本信息?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

您好,在纯血鸿蒙上运行的Android软件实际上是通过“卓易通”提供的兼容层运行的,可以理解为一个轻量化的虚拟机,只能获取到卓易通开放给安卓应用的api,所以不支持穿透调用纯血鸿蒙的api。

更多关于HarmonyOS鸿蒙Next中Android App装在纯血鸿蒙手机上怎么样可以获取到HarmonyOS鸿蒙Next版本信息?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


卓易通解决

可以很明确的告诉你:获取不到

目前是Android App,还能装在纯血鸿蒙里面。那只有一种方式:你是安装在卓易通里面的。
卓易通这种方式就是安装在鸿蒙系统里面的虚拟机,类似在Windows装了vmware。
能不能获取到最新系统信息,这个取决于卓易通有没有开通这个API。

解决方式:建议反馈给卓易通那边,让他们给获取最新设备信息的API。

以下是几种可能的尝试方案:

方案一:尝试新的系统属性 Key(反射法进阶)

纯血鸿蒙可能会暴露新的属性 Key。你需要尝试猜测或查找新的 Key。

你可以修改你的 prop 调用,尝试以下可能的 Key(这些是常见的系统属性命名习惯,需逐一测试):

// 尝试获取显示版本
val display = prop("ro.harmony.version.display") 
// 或者
val release = prop("ro.harmonyos.version.release")
// 或者查看是否有针对 NEXT 的特定属性
val next = prop("ro.build.version.next") 

注意: 如果兼容层完全屏蔽了对底层真实属性的读取,这个方法依然会失败。

方案二:解析 Build.DISPLAY(你代码中的第一顺位逻辑)

你代码中的第一部分逻辑其实是最有希望的,但正则可能需要调整。

val display = android.os.Build.DISPLAY
// 打印这个 log 看看它到底返回了什么
Log.d("SystemInfo", "Build.DISPLAY = $display")

在纯血鸿蒙上,Build.DISPLAY 有可能返回类似 JLY-AN00 6.0.0.130(SP27C00E130R3P8) 这样的字符串。如果它返回了包含 6.0.0 的字符串,你需要调整你的正则表达式来匹配它。

修改建议: 不要只匹配 HarmonyOS 开头,尝试直接提取数字版本号。

// 假设 display 返回了 "JLY-AN00 6.0.0.130(...)"
Regex("(\\d+\\.\\d+\\.\\d+\\.\\d+)").find(display)?.value?.let {
    return "HarmonyOS $it"
}

方案三:利用 Build.VERSION.INCREMENTAL

有时候 INCREMENTAL 字段会包含详细的构建版本信息。

val incremental = android.os.Build.VERSION.INCREMENTAL
// 打印 log 查看内容
Log.d("SystemInfo", "Incremental = $incremental")

如果这里返回了 6.0.0.130(...),直接用它即可。

方案四:读取系统文件(非 SystemProperties)

如果 SystemProperties 类被兼容层劫持了,你可以尝试直接读取 Linux 节点(如果权限允许)。

private fun readFromFile(path: String): String {
    return try {
        File(path).readText().trim()
    } catch (e: Exception) {
        ""
    }
}

// 尝试读取
// 注意:Android App 在纯血鸿蒙中权限受限,大概率读不到这些文件,但可以一试
val version = readFromFile("/proc/version") 
// 或者尝试鸿蒙特有的节点(如果有)

总结建议

  1. Log 是关键: 先把 android.os.Build 类下的所有字段(DISPLAY, VERSION.RELEASE, VERSION.INCREMENTAL, MODEL, BRAND 等)全部打印出来,看看哪一个字段里包含了 6.0.0 字样。
  2. 不要依赖 SystemProperties 在兼容层环境下,这个类的行为是不可信的。
  3. 如果所有字段都是旧的: 如果 Build 类的所有字段在纯血鸿蒙上都返回旧值(如 Android 10 或 HarmonyOS 4.0),那么纯 Android App 无法获取真实的 HarmonyOS NEXT 版本信息。这是系统隔离设计的必然结果。

最终解决方案: 如果是为了业务统计,建议引导用户升级到鸿蒙原生版 App。Android App 在纯血鸿蒙上属于“受限运行”,无法获取底层真实信息是系统设计的特性,而非 Bug。

在纯血鸿蒙手机上通过现有方法只能获取到“HarmonyOS 4.0.0”,这很可能是因为您的代码依赖的某些系统属性在新的鸿蒙系统版本上发生了变化。

为了能正确获取到当前设备的HarmonyOS版本信息(例如“6.0.0”或完整的“6.0.0.130(SP27C00E130R3P8)”),建议您尝试以下几种方法:

方法一:检查 android.os.Build 的其他字段

首先,最直接的方法是检查 android.os.Build 类的其他公共字段,新版本的鸿蒙系统可能会将关键信息放在不同的地方。

请尝试在您的代码中添加以下调试部分,查看所有相关的系统版本信息:

private fun getHuaweiRom(): String {
    // 【新增调试代码开始】
    val build = android.os.Build::class.java
    val fields = build.declaredFields
    for (field in fields) {
        field.isAccessible = true
        val value = field.get(null) ?: "null"
        Log.d("BuildField", "${field.name}: $value")
    }
    // 【新增调试代码结束】

    // 然后继续您原来的逻辑...
    val display = android.os.Build.DISPLAY
    // ...
}

运行这段代码后,查看日志中的 BuildField 标签,重点关注类似 VERSION.RELEASEVERSION.INCREMENTALDISPLAY 等字段,看是否有包含真实版本号“6.0.0”的信息。

方法二:尝试读取更新的系统属性键

随着鸿蒙系统的发展,存储版本信息的系统属性键可能已经改变。除了您已经尝试过的键,还可以尝试读取以下几个新的或常用的属性键:

  • ro.system.build.display.id
  • ro.build.version.release
  • ro.huawei.build.platform.version

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

纯血鸿蒙(HarmonyOS 6)的版本信息没有暴露在传统 Android 属性里,所以我觉得你可以换其他路线试试

您好,目前安装在纯血鸿蒙的安卓应用版本信息识别为安卓系统(版本为安卓12),因Android APP运行于隔离在HM kennel的容器内,无法获取到鸿蒙系统的版本信息

您好,参考[@ohos.deviceInfo (设备信息)-设备管理-ArkTS API-Basic Services Kit(基础服务)-基础功能-系统 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-device-info)

通过Android系统的Build属性无法直接获取纯血鸿蒙Next版本号。可使用系统API ohos.system.version 类获取 GetVersion() 方法返回版本号;或读取 /system/build.prop 文件中的ro.build.version.platform.name属性值。

在纯血鸿蒙(HarmonyOS NEXT)上,Android兼容层应用无法直接通过上述代码获取到真实的HarmonyOS NEXT版本号(如6.0.0)。这是因为HarmonyOS NEXT已剥离Android框架,系统属性(如ro.build.version.incrementalhw_sc.build.platform.version)在兼容层中被映射或模拟成旧版Android系统的值(如HarmonyOS 4.0.0),以保持兼容性。

您获取到的HarmonyOS 4.0.0是兼容层返回的虚报版本,而非真实系统版本。真实版本信息(如6.0.0.130)存储在HarmonyOS原生系统属性中,这些属性在Android运行时环境中被屏蔽或修改。

目前,从Android App侧获取真实HarmonyOS NEXT版本号的可行方法是:

  1. 解析Build.DISPLAYBuild.FINGERPRINT:部分纯血鸿蒙设备会在这些字段中包含“HarmonyOS”字样及其版本号,但格式可能不统一,且不一定包含完整版本号。
  2. 读取特定系统文件:尝试读取/proc/version/system/build.prop/vendor/build.prop等文件,搜索包含“HarmonyOS”的行。但兼容层可能限制对这些文件的访问或内容也被修改。
  3. 使用系统服务:通过Android的PackageManagerTelephonyManager获取设备信息,或尝试调用隐藏的SystemProperties.get方法,指定HarmonyOS特有的属性键(如hw_sc.build.platform.version的实际值已被兼容层替换,需探索其他未公开的键)。

您实际获取到HarmonyOS 4.0.0正是因为兼容层主动返回了旧版本号,以欺骗依赖Android版本判断的App。最准确的方法是利用Build.DISPLAY,直接查找字符串“6.0.0”或“6.0.0.130”。如果该字段被正确暴露,则能直接获取。否则,只能依赖文件解析。

重要的是,在纯血鸿蒙上,Android App无法保证100%获取到真实系统版本号,因为系统层有意识进行信息遮蔽。您的代码需要增加容错,将无法获取的情况视为未知设备。

回到顶部