如何通过编程方式获取Android设备的定制ROM/操作系统名称
安卓端定制ROM/系统名称获取的可行技术方案
之前尝试的几个方法无法拿到准确值,核心原因是这些接口都是原生安卓框架预留的通用字段,没有强制要求各定制ROM厂商填充对应系统名称:
Build.VERSION.BASE_OS是原生安卓用来标记底层AOSP版本的字段,定制ROM不会主动填充,因此返回空值属于正常情况System.getProperty("os.name")读取的是Linux内核的系统标识,本来就不会显示上层定制ROM的名称ro.modversion是第三方ROM开发者的自定义标记,没有统一规范,大部分官方定制ROM都不会写入这个值,返回null是预期行为Build.DISPLAY是厂商自定义的版本拼接串,格式无统一标准,比如一加的返回值为机型+更新包日期,无稳定可解析的系统名
核心实现思路
整体识别逻辑分为两层:优先通过反射读取厂商专属的系统私有属性提取系统名称,再结合Build类公开的厂商标识做兜底校验,避免高版本系统的权限拦截导致识别失败。
1. 通用系统属性读取能力
安卓SDK没有开放公开的全量系统属性读取接口,所有ro.开头的系统属性,本质都藏在android.os.SystemProperties这个隐藏类里,通过反射即可调用读取:
fun getSystemProperty(propKey: String, defaultValue: String = ""): String { return try { val systemPropClass = Class.forName("android.os.SystemProperties") val getPropMethod = systemPropClass.getMethod("get", String::class.java, String::class.java) getPropMethod.invoke(null, propKey, defaultValue) as String } catch (e: Exception) { defaultValue } }
2. 主流厂商属性键值匹配规则
目前各主流品牌的定制ROM基本都把系统名称存在固定键值里,对照查询即可完成识别:
- OPPO/realme(ColorOS):读取
ro.oppo.version,返回值一般直接包含ColorOS版本标识 - OnePlus(氧OS/氢OS):海外机型读
ro.oxygenos.version,国内机型读ro.rom.version,返回值会标注OxygenOS/HydrogenOS - 华为/荣耀(HarmonyOS/EMUI):先读
ro.harmony.version判断是否为鸿蒙系统,再读ro.build.version.emui识别EMUI版本 - 小米/Redmi(MIUI):读
ro.miui.ui.version.name结合厂商标识识别 - vivo/iQOO(OriginOS/FuntouchOS):读
ro.vivo.os.version匹配对应系统名 - 三星(One UI):读
ro.build.version.oneui结合厂商标识识别
匹配时不需要对返回值做强绑定,只要返回的字符串里包含“ColorOS”“OxygenOS”“HarmonyOS”这类明确的系统名关键词,就可以直接提取对应名称,兼容厂商后续可能修改键值的场景。
落地避坑提示
- 安卓13及以上版本会对非系统应用读取厂商私有属性做权限拦截,读不到属性时要结合
Build.MANUFACTURER、Build.BRAND这两个无权限限制的公开字段做兜底:比如识别到厂商为OPPO就默认对应ColorOS,识别到为OnePlus就默认对应氧/氢OS,识别到为华为就默认对应HarmonyOS/EMUI - 所有读取逻辑要做异常捕获和默认值兜底,不要因为个别字段读取失败导致应用崩溃
- 不要为了识别准确性硬编码过细的版本判断规则,适配主流厂商的常见场景即可,小品牌定制ROM可以统一归类为“未知定制安卓系统”
内容的提问来源于stack exchange,提问作者Waqar UlHaq
相关产品推荐
相关产品推荐

