如何修复 Android Widget 的“进程错误”错误?

Posted

技术标签:

【中文标题】如何修复 Android Widget 的“进程错误”错误?【英文标题】:How to fix "process is bad" error for an 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 我在发布您的代码时遇到了同样的问题 【参考方案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" 属性添加到清单中的应用程序元素...

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

维奥拉!现在为我工作!

编辑:匹配 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);

【讨论】:

以上是关于如何修复 Android Widget 的“进程错误”错误?的主要内容,如果未能解决你的问题,请参考以下文章

找不到 android.support.design.widget 类

Gridview v7 对旧 api android.support.v7.widget.Gridlayout 的支持未能实例化

检索项目的父项时出错:找不到与给定名称“android:Widget.Material.Spinner.Underlined”匹配的资源[重复]

Android:如何在 Widget [Remote Views] 中使用自定义视图

如何从右到左设计android.support.design.widget.NavigationView?

如何通知 Android Widget 重绘