Unable to launch com.* for service Intent { cmp=com.*/.* }: process is bad

本文探讨了Android应用中后台进程因RuntimeException导致无法重启的问题。通过分析ActivityManagerService的源码,揭示了系统如何判断一个进程为bad process并阻止其重启。适合于Android开发者了解后台进程管理和异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最近的项目需要用到服务端收集客户端崩溃的详细异常log数据:

 

之前也做过,感觉很轻松,没想到遇到问题了,还纠结了半天:

 以下是关键log日志

05-04 20:28:42.409: W/ActivityManager(374): Process com.example.service has crashed too many times: killing!
05-04 20:28:42.409: I/ActivityManager(374): Killing proc 20556:com.example.service/u0a10080: crash
05-04 20:28:43.323: W/ActivityManager(374): Unable to launch app com.example.service/10080 for service Intent { cmp=com.example.service/.service.TestService }: process is bad

 

问题介绍:

a、带界面的应用,当应用拥有当前界面时发生RuntimeException,可以被alarm和BroadcastReceiver唤醒;

b、统计器后台运行:产生RuntimeException之后再也起不来了(不可以被alarm和BroadcastReceiver再次唤醒);

 

问题查找过程:

推荐一个在线查看源码的网站,很方便

http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/

 

1、 关键词搜索:process is bad

2、发现出处

 class: com.android.server.am.ActivityManagerService 
    method: private final ContentProviderHolder getContentProviderImpl(IApplicationThread caller,
        String name, IBinder token, boolean stable, int userId);

    具体位置:

   

ProcessRecord proc = startProcessLocked(cpi.processName,
        cpr.appInfo, false, 0, "content provider",
        new ComponentName(cpi.applicationInfo.packageName,
                cpi.name), false, false);
if (proc == null) {
    Slog.w(TAG, "Unable to launch app "
            + cpi.applicationInfo.packageName + "/"
            + cpi.applicationInfo.uid + " for provider "
            + name + ": process is bad");
    return null;
}

 

 

 

 

3、继续跟踪 com.android.server.am.ActivityManagerService 的 startProcessLocked ,原因就在里头;

    

 

 

原因:

参考:

 

	class :	com.android.server.am.ActivityManagerService
	method: final ProcessRecordstartProcessLocked(String processName,
			ApplicationInfo info, boolean knownToBeDead, int intentFlags,
			String hostingType, ComponentName hostingName,
			boolean allowWhileBooting, boolean isolated) {}

 
   程序发生RuntimeException,被crash掉,如果被重新起来,这个时候判断是否是后台应用,如果是后台应用则silently fail.

 

 

   关键代码:红色标记注释

 

	if (!isolated) {
    if ((intentFlags&Intent.FLAG_FROM_BACKGROUND) != 0) {
        // If we are in the background, then check to see if this process
        // is bad.  If so, we will just silently fail.
        if (mBadProcesses.get(info.processName, info.uid) != null) {
            if (DEBUG_PROCESSES) Slog.v(TAG, "Bad process: " + info.uid
                    + "/" + info.processName);
            return null;
        }
    } else {
        // When the user is explicitly starting a process, then clear its
        // crash count so that we won't make it bad until they see at
        // least one crash dialog again, and make the process good again
        // if it had been bad.
        if (DEBUG_PROCESSES) Slog.v(TAG, "Clearing bad process: " + info.uid
                + "/" + info.processName);
        mProcessCrashTimes.remove(info.processName, info.uid);
        if (mBadProcesses.get(info.processName, info.uid) != null) {
            EventLog.writeEvent(EventLogTags.AM_PROC_GOOD,
                    UserHandle.getUserId(info.uid), info.uid,
                    info.processName);
            mBadProcesses.remove(info.processName, info.uid);
            if (app != null) {
                app.bad = false;
            }
        }
    }

 

 

 

<think>好的,我现在需要解决用户提到的Android应用com.android.soundsettings因“process is bad”无法启动的问题。首先,用户提供了错误信息是“android broadcastqueue unable to launch app com.android.soundsettings process is bad”,我需要分析可能的原因和解决方法。 首先,我需要了解这个错误的具体含义。根据经验,“process is bad”通常指应用进程崩溃或无法正常启动,可能的原因包括应用缓存数据损坏、系统服务冲突、权限问题或系统文件损坏等。接下来,我应该分步骤提出解决方案,从简单到复杂逐步排除问题。 第一步通常是清除应用数据和缓存。用户可能已经尝试过,但需要确认是否执行正确。如果问题依旧,可能需要考虑系统缓存分区的问题,特别是对于系统应用来说,清除Dalvik/ART缓存可能有效。 接下来,检查系统更新和权限设置。系统更新可能修复已知的bug,而权限问题可能导致应用无法正常启动。如果这些步骤无效,可能需要更深入的排查,比如安全模式启动以排除第三方应用干扰,或者检查日志文件以获取详细错误信息。 如果软件方法无效,可能需要考虑硬件问题,但这种情况较为少见。最后,恢复出厂设置或刷机可以作为最后手段,但需提醒用户备份数据。 同时,用户提供的引用中提到了清除历史记录和反向HTTP shell的内容,可能与当前问题无关,但需注意是否用户设备存在安全风险,比如恶意软件导致系统服务异常。这可能是一个潜在原因,但需要进一步排查。 在生成相关问题部分,需要围绕用户的问题扩展,例如数据清除步骤、系统缓存清除方法、系统更新检查等,帮助用户全面理解问题。</think>### 解决Android应用com.android.soundsettings进程错误的方法 #### 问题分析 错误信息`BroadcastQueue: Unable to launch app com.android.soundsettings/ProcessRecord{...}: process is bad`表明系统尝试启动该应用时检测到进程状态异常。可能原因包括: 1. 应用缓存或数据损坏 2. 系统服务冲突 3. 权限配置错误 4. 系统文件损坏 5. 第三方应用干扰[^1] #### 分步解决方案 1. **清除应用数据与缓存** - 进入`设置 > 应用 > 查看所有应用` - 找到`SoundSettings`或`系统设置`(可能需要开启`显示系统进程`) - 依次执行: - `强制停止` - `存储 > 清除缓存` - `存储 > 清除数据` - 重启设备 2. **清除系统缓存分区** - 关机后进入Recovery模式(组合键因机型而异,常见为`电源+音量加`) - 选择`清除缓存分区` - 完成后重启 3. **检查系统更新** - 进入`设置 > 系统 > 系统更新` - 安装可用更新,可能包含错误修复 4. **安全模式排查** - 长按电源键进入关机菜单 - 长按`关机`选项进入安全模式 - 观察问题是否仍存在,若解决则需排查第三方应用 5. **检查权限配置** ```shell adb shell dumpsys package com.android.soundsettings ``` 查看输出中是否存在`permission denied`相关提示 6. **日志分析** ```shell adb logcat | grep -E "BroadcastQueue|SoundSettings" ``` 关注`FATAL EXCEPTION`或`Process is already crashed`等关键信息 7. **系统文件修复** ```shell adb shell cmd package bg-dexopt-job ``` 重新编译优化系统DEX文件 #### 极端情况处理 若上述方法无效: 1. 执行`恢复出厂设置`(提前备份数据) 2. 通过官方固件重新刷机 3. 检测硬件故障(存储芯片异常可能导致系统服务崩溃)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值