【问题标题】:How to fix "process is bad" error for an Android Widget?如何修复 Android Widget 的“进程错误”错误?
【发布时间】:2011-03-16 06:49:15
【问题描述】:

我开发了一个 Android Widget,它运行良好。我添加了一些额外的功能,并通过 Android Market 推送了更新。现在人们抱怨它不再起作用了。

我在日志中看到的错误是:

07-14 10:33:44.016: WARN/ActivityManager(78): Unable to launch app ... 
for broadcast Intent { act=android.appwidget.action.APPWIDGET_ENABLED 
cmp=... }: process is bad 
07-14 10:33:44.026: WARN/ActivityManager(78): finishReceiver called 
but none active 
07-14 10:33:44.026: WARN/ActivityManager(78): Unable to launch app ... 
for broadcast Intent { act=android.appwidget.action.APPWIDGET_UPDATE 
cmp=... (has extras) }: process is bad 
07-14 10:33:44.036: WARN/ActivityManager(78): finishReceiver called 
but none active 

我已经搜索过,但我无法在任何地方找到 process is bad 错误的含义,所以我不知道如何修复它。 重新启动手机(或模拟器)会使错误消失,但是,这不是我希望我的用户做的事情。 有人可以帮我解释错误的原因是什么以及如何解决它吗?

【问题讨论】:

  • 有趣,我也见过几次。将关注答案,感谢您的提问;)
  • 嗨 11689466196137005894161 我在发布您的代码时遇到了同样的问题

标签: android android-widget


【解决方案1】:

当我的 BroadcastReceiver 反复泄漏导致系统终止我的应用程序的异常时发生在我身上。 对接收者的下一次调用将导致“进程错误”日志。

在我的例子中,解决方案是确保 BroadcastReceiver 没有异常泄漏。

这些是应用程序被杀死时的日志(尝试查找它们并找到原因):

W/ActivityManager﹕ Process com.company.app has crashed too many times: killing!
I/ActivityManager﹕ Killing proc 9344:com.company.app/u0a10239: crash

【讨论】:

  • “泄漏异常”是什么意思?
  • 未能在 try-catch 块中处理它(或阻止它被抛出)。
【解决方案2】:

我遇到了同样的问题,我目前的理论是 appWidget 崩溃了,当它重新启动时,它具有相同的错误持久数据,导致每次重新启动时都会崩溃。当这种情况经常发生时,appWidget 会被操作系统“强制停止”。我的创可贴是有一个触摸事件是“setOnClickPending”,用户将触摸它(必要时出于沮丧),并将在 appWidget 内部处理并重置 appWidget。

【讨论】:

  • 在我的情况下这并没有成功。对我来说,它似乎需要卸载应用程序,重新启动手机,然后重新安装。
【解决方案3】:

我刚刚在为市场包装之前亲身体验了这一点。我遵循指南并将 android:label="@string/app_name" 属性添加到清单中的应用程序元素...

  1. 卸载您的应用
  2. 重启手机/模拟器
  3. 不带此属性推送新应用

维奥拉!现在为我工作!

编辑:匹配 cmets。

【讨论】:

  • 你提到的这个修复甚至是不可能的。如果我尝试这样做,我会得到一个无效的 XML 文件...
  • 我的清单文件如下所示(并且是有效的 XML):
  • 你现在写的是真的。但是在您提到的第一篇文章中: android:NAME="@string/app_name" 这是无效的。现在你说标签而不是名称。我的 XML 已经包含 android:label="@string/app_name"
  • 我今天遇到了同样的问题。昨晚我的小部件工作正常,然后我添加了一些在 onUpdate 或 onEnabled 事件处理程序中引发异常的内容,突然间甚至添加了一些尝试/捕获,我无法再启动小部件。卸载并重启手机解决了这个问题,让我的开发重回正轨。
  • 您有任何理由相信是属性更改而不是重新启动修复了错误吗?许多其他用户报告此随机错误可以通过重新启动来清除(显然)。
【解决方案4】:

从我的 AndroidManifest.xml 中删除 INTERNET 权限后,我在 HTC Sensation OS 2.3.4 上遇到了 process is bad 错误。

W/ActivityManager(253):无法启动应用程序 MY_DOMAIN.flashback/10132 用于广播 Intent { act=android.intent.action.PHONE_STATE flg=0x20000000(有附加功能)}: 过程很糟糕

我仔细尝试了很多不同的解决方法,我发现唯一的解决方法是:

  • 通过设置 -> 应用程序卸载应用程序。
  • 从手机中取出电池(使用 Android 的“关机”菜单不起作用)。
  • 再次开启设备。
  • 使用adb install <myapp>再次安装APK。

我想借此机会列出对我有用的地方(因为似乎有很多关于如何修复此错误的 FUD):

  • 卸载应用,使用 Android 手机菜单重启(按住开机键并选择“关机”),再次开机,重新安装。
  • 卸载,使用adb kill-server,然后adb start-server,重新安装。
  • 卸载,运行adb shell,然后运行ps,这根本没有显示我的应用正在运行。
  • 卸载,在 Eclipse 中进行干净构建,然后重新安装。

我想知道根本问题是否是由于我的应用程序变小造成的。我认为它曾经在设备上解压到flashback-1.apkflashback-2.apk,而现在它只解压到单个flashback-1.apk

【讨论】:

    【解决方案5】:

    我只是得到这个错误。 我修复了错误并删除了一些从OnConnectionReceiver.onReceiver() 调用的源代码,也许调用会花费一些时间。

    【讨论】:

      【解决方案6】:

      我遇到了这个问题。原因是 WLAN 调用 wifi.getConnectionInfo().getScanResults();在某些情况下可能会返回 null 而不是空列表。我在记录 logcat 几个小时后发现了这一点。当应用程序遇到错误并崩溃时,触摸小部件会给我您在此处提到的相同“错误进程”错误,因为意图没有重新打开应用程序,但它陷入崩溃状态。猜猜它就是 Android 处理崩溃小部件的方式。

      【讨论】:

        【解决方案7】:

        “进程错误”是由于应用程序(或 BroadcastReceiver、Service 或其他组件)多次崩溃造成的。在其中一些之后,系统决定它厌倦了这种行为并阻止该过程再次启动。

        重启会清除崩溃计数,但也可以通过终止系统服务器来清除:

        adb shell killall system_server
        

        这将有效地执行“软重启”。我发现它比实际重启要快得多。

        【讨论】:

          【解决方案8】:

          我是这样修好的:

          卸载应用程序并重新安装。

          当我安装了一个具有相同包名的“测试”应用程序并在应用程序缓存数据或某处搞砸了一些东西时,我收到了这个错误。

          【讨论】:

          • 有时它为我解决了问题,有时却没有。
          【解决方案9】:

          我遇到了类似的问题。当我浏览我的代码时,我意识到这是罪魁祸首的默认值。确保您的默认值是合乎逻辑的和积极的。例如,如果您有一个以特定时间间隔启动的后台服务,请确保您为其设置的默认值是合适的。

          【讨论】:

            【解决方案10】:

            对我来说,问题也与 XML 有关——特别是我有一个 TextView 元素,它没有指定 layout_width 和 layout_height,因为它们继承了不包含它们的样式。我的styles.xml 文件没有被eclipse 验证。当我运行应用程序时,我得到了必须指定这些视图的错误——当我修复错误时,我收到了process is bad 错误,并且不得不强制退出。

            不幸的是,我认为保留了一些设置,因此修复后重建应用程序还不够。我不得不卸载该应用程序——重新启动手机(以消除一些持久性数据),当我重新安装时,我从错误中恢复。

            【讨论】:

              【解决方案11】:

              有点离题,但在某些 Android 设备中,通过编写一个应用程序,该应用程序在 onCreate 中创建一个 UncaughtExceptionHandler 以在崩溃后重新启动应用程序,然后执行某些操作导致未处理的异常,可以重现地导致此故障(要么抛出RuntimeException,要么做一些导致NullPointerException的事情,或者其他)。下面给出了一些示例代码。

              我已在两台设备上尝试过此操作:三星 Galaxy Tab 2 和 Verizon Ellipsis 7。使用 Tab 2,当我从 Eclipse 运行应用程序时,我无法引起问题 - 它会崩溃并重新启动反复,永不被杀。相反,我不得不将应用程序导出到 apk,通过 adb 安装,启动应用程序,在 4-8 次崩溃并重新启动后,Android 将终止应用程序并显示上述错误消息 (Process com.buggy.app has crashed too many times: killing!)。

              使用 Ellipsis 7,我永远无法重现该问题。有问题的应用程序会反复崩溃并重新启动,即使在 10 分钟后操作系统也不会杀死它。

              重复崩溃应用的示例代码:

              public void onCreate(Bundle savedInstanceState) {
                mContext = this.getApplicationContext();
              
                UncaughtExceptionHandler uehandler = new Thread.UncaughtExceptionHandler() {
              
                  @Override
                  public void uncaughtException(Thread thread, Throwable ex) {
              
                    // restart app after 100 milliseconds
                    PendingIntent myActivity = PendingIntent.getActivity(mContext, 0,
                        new Intent(mContext, MyActivity.class),
                        PendingIntent.FLAG_ONE_SHOT);
                    AlarmManager alarmManager = (AlarmManager) 
                        mContext.getSystemService(Context.ALARM_SERVICE);
                    alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 100,
                        myActivity);
              
                    System.exit(2);
              
                    // re-throw critical exception further to the os (important)
                    Thread.getDefaultUncaughtExceptionHandler().uncaughtException(thread, ex);
                  }
                };
                Thread.setDefaultUncaughtExceptionHandler(uehandler);
              
                throw new RuntimeException("Crash the app!");
              }
              

              【讨论】:

                【解决方案12】:

                我遇到了同样的问题。我到了重新启动和重新安装应用程序并没有解决问题的地步。我很沮丧。我从扩展 AppWidgetProvider 的类中删除了所有内容,并在其中仅使用两个空方法运行应用程序:onUpdate 和 onReceive。终于解决了问题。

                也许它不会解决你的问题,但谁知道呢。试试看吧。

                【讨论】:

                  【解决方案13】:

                  这对我有用! 将您的隐式意图更改为显式意图,因为启动 Oreo 隐式意图不会在后台运行! 所以基本上在创建 Intent 对象时,传入你想要启动的类名。 https://developer.android.com/about/versions/oreo/background.html

                  【讨论】:

                    【解决方案14】:

                    我的项目遇到了同样的问题。我认为值得指出的是,我可以通过从 Eclipse 中的代码中删除一些新行来神奇地解决这个问题。例如,我更改了以下代码,

                    Intent clickIntent = new Intent(this.getApplicationContext(),
                    MyWidgetProvider.class);
                    

                    Intent clickIntent = new Intent(this.getApplicationContext(),MyWidgetProvider.class);
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-11-07
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多