如何判断Android应用运行在鸿蒙系统上

如何判断Android应用运行在鸿蒙系统上

/   今日科技快讯   /

近日,埃隆·马斯克表示,太空探索技术公司SpaceX正在研发的星际飞船可以在太空中来回飞行,“粉碎掉太空垃圾”。星际飞船是SpaceX许多目标的核心装备,目前仍在开发中。马斯克希望最终用星际飞船把人送到月球和更远的深空。SpaceX已经对飞船原型进行了不少次测试。

/   作者简介   /

本篇文章来自老司机椎锋陷陈的投稿,和大家分享了如何判断应用是否运行在鸿蒙系统上,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章!

椎锋陷陈的博客地址:

https://blog.csdn.net/Alfred_C

/   前言   /

不久前,HarmonyOS 2.0的正式发布,在华为用户及科技产品爱好者之间掀起了不小的波澜。其中,讨论关于HarmonyOS是如何兼容Android应用的话题最为频繁,从而引发了多方阵营关于「HarmonyOS究竟是否是套壳Android」的激烈争论。

与此同时,部分嗅到风向的开发者,已经在部署如何收集应用在HarmonyOS上的兼容情况了。这不,笔者所在的公司就安排我去进行相关的技术调研。其中,最重要的一点就是判断当前应用是否搭载在了HarmonyOS上,从而统计升级HarmonyOS的用户数量,作为后续公司战略方向可能调整的依据。

/   OpenHarmony与Harmony OS  /

首先,让我们先为前面的争论下一个明确的定论,即:

HarmonyOS并非套壳Android。

我们通常意义上所讲的HarmonyOS,实际分成了两部分,一部分是 OpenHarmony,另一部分则是包括HMS在内的闭源应用与服务。

OpenHarmony是由开放原子开源基金会孵化及运营的开源项目,其性质与定位可参照Android开放源代码项目(AOSP) 。

而HarmonyOS 2.0则是华为基于OpenHarmony 2.0开发的面向多种全场景智能设备的商用版本。HarmonyOS 2.0遵循了AOSP的开源许可,从而实现了现有Android生态应用在部分搭载HarmonyOS 2.0的设备上的正常运行。

目前在HarmonyOS 2.0上存在两种类型的应用,即

  • 纯HarmonyOS应用(指基于HarmonyOS开发的应用,不能安装在其他Android手机上,应用体积很小,但同时功能也很少)

  • 支持HarmonyOS特性的应用(基于Android开发的应用,但是使用了 HarmonyOS的特性,通过工具导出时后缀仍然是A*)

/   Harmony OS检测方法   /
现在回到我们最初的需求,即基于Android开发的应用,该如何判断是否是搭载在了HarmonyOS上呢?
对于这个问题的我的第一个解决思路就是:
通过读取Android系统配置,遍历能够作为判断依据的属性

Android系统配置介绍

为了让所有运行中的进程共享系统运行时所需要的各种属性值,Android系统开辟了属性存储区域,并提供了访问该区域的API。属性由键(key)与值(value)构成,两者都是字符串类型。
属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。
我们可以通过以下两种方式访问到系统配置中的属性值:

adb命令行工具

  • adb shell getprop 可以查看手机上所有属性值。

  • abb shell getprop xxx 可以查看某个指定属性值。

SystemProperties类

Systemproperties类在android.os目录下,但这个类是被标记为隐藏的,上层应用开发无法直接使用,但我们可以用反射的方式调用。创建/修改属性可以用Systemproperties.set(property,value)方法,获取属性则可以用Systemproperties.get(property)方法。
比如,我们可以通过此方式获取设置-关于手机中显示的版本号:
/**
 * 获取鸿蒙系统版本号
 */

fun getHarmonyOsVersion(): String {
    return if (isHuaweiBrand() && isHarmonyOs()) {
        try {
            val cls = Class.forName("android.os.SystemProperties")
            val method = cls.getMethod("get", String::class.java)
            method.invoke(cls, "ro.huawei.build.display.id"as String
        } catch (e: Exception) {
            "-1"
        }
    } else {
        "-1"
    }
}
当然,这个版本号可以用一种更直接的方式获取:
/**
 * 获取鸿蒙系统版本号
 */

fun getHarmonyOsVersion(): String {
    return if (isHuaweiBrand() && isHarmonyOs()) {
        Build.DISPLAY
    } else {
        "-1"
    }
}
通过阅读源码我们可以得知,其真正的实现也是通过调用SystemProperties.get(property)进行的,底层通过jni调用native方法实现属性的存取:
 public static final String DISPLAY = getString("ro.build.display.id");

    private static String getString(String property) {
        return SystemProperties.get(property, UNKNOWN);
    }

    public static String get(@NonNull String key, @Nullable String def) {
        if (TRACK_KEY_ACCESS) onKeyAccess(key);
        return native_get(key, def);
    }
但是很遗憾,遍历了所有的属性值之后,发现跟OS相关的属性值仍是关联到Android系统的,唯一出现Harmony字样的,是一个默认来电铃声的属性值:
所以,想要以此方案作为判断依据,我们需要通过读取默认来电铃声属性值并判断是否以Harmony结尾,但由于目前我手头上只有一台升级到HarmonyOS 2.0的手机,无法确保在其他机型的手机上该属性值也一致,因此只能将此方案作为保留方案。
另外一个解决思路则是:
通过是否支持调用HarmonyOS Java API来判断。
至于调用方式,和你猜想的一样,依然是以反射的形式,看看能否在运行时获取相关API的类的Class对象。
在HarmonyOS开发者官网上可以看到,最新发布的HarmonyOS SDK Release版的版本号是2.1.1.21,API版本为5(截至2025.6.22)。
而在HarmonyOS Java API文档中通过Since来标记包、类或接口等开始支持的版本号,如“Since:1”表示从API Version 1开始支持。
于是我们选择最新的API版本为5的类来作为试验对象:
具体代码也很简单,使用Class类的forName静态方法,以完整类名为参数获取Class对象,如果Class对象不为空,即可证明当前应用搭载在了HarmonyOS上:
/**
 * 当前是否是鸿蒙系统
 * 根据是否能调用Harmony JAVA API判断
 */

fun isHarmonyOs()Boolean {
    return try {
        val cls = Class.forName("ohos.utils.system.SystemCapability")
        cls != null
    } catch (e: Exception) {
        false
    }
}
/   一点疑惑   /
我为什么要选择API版本为5的类来判断呢?这是因为,通过是否支持调用HarmonyOS Java API来判断应用搭载在HarmonyOS的设备上这种思路,其实我一开始就想到了,但我最初是选用了HarmonyOS开发者官网第一个介绍的特性——Ability相关的类,而该类的API版本为1。
测试发现,升级了HarmonyOS和未升级的手机上居然都能够获取到Ability的Class对象!!!
百思不得其解的我,直到在查阅了HarmonyOS的历史版本说明后才注意到以下这一句:
于是进一步在HarmonyOS开发者的官方公众号上确认,得到了以下回复:
因此证明,通过是否支持调用HarmonyOS Java API来判断应用搭载在HarmonyOS的设备上这种思路是正确的,但要选用API版本为5的类才可以。
但是另外一个疑惑又产生了,即未升级HarmonyOS的手机为什么也能调用API版本低于5以下的HarmonyOS Java API呢?难道HarmonyOS的一部分特性相关的库早就在现有华为手机的EMUI上部署了吗?此问题目前还得不到合理的解释。
/   总结   /
为了减少用户的迁移成本,保护用户的现有数据,现阶段的HarmonyOS选择了在遵循AOSP的开源许可基础上兼容Android生态应用。
也是由于这一点,加上华为开发者官网上并没有明确给出API,导致基于Android开发的应用,要判断是否搭载在HarmonyOS上会比较迂回。
目前比较可靠的方式,是通过是否支持调用HarmonyOS Java API来判断,并且必须选择API版本为5的类。
如果你有更好的方式,欢迎在留言区讨论。
推荐阅读:
我的新书,《第一行代码 第3版》已出版!
Jetpack新成员AppSearch前来报到
通俗易懂,Android视图系统的设计与实现
欢迎关注我的公众号
学习技术或投稿

长按上图,识别图中二维码即可关注


相关文章: 短剧《正在通话中》完整版  短剧大结局《娘娘吉人自有天相》后续完整版(合集/后续大结局)  妙手云医app(内附攻略)  短剧《真千金她是福星锦鲤》完整版  魔兽世界插件更新软件,桃乐豆推出收费服务,绿钻6.8,紫钻9.8,免费用户服务部分缩减  实用插件!小红书图片视频无水印下载  Mplus 7.4 软件及代码  【Ai插件免费下载】85全套合集 – 支持CS6-2025  PHPSiYU同|城源码开源  免费CAD插件V1.1更新  读赢波经APP安装方式  不需要插件,使用CAD万能字体自动替换缺失字体!  【资讯】各大App付费用户数量排行榜出炉 你订阅过哪家?  这24款App被通报!赶紧卸载!  热门短剧《超级教师第二季》完整版1-73集/小程序大结局/合集/后续  比亚迪APP开启“驾驶辅助报告”内测!附:非内测车主提前尝鲜攻略!  热门短剧《鲁班秘术之杀局》完整版1-58集/大结局/合集  又封中国APP,这次号称“永久”!  超好看!热门短剧丨大结局《挪威的风,吹散誓言》全集在线看  热门短剧《消失的拳王》1-72(完整版/后续/大结局)  违法违规!54款App被通报!  【软件插件】红移渲染器(Redshift) V3.0.16安装教程及下载  《成绩统计排名》Excel插件【镇级用】  【插件】PS超级酷炫特效插件 让你的作品与众不同!  热门短剧《霸王餐风波》全集/完整版  2025年度爱用SU插件合集!收藏!  一个全新的源代码搜索引擎,专为软件开发者设计  短剧《至此飞鸟不相逢》完整版1-70集(后续/大结局/合集)  1月2日高质量短剧推荐!  Android:哔哩哔哩第三方电视TVapp BV_0.3.10  【WordPress开源免费插件4】自定义广告  稀缺资源,免费提供2025年度最牛AE插件合集(含安装教程),全能型人才必备!  爆款短剧《盛世阑珊处》完整版1-57集/大结局/合集  VSCode 必装50款插件,编码效率翻倍  别再被“源码”忽悠了!软件开发的坑,你踩过吗?  Blender插件-三维人物角色动作自动绑定 Auto-Rig Pro v3.76.29+Quick Rig V1.26.46  热门短剧推广  百度网盘资源免费领取 软件大全(一)  国家医保平台app下载  1月4日高质量短剧推荐!  【12.27周六】获得免费插件之后 | 黑马内&豪华露营  OBS美颜|直播|保姆级教程:OBS美颜插件下载安装步骤参数设置使用教程  3个信息差赚钱小项目(附软件、源码)  唱享K歌app全新升级百万曲库  短剧版《许我耀眼》陈添祥&朱小雪新剧《格林童话》  揭秘软件咨询界的“黄埔军校”  每一个开发者都必装的十大 Chrome 插件  军队采购网APP上线,便捷查询军队采购资讯(附下载链接)  熬夜必追短剧《千金女友非我不嫁》完整版1-87集/大结局/合集  83款超全CAD插件合集收集了常用的CAD插件安装教程(含安装包) 


相关栏目: 【 项目实操51932 】 【 工作流4

© 免责声明

相关文章