You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部分设备(三星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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:48:22