软件包管理器已崩溃。

13

我收到了一位用户的邮件,他安装了很多应用程序,当我的应用使用以下代码收集活动信息时,他遇到了问题:

getPackageManager().queryIntentActivities(mAinIntent, 0)

完整代码在此处:https://github.com/ligi/FAST

这就是发生的事情。

Caused by: java.lang.RuntimeException: Package manager has died
at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:479)
at org.ligi.fast.BaseAppGatherAsyncTask.doInBackground(BaseAppGatherAsyncTask.java:34)
at org.ligi.fast.BaseAppGatherAsyncTask.doInBackground(BaseAppGatherAsyncTask.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 5 more
Caused by: android.os.TransactionTooLargeExceptionTransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.content.pm.IPackageManager$Stub$Proxy.queryIntentActivities(IPackageManager.java:2230)
at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:473)
... 9 more
Log:
0 D: Writing unhandled exception to: /data/data/org.ligi.fast/files/3.7-1364933885194.tracedroid

看起来我遇到了一个问题,即超过了 1MB 的限制,但该如何摆脱呢?是否还有其他获取所需信息的方法?是否有一种将数据分块的方式?


1
这是一个错别字 TransactionTooLargeExceptionTransactionTooLargeException 吗?请参阅此链接 Binder 事务缓冲区具有固定的有限大小,目前为1Mb,该大小由进程中所有正在进行的事务共享。因此,即使大多数单个事务的大小适中,当有许多事务正在进行时,仍可能抛出此异常。 - t0mm13b
AppInfo 类,private BitmapDrawable icon; ... 它们是否占用了太多的内存?为什么你要从 AsyncTask 内部传递多个 Contexts 的副本? - t0mm13b
是的 - 看起来像是复制和粘贴错误 - 不知道为什么会重复。你看到解决这个问题的方法了吗? - ligi
问题在于,如果正在扫描所有应用程序,应用程序的图标大小会有所不同,这可能是原因,也许可以使用“弱引用”来处理位图?听起来像是需要优化“AppInfo”类... - t0mm13b
1
@t0mm13b,我同意@ligi的看法。我不明白调用queryIntentActivities时出现异常与绘图大小有任何关系。@ligi,很遗憾,我认为你可能没有什么希望了。PackageManager调用没有任何分页机制或其他类似机制。 - kabuko
显示剩余2条评论
1个回答

8

我一段时间前也遇到了同样的用户输入错误,尽管我的错误事件有所不同。最终,我捕获了异常并优雅地向用户报告,告知他们已经安装了太多能够处理 . 的应用程序。在我为一个项目进行数十万次安装中,我只偶然看到了不到五次这个错误,我知道这并不能成为借口,但某些设备就是没有足够的堆来处理索引每个安装在设备上的应用程序的意图。


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