解决“包管理器已死”RuntimeException
Posted
技术标签:
【中文标题】解决“包管理器已死”RuntimeException【英文标题】:Solving "Package manager has died" RuntimeException 【发布时间】:2014-08-02 19:06:13 【问题描述】:我有一个 android 应用程序,它应该列出设备上所有已安装的应用程序(无 root)。我已经尝试了PackageManager
的getInstalledApplications(0)
和getInstalledPackages(0)
方法,但是在某些显然安装了太多应用程序的设备上,我得到“包管理器已死”RuntimeException
(我通过错误收到它们Google Play 的报告服务)。这是由于众所周知的 Android 内部使用的 IPC 中每次调用 1MB 的限制。
如何解决这个问题?我不介意逐块请求长列表,但我没有看到任何方法。只有上述两种方法可用。
【问题讨论】:
哇,您的设备上有多少应用程序?无论如何,我认为每个通话 1MB 是每个正在进行的通话?那么,您是否还有其他 IPC 正在进行?比如 Content Provider 或 Intents?如果您有大量其他交易正在进行,那么此调用的限制会低得多。 那不是我的设备。这个应用程序在 Google Play 上发布,我收到了数千次安装。每周 1 次此类例外。我没有任何其他交易 - 只需致电getInstalledPackages(0)
。来自 Internet/Google 群组的 AFAIK,1MB 的限制是一次通话。
哇,那我没有什么可以帮助你的,但是如果它是一个 TransactionTooLarge 异常,从谷歌那个异常的页面上可以看出:Binder 事务缓冲区有一个有限的固定大小,当前为 1Mb,由该进程正在进行的所有事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也可能会引发此异常。
【参考方案1】:
自 Android 5.1 以来,该问题已得到修复。您可以在Androidissuetracker中找到详细信息。
【讨论】:
以上是关于解决“包管理器已死”RuntimeException的主要内容,如果未能解决你的问题,请参考以下文章