一加设备为何不存在Build.VERSION.RELEASE_OR_CODENAME字段
一加设备不存在Build.VERSION.RELEASE_OR_CODENAME字段的核心原因
Build.VERSION.RELEASE_OR_CODENAME不是安卓全版本通用的公开API:该字段从Android 11(API 30)才正式加入公开SDK,在Android 10及更低版本的原生AOSP代码中,它是被@hide标记的内部字段,谷歌不要求厂商在ROM中强制实现。- 涉事一加机型系统版本不满足要求:一加3T官方最终推送的系统版本为Android 9,一加5T官方最终推送的系统版本为Android 10,两款机型的官方系统框架均未预置这个非强制的内部字段,调用时必然抛出
NoSuchFieldError。 - 三星设备可正常运行属于厂商定制差异:三星在部分旧版本定制ROM中提前添加了该字段的实现,属于厂商自有修改,不代表所有安卓设备都支持该字段,不能作为通用兼容依据。
全机型兼容的Android版本号获取方案
直接调用该字段不做容错会有极高的崩溃风险,正确写法是增加异常捕获,高版本系统优先读取RELEASE_OR_CODENAME(可正确识别预览版系统的版本代号),读取失败时回退到所有安卓版本都稳定支持的Build.VERSION.RELEASE字段即可,参考代码:
public static String getSystemVersionName() { String version; try { version = (String) Build.VERSION.class.getField("RELEASE_OR_CODENAME").get(null); } catch (Throwable throwable) { version = Build.VERSION.RELEASE; } return version; }
注意:反射读取系统非公开字段时必须加全量异常捕获,安卓厂商对系统框架的自定义裁剪、修改自由度极高,未做容错的反射调用在不同机型上触发崩溃的概率非常高。
内容的提问来源于stack exchange,提问作者REInVent
相关产品推荐
相关产品推荐

