📚 目录
- 前言
- 核心原则
- Android 系统架构与问题分层
- 问题诊断通用流程
- 如何提供有效信息
- BSP 层问题诊断
- System 层问题诊断
- 最佳实践
- 问题速查表
前言
本文档基于实际解决 Android 底层系统问题的经验,总结了如何有效使用 AI 助手(如 Cursor、Claude)解决 BSP(Board Support Package)和 System 层的复杂问题。
📖 本文档的定位
核心理念:聚焦于"人机协作"的核心价值,让 AI 专注于问题诊断和方案建议,而用户专注于问题描述、信息收集和方案实施。
本文档重点关注:
- ✅如何向 AI 提供有效信息以获得准确诊断
- ✅问题定位方法和诊断思路
- ✅需要收集哪些日志和文件
- ✅AI 可以帮你做什么,不能做什么
本文档不包含:
- ❌ 具体的编译命令(因平台和项目而异)
- ❌ 平台特定的 BSP 编译流程
- ❌ 工具链配置和编译环境搭建
人机协作模式:
用户 → 描述问题 + 提供日志/源码 → AI ↑ ↓ ← 方案实施 + 结果反馈 ← AI 分析诊断 + 提出方案适用范围
- BSP 层:Bootloader、Kernel、Device Tree、驱动开发
- HAL 层:硬件抽象层、Vendor 服务
- Framework 层:System Server、Native 服务
- 应用层:系统应用、权限问题
适用场景
- 新硬件平台移植
- 设备树配置和驱动调试
- 系统启动问题
- 硬件功能异常(显示、音频、摄像头、USB、网络等)
- 性能和稳定性问题
- SELinux 和权限问题
- 系统服务崩溃
Android 系统架构与问题分层
系统层次结构
┌─────────────────────────────────────────────┐ │ Applications (Java/Kotlin) │ 应用层 ├─────────────────────────────────────────────┤ │ Android Framework (Java/Kotlin) │ 框架层 │ - System Server - Activity Manager │ │ - Package Manager - Window Manager │ ├─────────────────────────────────────────────┤ │ Native Services (C/C++) │ Native 层 │ - SurfaceFlinger - MediaServer │ │ - AudioFlinger - Binder │ ├─────────────────────────────────────────────┤ │ HAL (Hardware Abstraction Layer) │ HAL 层 │ - Display HAL - Audio HAL - Camera HAL │ │ - Sensors HAL - USB HAL │ ├─────────────────────────────────────────────┤ │ Linux Kernel (C) │ 内核层 │ - Device Drivers - Memory Management │ │ - Process Scheduler - Network Stack │ ├─────────────────────────────────────────────┤ │ Bootloader (U-Boot/ABL) │ 引导层 └─────────────────────────────────────────────┘问题分类与定位
| 层次 | 典型问题 | 关键日志 | 诊断重点 |
|---|---|---|---|
| Bootloader | 启动失败、分区错误 | fastboot log、串口日志 | 分区表、启动参数 |
| Kernel | 驱动加载失败、内核崩溃 | dmesg、/proc/kmsg | Device Tree、驱动代码 |
| HAL | 硬件功能异常、性能问题 | logcat、vendor log | HAL 实现、SELinux |
| Framework | 系统服务崩溃、ANR | logcat、tombstone | Binder、权限配置 |
| Application | 应用崩溃、权限拒绝 | logcat、bugreport | Manifest、SELinux |
问题层次判断
快速判断方法:
# 1. 系统能否启动到 Android?adb devices# 如果看不到设备 → Bootloader/Kernel 问题# 2. 内核日志是否正常?adb shelldmesg|grep-i"error\|fail"# 大量错误 → Kernel/驱动问题# 3. 系统服务是否运行?adb shellservicelist# 服务缺失 → Framework 问题# 4. HAL 服务是否正常?adb shellps-A|grep"android.hardware"# HAL 未启动 → HAL 层问题# 5. SELinux 是否阻止?adb shelldmesg|grepavc# 有 avc denied → SELinux 问题核心原则
1.提供日志,而非描述
❌错误示例:
“我的显示驱动加载不了”
✅正确示例:
“DRM 驱动没有加载,/dev/dri/ 目录不存在”
附带:dmesg日志、logcat输出
2.提供完整上下文
AI 需要了解:
- 硬件平台(如:Qualcomm SA6155P)
- Android 版本(如:Android 14)
- 内核版本(如:6.1.99)
- 问题现象(启动卡死、功能异常等)
- 已尝试的修改
3.逐步缩小问题范围
不要一次性提出多个问题,而是:
- 先解决最核心的问题(如:系统能否启动)
- 再解决次要问题(如:功能优化)
4.提供可编译的完整文件
AI 需要看到:
- 完整的设备树文件(
.dtsi) - 相关的驱动源码(如果需要)
- 编译输出和错误信息
问题诊断通用流程
第一步:明确问题层次和现象
关键问题:
- 系统启动到哪个阶段?(Bootloader / Kernel / Android)
- 问题是否可重现?(必现 / 概率性)
- 影响范围?(特定功能 / 整个系统)
- 最近的修改?(代码改动 / 配置变更)
快速定位层次:
# Bootloader 层检查fastboot devices# 能看到设备表示 Bootloader 正常# Kernel 层检查adb shell"echo 'kernel alive'"||echo"kernel not ready"# System 层检查adb shell getprop sys.boot_completed# 输出 1 表示启动完成# 具体功能检查adb shell dumpsys<service_name>需要提供的完整信息:
# === 基础信息 ===adb shell getprop>device_props.txt adb shelluname-a>kernel_version.txt# === Kernel 层 ===adb shelldmesg>dmesg.txt adb shellcat/proc/kmsg>kmsg.txt# 实时内核日志adb shell lsmod>loaded_modules.txt# === System 层 ===adb logcat -d>logcat.txt adb logcat -b all -d>logcat_all.txt# 包含所有 buffer# === HAL 层 ===adb logcat -b all -d|grep"android.hardware">hal_log.txt adb shellps-A|grep"android.hardware">hal_services.txt# === Framework 层 ===adb shell dumpsys>dumpsys_all.txt adb shell dumpsys activity>activity_dumpsys.txt# === SELinux ===adb shelldmesg|grepavc>selinux_denials.txt adb shell getenforce>selinux_mode.txt# === 性能信息 ===adb shelltop-n1>top.txt adb shellcat/proc/meminfo>meminfo.txt# === 崩溃信息 ===adb pull /data/tombstones/ ./tombstones/ adb bugreport bugreport.zip第二步:定位问题模块
示例对话:
用户:系统启动后 /dev/dri/ 目录不存在,scrcpy 无法连接 AI:请提供 dmesg 日志,我需要查看 DRM 驱动的加载情况 用户:@dmesg.txt AI:发现 mdss_mdp 节点被禁用,需要在设备树中启用第三步:分析根本原因
AI 会:
- 搜索相关的设备树文件
- 检查驱动源码逻辑
- 对比正常工作的配置
- 识别依赖关系
第四步:提出解决方案
AI 会:
- 提供具体的修改建议
- 解释修改的原因
- 预测可能的副作用
第五步:验证和迭代
验证流程:
# 1. 编译make-j$(nproc)# 2. 烧录fastboot flash dtbo dtbo.img# 3. 重启adbreboot# 4. 收集新日志adb shelldmesg>dmesg_new.txt反馈给 AI:
用户:修改后还是不行,新的 dmesg 日志如下 AI:发现新的错误 "failed to parse vregs",需要添加电源配置如何提供有效信息
问题类型与所需文件清单
以下表格列出了不同类型问题需要提供的具体文件:
| 问题类型 | 必须提供的日志 | 必须提供的源码/配置 | 设备树文件 | 其他文件 |
|---|---|---|---|---|
| Bootloader 问题 | - fastboot 输出 - 串口日志(如有) | - 分区表定义 - bootloader 配置 | - 不涉及 | - bootloader 二进制版本 |
| Device Tree 编译错误 | - 编译错误输出 | - 报错的 .dts/.dtsi 文件 - 被 #include 的相关文件 | -主要:问题相关的 dtsi - 可选:runtime.dts | - Makefile 或编译脚本 |
| 驱动 Probe 失败 | -必须:dmesg 完整日志 - deferred devices 列表 | -必须:驱动源码 (.c/.h) - 驱动的 Makefile/Kconfig | -必须:驱动对应的 DT 节点 - 示例: <platform>-<subsystem>.dtsi | - 内核 .config - lsmod 输出 |
| GPIO/Pinctrl 问题 | - dmesg(pinctrl 相关) - /sys/kernel/debug/gpio | - pinctrl 驱动源码(如需分析) | -必须:<platform>-pinctrl.dtsi-必须:使用该 GPIO 的节点配置 | - 硬件原理图(如有) - GPIO 状态输出 |
| 时钟/电源问题 | - dmesg(clk/regulator 相关) - /sys/kernel/debug/clk/clk_summary | - 时钟/电源驱动源码 | -必须:<platform>-regulators.dtsi-必须:使用电源的设备节点 | - clk_summary 输出 - regulator_summary |
| Display 问题 | -必须:dmesg(drm/mdss 相关) - logcat(SurfaceFlinger) | - Display HAL 实现 - Composer HAL 代码 | -必须:display-devicetree/display/<platform>-display.dtsi- 可选:panel dtsi | -dumpsys SurfaceFlinger- lshal 输出 |
| Audio 问题 | - dmesg(sound/asoc 相关) - logcat(AudioFlinger) - logcat(Audio HAL) | -必须:Audio HAL 实现 - audio_policy_configuration.xml - mixer_paths.xml | -必须:audio-devicetree/<platform>-audio.dtsi- 可选:codec dtsi | -dumpsys media.audio_flinger- tinymix输出- ACDB 文件路径 |
| Camera 问题 | - dmesg(camera 驱动) - logcat(Camera HAL) - logcat(CameraService) | -必须:Camera HAL 实现 - Camera provider 代码 - Sensor 配置文件 | -必须:camera-devicetree/<platform>-camera.dtsi-必须:sensor dtsi | -dumpsys media.camera- /dev/video*节点- lshalcamera 部分 |
| USB 问题 | -必须:dmesg(usb/dwc3/qusb 相关) - /sys/kernel/debug/usb/* | - USB 驱动源码(如分析 PHY) - USB HAL 实现(功能层) | -必须:<platform>-usb.dtsi-必须:USB 相关 pinctrl - 可选:USB PHY 节点 | -lsusb输出- /proc/interrupts(USB IRQ)- dumpsys usb |
| Bluetooth 问题 | - dmesg(bluetooth/hci 相关) - logcat(bluetooth) | - Bluetooth HAL 实现 - HCI 配置文件 | -必须:bt-devicetree/<platform>-bt.dtsi | -hciconfig- hcidump- lshalbluetooth 部分 |
| WLAN 问题 | - dmesg(wlan/wifi 相关) - logcat(wifi) | - WLAN HAL 实现 - wifi firmware 路径 | -必须:wlan-devicetree/<platform>-wlan.dtsi | -iw dev- wpa_cli status- /proc/net/wireless |
| Sensor 问题 | - logcat(Sensor HAL) - dmesg(sensor 驱动) | -必须:Sensor HAL 实现 - Sensor 配置文件(JSON) | - Sensor I2C/SPI 节点配置 | -dumpsys sensorservice- Sensor 校准数据 |
| GPU 问题 | - dmesg(kgsl/adreno) - logcat(hwcomposer) | - GPU HAL 实现 - Gralloc 实现 | -必须:graphics-devicetree/gpu/<platform>-gpu.dtsi | -/sys/class/kgsl/- GPU 性能数据 |
| Video 编解码问题 | - dmesg(venus/vidc) - logcat(omx/codec2) | - Video HAL 实现 - OMX/Codec2 组件 | -必须:video-devicetree/<platform>-video.dtsi | -dumpsys media.codec- Video capability 查询 |
| SELinux 问题 | -必须:avc denials(dmesg+logcat) - getenforce 输出 | -必须:相关的 .te 策略文件 - file_contexts - service_contexts | - 不涉及 | -ps -Z(进程上下文)- ls -Z(文件上下文) |
| Init 服务问题 | - logcat(init 相关) - getprop(服务状态) | -必须:.rc 服务定义文件 - 服务的可执行文件 | - 不涉及 | -getprop | grep init.svc- 服务依赖库 |
| Binder 问题 | - logcat(binder 错误) - /sys/kernel/debug/binder/stats | - AIDL/HIDL 接口定义 - Binder 服务实现 | - 不涉及 | - Binder transactions - failed_transaction_log |
| 内存问题(OOM/泄漏) | - logcat(lowmemorykiller) - dmesg(oom 相关) | - 可疑进程的源码(如分析泄漏) | - CMA 配置(如 CMA 问题) | -必须:dumpsys meminfo- heap dump - Perfetto trace |
| 性能问题(卡顿/ANR) | - logcat(ANR) - /data/anr/ 文件 | - 性能瓶颈点的源码 | - CPU/调度相关配置 | -必须:Perfetto trace - top 输出 - systrace |
| Thermal 问题 | - dmesg(thermal 相关) - /sys/class/thermal/ | - Thermal HAL 实现 - thermal-engine 配置 | -必须:<platform>-thermal.dtsi | - 温度读数 - CPU 频率变化 |
设备树文件提供指南
由于设备树是模块化的,提