黎小葱 2025-11-21 04:25 采纳率: 98.5%
浏览 0
已采纳

如何通过ADB获取设备制造商信息?

如何通过ADB命令快速获取Android设备的制造商信息?在多品牌设备混用的测试环境中,常遇到使用`adb devices`仅显示序列号而无法区分厂商的问题。能否通过shell命令直接读取设备制造商(如华为、小米、三星等)?常见尝试如`adb shell getprop ro.product.manufacturer`是否适用于所有Android版本?部分国产定制ROM是否存在属性名差异或权限限制导致获取失败?如何编写兼容性脚本统一获取制造商信息?
  • 写回答

1条回答 默认 最新

  • 扶余城里小老二 2025-11-21 09:15
    关注

    如何通过ADB命令快速获取Android设备的制造商信息

    在多品牌设备混用的测试环境中,adb devices 命令虽然能列出连接的设备及其序列号,但无法直接显示设备的制造商信息。这给自动化测试、设备管理与故障排查带来了挑战。本文将从基础命令入手,逐步深入分析兼容性问题,并提供可落地的脚本解决方案。

    1. 基础ADB命令获取制造商信息

    最常用的命令是通过读取系统属性来获取制造商名称:

    adb shell getprop ro.product.manufacturer

    该命令返回设备制造商的标准名称,例如:

    • 华为:HUAWEI
    • 小米:Xiaomi
    • 三星:samsung
    • OPPO:OPPO
    • vivo:vivo

    此方法适用于大多数原生Android设备和主流厂商设备,在Android 5.0及以上版本中表现稳定。

    2. 深入分析:系统属性的多样性与兼容性问题

    尽管 ro.product.manufacturer 是标准属性,但在部分国产定制ROM(如EMUI、MIUI、ColorOS)中,存在以下潜在问题:

    问题类型说明影响厂商
    属性名差异某些厂商使用非标准属性名华为、魅族、一加
    权限限制Shell受限时无法访问getprop部分低权限模式设备
    空值返回老旧或特殊固件未设置该字段山寨机、测试样机

    因此,单一依赖 ro.product.manufacturer 存在风险。

    3. 多属性备选方案提升兼容性

    为应对属性差异,建议构建多级查询策略。以下是常见替代属性:

    ro.product.brand
    ro.product.vendor.manufacturer
    ro.product.odm.manufacturer
    ro.product.system.manufacturer
    ro.build.product

    其中,ro.product.brand 通常表示品牌名,也常用于识别厂商。例如:

    adb shell getprop ro.product.brand

    返回值如 "Huawei" 或 "Redmi",可辅助判断。

    4. 编写兼容性脚本统一获取制造商信息

    以下是一个 Bash 脚本示例,支持多设备并行识别,具备容错机制:

    #!/bin/bash
    get_manufacturer() {
        local serial=$1
        local output=""
        
        # 设置目标设备
        export ANDROID_SERIAL=$serial
    
        # 定义候选属性列表
        props=(
            "ro.product.manufacturer"
            "ro.product.brand"
            "ro.product.vendor.manufacturer"
            "ro.product.odm.manufacturer"
        )
    
        for prop in "${props[@]}"; do
            output=$(adb shell getprop $prop 2>/dev/null | tr -d '\r\n' | xargs)
            if [ ! -z "$output" ] && [ "$output" != "[null]" ]; then
                echo "$serial|$output|$prop"
                return 0
            fi
        done
    
        echo "$serial|Unknown|fallback"
    }
    
    # 主逻辑:遍历所有连接设备
    devices=$(adb devices | tail -n +2 | grep -v "^$" | awk '{print $1}')
    
    for device in $devices; do
        result=$(get_manufacturer $device)
        IFS='|' read -r sn mfg source <<< "$result"
        printf "%-15s %-12s (via %s)\n" "$sn" "$mfg" "$source"
    done

    该脚本输出示例如下:

    HTYDU1982608765 HUAWEI       (via ro.product.manufacturer)
    ce12345abcde789 Xiaomi       (via ro.product.brand)
    R58R95A7B9C     samsung      (via ro.product.manufacturer)

    5. 高级方案:结合设备型号与映射表精准识别

    对于更复杂的场景,可引入设备型号映射机制。流程如下:

    graph TD A[获取设备序列号] --> B[执行adb shell getprop] B --> C{获取manufacturer?} C -- 成功 --> D[输出结果] C -- 失败 --> E[获取ro.product.model] E --> F[查本地厂商映射表] F --> G[返回推测厂商] G --> H[记录日志供后续优化]

    例如,建立一个简单映射文件 vendor_map.txt

    POR-1L    OnePlus
    MI 8      Xiaomi
    ELE-AL00  Huawei
    SM-G975F  Samsung
    PGN618M   OPPO

    通过模型匹配进一步提升识别准确率。

    6. 实际测试环境中的最佳实践

    在CI/CD流水线或大规模测试平台中,推荐以下实践:

    1. 优先使用 ro.product.manufacturer 作为主路径
    2. 设置超时机制防止卡死(如 adb 响应缓慢)
    3. 缓存已知设备的识别结果减少重复调用
    4. 记录未识别设备用于后续规则补充
    5. 结合 USB VID/PID 信息(通过 lsusb)做硬件层辅助判断
    6. 对返回值进行标准化处理(如转大写、去空格)
    7. 支持 JSON 输出格式便于集成
    8. 定期更新属性优先级列表以适配新机型
    9. 在Root设备上尝试读取 /system/build.prop 全量解析
    10. 使用Python封装实现跨平台支持

    这些措施显著提升了在异构设备集群中的识别效率与稳定性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月22日
  • 创建了问题 11月21日