02-26 01:09:55.133 1000 2501 1451 E ActivityManager: ANR in com.android.bluetooth 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: PID: 30454 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: Reason: executing service com.android.bluetooth/.avrcpcontroller.BluetoothMediaBrowserService, waited 20774ms .. .... 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: ----- Output from /proc/pressure/memory ----- .. .... 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: CPU usage from 31534ms to -208ms ago (2025-02-26 01:09:19.619 to 2025-02-26 01:09:51.362): 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 128% 2501/system_server: 37% user + 90% kernel / faults: 389915 minor 61702 major 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 12% 2517/HeapTaskDaemon: 2.4% user + 9.6% kernel 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 5.1% 2860/BpfClientLib: 0% user + 5% kernel 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 4.6% 3613/binder:2501_D: 2.5% user + 2.1% kernel 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 4% 2527/android.bg: 0.4% user + 3.6% kernel 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 3.6% 2523/binder:2501_2: 1.6% user + 2% kernel .. .... .. .... 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 72% 103/kswapd0: 0% user + 72% kernel 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 32% 26571/com.android.chrome: 14% user + 18% kernel / faults: 159699 minor 17449 major 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 14% 26571/.android.chrome: 5.5% user + 9.3% kernel .. .... 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 23% 899/logd: 6.2% user + 17% kernel / faults: 7375 minor 3809 major 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 7.7% 907/logd.writer: 2.8% user + 4.8% kernel 02-26 01:09:55.133 1000 2501 1451 E ActivityManager: 3.2% 1908/logd.reader.per: 0
时间: 2025-07-09 18:55:49 浏览: 10
<think>好的,我现在需要解决用户提出的Android蓝牙服务ANR问题,具体是BluetoothMediaBrowserService出现ANR,系统日志显示system_server高CPU占用,还有logd和kswapd0进程活跃。首先,我需要理解ANR的产生机制。ANR通常是因为主线程被阻塞超过5秒,而这里用户提到waited 20774ms,明显超过了阈值,导致应用无响应。
接下来,用户提供的引用内容提到ANR发生时的CPU占用情况,特别是系统态(kernel)占用高,可能涉及线程上下文切换、系统调用或IO等待。引用[1]指出iowait过高可能由文件读写或内存紧张引起,而引用[2]提到系统态CPU开销大时,用户态资源不足。结合用户的日志,system_server高占用可能意味着系统服务在处理蓝牙相关任务时遇到瓶颈,或者有频繁的上下文切换。
然后,分析相关进程:logd是日志守护进程,如果它占用高CPU,可能说明系统正在大量记录日志,这本身可能加剧资源竞争。kswapd0是内存管理相关的进程,负责页面交换,频繁活动可能暗示内存不足,导致系统频繁进行内存回收(这可能引起iowait升高,因为swap操作涉及磁盘IO)。这种情况下,内存压力可能导致蓝牙服务无法及时获取资源,从而阻塞主线程。
BluetoothMediaBrowserService的ANR可能原因有几个方向:
1. **主线程阻塞**:服务中的主线程执行耗时操作,如同步数据库查询、大量数据处理等,导致无法响应。
2. **系统资源争抢**:system_server的高CPU占用可能与其他系统服务或进程竞争资源,导致蓝牙服务无法及时调度。
3. **内存压力**:kswapd0活跃说明可能存在内存不足,触发频繁的页面交换,进而增加IO等待时间,间接影响主线程响应。
4. **死锁或同步问题**:蓝牙服务与其他组件(如MediaBrowserService)交互时可能出现死锁,或未正确使用线程同步机制。
5. **第三方应用或服务干扰**:其他应用可能滥用蓝牙API,导致系统服务负载过高。
解决方案需要分步骤排查:
- **检查主线程耗时操作**:审查BluetoothMediaBrowserService的代码,确保主线程没有进行网络请求、复杂计算或同步IO操作。
- **分析CPU使用情况**:使用systrace或Perfetto工具捕捉ANR期间的CPU状态,观察system_server的线程活动,特别是与蓝牙相关的系统服务线程是否处于繁忙状态。
- **内存分析**:检查内存使用情况,使用dumpsys meminfo查看各进程的内存占用,确认是否存在内存泄漏或过度消耗。
- **IO等待分析**:如果iowait高,需检查存储性能,是否有大量日志写入(logd活跃可能与此相关),考虑限制日志输出或优化存储访问。
- **系统日志分析**:查看ANR发生时的trace文件(如/data/anr/traces.txt),确定阻塞的主线程堆栈,找到具体的阻塞点。
- **更新或降级蓝牙相关服务**:检查是否有系统更新或第三方应用更新引入了兼容性问题,尝试回滚或应用补丁。
此外,用户提到的logd和kswapd0高占用可能需要针对性处理:
- **logd优化**:减少不必要的日志输出,尤其在发布版本中关闭调试日志,避免logd持续占用CPU。
- **内存优化**:优化应用内存使用,减少内存泄漏,避免触发kswapd0频繁活动。使用工具如LeakCanary检测内存泄漏。
- **并发和线程管理**:确保蓝牙服务使用后台线程处理耗时任务,主线程仅处理UI和生命周期管理。
最后,验证解决方案后,需进行压力测试,模拟高负载场景,确保ANR不再复现。</think>### Android BluetoothMediaBrowserService ANR原因及解决方案
#### 原因分析
1. **主线程阻塞**
`BluetoothMediaBrowserService` 的主线程可能因执行耗时操作(如同步数据库查询、复杂数据处理)导致无法响应输入事件,触发ANR[^1]。
2. **系统资源争抢**
- `system_server` 高CPU占用可能由以下原因导致:
- 蓝牙服务与其他系统服务(如媒体播放、设备发现)竞争资源,导致线程调度延迟。
- 频繁的**线程上下文切换**或**系统调用**,使CPU在“系统态”运行时间过长,用户态资源不足[^2]。
- `logd` 高CPU占用可能因大量日志写入,加剧资源争抢。
3. **内存压力与IO瓶颈**
- `kswapd0` 进程活跃表明系统存在内存不足,触发频繁的**页面交换**(swap),导致:
- 高`iowait`(磁盘IO等待),进一步阻塞线程执行。
- 蓝牙服务因内存资源紧张无法及时获取所需资源[^1]。
4. **死锁或同步问题**
蓝牙服务与媒体浏览器服务(`MediaBrowserService`)交互时,若未正确管理线程同步,可能引发死锁或长时间阻塞。
---
#### 解决方案
##### 1. 定位主线程阻塞点
- **检查ANR日志**:
获取 `/data/anr/anr_*` 文件,分析 `BluetoothMediaBrowserService` 主线程堆栈,确认阻塞点(如锁竞争、IO操作等)。
- **代码审查**:
确保主线程中无以下操作:
```java
// 错误示例:主线程同步执行耗时操作
public void onLoadItem(String id) {
Item item = fetchItemFromRemoteServer(id); // 同步网络请求
// ...
}
```
##### 2. 优化系统资源占用
- **降低`system_server`负载**:
- 使用 `systrace` 分析系统服务线程:
```bash
python systrace.py sched freq idle am wm gfx view binder_driver hal res dalvik
```
- 检查蓝牙相关服务(如 `BluetoothManagerService`)是否因频繁广播或设备扫描导致CPU过载。
- **限制`logd`日志输出**:
通过 `adb shell setprop log.tag.<TAG> VERBOSE` 降低非关键日志级别,减少日志量。
##### 3. 缓解内存压力
- **分析内存使用**:
```bash
adb shell dumpsys meminfo <package_name>
```
重点关注 `Native Heap` 或 `PSS` 异常增长,排查内存泄漏。
- **优化内存分配**:
避免在蓝牙服务中频繁创建大型对象(如位图、媒体数据缓存),改用对象池或分块加载。
##### 4. 优化线程与并发
- **使用异步任务**:
将媒体数据加载、设备发现等操作移至后台线程:
```java
// 正确示例:使用AsyncTask或协程
private class LoadItemTask extends AsyncTask<String, Void, Item> {
protected Item doInBackground(String... ids) {
return fetchItemFromRemoteServer(ids[0]);
}
protected void onPostExecute(Item item) {
// 更新UI
}
}
```
- **减少同步锁竞争**:
检查 `BluetoothMediaBrowserService` 中同步代码块(如 `synchronized`),替换为并发容器(如 `ConcurrentHashMap`)。
##### 5. 硬件与驱动排查
- **检查蓝牙芯片驱动**:
部分ANR由蓝牙固件缺陷引起,尝试更新系统或厂商提供的驱动补丁。
- **禁用第三方干扰**:
进入安全模式,测试是否因第三方应用(如省电工具、蓝牙助手)导致资源争抢。
---
#### 验证与监控
1. **压力测试**:
使用自动化工具(如 `Monkey`)模拟高负载场景:
```bash
adb shell monkey -p <package> -v 1000
```
2. **持续监控**:
部署性能监控工具(如 `Android Profiler`),实时跟踪CPU、内存、IO指标。
---
阅读全文
相关推荐



















