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
您好,在纯血鸿蒙上运行的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")
// 或者尝试鸿蒙特有的节点(如果有)
总结建议
- Log 是关键: 先把
android.os.Build类下的所有字段(DISPLAY,VERSION.RELEASE,VERSION.INCREMENTAL,MODEL,BRAND等)全部打印出来,看看哪一个字段里包含了6.0.0字样。 - 不要依赖
SystemProperties: 在兼容层环境下,这个类的行为是不可信的。 - 如果所有字段都是旧的: 如果
Build类的所有字段在纯血鸿蒙上都返回旧值(如 Android 10 或 HarmonyOS 4.0),那么纯 Android App 无法获取真实的 HarmonyOS NEXT 版本信息。这是系统隔离设计的必然结果。
最终解决方案: 如果是为了业务统计,建议引导用户升级到鸿蒙原生版 App。Android App 在纯血鸿蒙上属于“受限运行”,无法获取底层真实信息是系统设计的特性,而非 Bug。
找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.incremental、hw_sc.build.platform.version)在兼容层中被映射或模拟成旧版Android系统的值(如HarmonyOS 4.0.0),以保持兼容性。
您获取到的HarmonyOS 4.0.0是兼容层返回的虚报版本,而非真实系统版本。真实版本信息(如6.0.0.130)存储在HarmonyOS原生系统属性中,这些属性在Android运行时环境中被屏蔽或修改。
目前,从Android App侧获取真实HarmonyOS NEXT版本号的可行方法是:
- 解析
Build.DISPLAY或Build.FINGERPRINT:部分纯血鸿蒙设备会在这些字段中包含“HarmonyOS”字样及其版本号,但格式可能不统一,且不一定包含完整版本号。 - 读取特定系统文件:尝试读取
/proc/version、/system/build.prop或/vendor/build.prop等文件,搜索包含“HarmonyOS”的行。但兼容层可能限制对这些文件的访问或内容也被修改。 - 使用系统服务:通过Android的
PackageManager或TelephonyManager获取设备信息,或尝试调用隐藏的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%获取到真实系统版本号,因为系统层有意识进行信息遮蔽。您的代码需要增加容错,将无法获取的情况视为未知设备。


