部分设备(三星A71)Device Info JSON返回空值问题求助
三星A71(Android 11)设备信息收集返回空JSON问题排查
问题根源分析
你的代码中获取系统版本名称的逻辑存在致命错误,这是导致三星A71(Android 11)返回空JSON的核心原因:
val osNames = Build.VERSION_CODES::class.java.fields val osName = osNames[Build.VERSION.SDK_INT].name
Build.VERSION_CODES的字段按版本发布顺序声明,索引从0开始,但Build.VERSION.SDK_INT是版本对应数值(Android 11对应30),两者完全不匹配——osNames的长度远小于30,直接用SDK_INT作为索引会抛出ArrayIndexOutOfBoundsException,导致整个设备信息收集代码崩溃,最终无法生成有效JSON。
此外还需排查潜在风险:
- 混淆规则可能误移除
BuildConfig的字段,导致VERSION_NAME/VERSION_CODE为空 - 部分设备
Build类字段可能存在空值,但jsonObjectOfNonNull会过滤空值,不会直接导致整个JSON为空(比如platform是硬编码常量,不可能为空)
修复方案
1. 修复系统版本名称获取逻辑
改用遍历字段匹配的方式,避免数组越界:
val osName = Build.VERSION_CODES::class.java.fields .firstOrNull { it.getInt(null) == Build.VERSION.SDK_INT } ?.name ?: "Unknown"
2. 添加异常捕获机制
将设备信息收集逻辑包裹在try-catch中,防止单个字段获取失败导致整个JSON为空:
val deviceInfo = try { val osName = Build.VERSION_CODES::class.java.fields .firstOrNull { it.getInt(null) == Build.VERSION.SDK_INT } ?.name ?: "Unknown" jsonObjectOfNonNull( "language" to app.getLanguage(), "platform" to "Android", "versionName" to com.project.BuildConfig.VERSION_NAME, "versionCode" to com.project.BuildConfig.VERSION_CODE, "systemName" to osName, "systemCodeName" to Build.VERSION.CODENAME, "systemVersion" to Build.VERSION.RELEASE, "systemSdkInt" to Build.VERSION.SDK_INT, "deviceModel" to Build.MODEL, "deviceBrand" to Build.BRAND, "deviceBootloader" to Build.BOOTLOADER, "deviceDisplay" to Build.DISPLAY, "deviceProduct" to Build.PRODUCT, "deviceDevice" to Build.DEVICE, "deviceHardware" to Build.HARDWARE, "deviceManufacturer" to Build.MANUFACTURER, "timeZone" to TimeZone.getDefault().id, "timeZoneSecondsFromGMT" to TimeZone.getDefault().rawOffset / 1000 ) } catch (e: Exception) { // 捕获异常后返回基础信息,避免空JSON jsonObjectOfNonNull( "platform" to "Android", "error" to "设备信息收集失败: ${e.message}" ) }
3. 检查混淆配置
确保BuildConfig类的字段不被混淆移除,在proguard-rules.pro中添加:
-keep class com.project.BuildConfig { *; }
验证逻辑
修复后,三星A71设备不会再因数组越界崩溃,即便部分字段获取失败,也会返回包含基础信息和错误提示的JSON,而非空值。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

