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

50

我开发了一个Android小部件,一切正常,然后我添加了一些额外的功能,并通过Android市场推送了更新。现在人们抱怨它不再工作。

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

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 error"是什么意思的地方,所以我不知道该如何修复它。重新启动手机(或模拟器)可以让错误消失,但这不是我想让用户做的。 请问有人能帮我解释一下这个错误的原因并告诉我如何修复吗?


1
有趣,我也见过几次。会留意答案的,谢谢提问 ;) - dimsuz
嗨,11689466196137005894161,我遇到了同样的问题,请发布你的代码。 - Jorgesys
14个回答

10

当我的BroadcastReceiver重复泄漏异常导致系统杀死我的应用程序时,这发生在我身上。接收器的下一次调用将导致“进程已终止”的日志。

在我的情况下,解决方案是确保没有异常从BroadcastReceiver泄漏出来。

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

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

“泄漏异常”是什么意思? - Marian Paździoch
未能在try-catch块中处理它(或防止其被抛出)。 - Victor Basso

9

我遇到了同样的问题,我的当前理论是该appWidget崩溃了,当它重新启动时,它仍然具有相同的坏持久数据,每次重新启动都会导致崩溃。当这种情况发生得太频繁时,操作系统会“强制停止”appWidget。我的临时解决办法是设置一个“setOnClickPending”触摸事件,用户将会触摸它(如有必要,出于挫败感),并且该事件将在appWidget内部处理并重置appWidget。


1
在我的情况下,那并没有起作用。对我来说似乎需要卸载应用,重新启动手机,然后重新安装。 - Tom

8

就在我准备上架应用市场之前,我自己也遇到了这个问题。我按照指南在清单文件的应用程序元素中添加了android:label="@string/app_name"属性...

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

完成!现在可以正常工作了!

编辑:为了匹配注释。


你提到的这个修复措施根本不可能。 如果我尝试这样做,会得到一个无效的XML文件... - wligtenberg
我的清单文件看起来像这样(并且是有效的XML):<application android:icon="@drawable/icon" android:label="@string/app_name"> - NPike
你现在写的是正确的。 但是在第一篇帖子中,你提到了: android:NAME="@string/app_name" 这是无效的。现在你说标签而不是名称。 我的XML已经包含了android:label="@string/app_name"。 - wligtenberg
今天我遇到了同样的问题。昨晚我的小部件还能正常工作,但是我添加了一些东西,在onUpdate或onEnabled事件处理程序中抛出了异常,突然间即使我添加了一些try/catch语句,我也无法启动小部件。卸载并重新启动手机解决了这个问题,并让我的开发回到了正轨。 - patthoyts
14
你有没有理由相信是属性更改而不是重新启动解决了错误?许多其他用户报告说,这个随机错误可以通过重新启动来清除(显然)。 - Dave Sims
关于android:label="@string/app_name"属性:在我的小部件清单中,我有3个这样的属性,一个用于应用程序,另外两个用于每个接收器。昨天我花了几乎一整天的时间来仔细检查我的代码,今天大部分时间都在阅读SO线程并尝试不成功的事情,以解决“无法启动广播意图android.appwidget.action.APPWIDGET_ENABLED进程错误”的问题。在阅读了这个建议之后,我删除了所有3个属性,小部件完美地工作了。然后我逐个添加了所有3个属性,它仍然完美地工作。 - Mick

4

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

W/ActivityManager( 253): 无法启动应用程序MY_DOMAIN.flashback/10132,广播意图 { act=android.intent.action.PHONE_STATE flg=0x20000000 (has extras) }: 进程出错

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

  • 通过“设置” -> “应用程序”卸载应用程序。
  • 从手机中取出电池(使用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


2

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


2

"进程出问题"是由于应用程序(或广播接收器、服务或其他组件)多次崩溃。在多次崩溃后,系统决定已经受够了这种行为,并阻止该进程再次启动。

重新启动将清除崩溃计数,但也可以通过杀死系统服务器来清除:

"最初的回答"

adb shell killall system_server

这将有效地进行“软重启”。我觉得比实际的重启要快得多。最初的回答:这将有效地进行“软重启”。我觉得比实际的重启要快得多。

2

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


1

我是这样解决的:

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

当我安装一个与包名相同的“测试”应用程序并在应用程序缓存数据或其他地方弄乱时,我遇到了这个错误。


有时候它能解决我的问题,有时候却不能。 - Mitulát báti

0

有些与编程无关,但在某些安卓设备上,通过编写一个应用程序在onCreate中创建UncaughtExceptionHandler来重新启动应用程序以进行崩溃,并且然后执行一些操作来导致未处理的异常(引发RuntimeException或执行某些会导致NullPointerException的操作等)。以下是一些示例代码。

我已在两个设备上尝试过这种情况:三星Galaxy Tab 2和Verizon Ellipsis 7。对于Tab 2,在从Eclipse运行应用程序时,我无法导致此问题--它会崩溃并不停地重启,永远不会被杀死。相反,我必须将该应用程序导出为apk文件,通过adb进行安装,启动该应用程序,并在4-8次崩溃和重新启动后,安卓将使用上述错误消息杀死应用程序(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!");
}

0
对我来说,问题也与XML有关-具体而言,我有一个TextView元素,它没有指定layout_width和layout_height,因为它们继承了一个不包含它们的样式。我的styles.xml文件在eclipse中没有经过验证。当我运行应用程序时,我收到了这些视图必须指定的错误-当我修复错误后,我收到了“进程出错”的错误,并且不得不强制退出。
不幸的是,我认为一些设置被保留了,所以在修复后重建应用程序是不够的。我不得不卸载应用程序-重新启动手机(以消除某些持久数据),当我重新安装时,我从错误中恢复过来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接