Android 包管理器因 TransactionTooLargeException 而死

标签 android exception transactions android-package-managers

我的应用程序读取所有已安装 APK 文件的列表,然后循环遍历列表以读取 APK 信息,但它会抛出 TransactionTooLargeException 异常。

根据我在这里阅读的内容 http://developer.android.com/reference/android/os/TransactionTooLargeException.html ,谷歌建议将大交易分解成更小的交易。然而,这似乎发生在循环遍历 APK 列表时的中间。如果我捕获异常并继续它,其余的一切正常。有没有办法在调用 getPackageInfo 时减少内存使用量?即使在它已经返回之后,该调用是否还有一些东西。

这是发生时的痕迹:

at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:89)
at com.myapp.appreader.getAppDetails(Appreader.java:207)
at com.myapp.appreader.collectData(Appreader.java:99)
at com.myapp.appreader.AppDataCollectionTask.run(AppDataCollectionTask.java:26)
at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.executeTask(AppDataTaskExecutor.java:439) 
at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.doInBackground(AppDataTaskExecutor.java:327)
at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.doInBackground(AppDataTaskExecutor.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)\nCaused by: android.os.TransactionTooLargeExceptionat android.os.BinderProxy.transact(Native Method)
at android.content.pm.IPackageManager$Stub$Proxy.getPackageInfo(IPackageManager.java:1538)
at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:84)

最佳答案

Binder 事务有 1MB 的限制,这意味着大多数 IPC 调用的大小必须适中。

如果您在从 PackageManager(例如,getPackageInfo())检索数据时遇到 TransactionTooLargeException 或类似的 Binder 故障,请尝试拆分您的请求通过多次调用,每次调用的标志(例如,GET_META_DATA)更少。希望这会将任何单个事务的大小减少到 1MB 限制以下。

此外,如果您正在使用返回多个结果的 PackageManager 调用(例如,getInstalledPackages(),请尝试请求 no 标记该调用,然后分别检索每个包的值,以避免一次获取大量条目的大量数据。

当然,只使用您需要的标志,尤其是当您的调用可能包含一些标志时。 GET_META_DATA 是一个典型的例子:许多应用程序都使用它(例如,用于 Play 服务),但如果您不需要知道元数据信息,就不要请求它。

关于Android 包管理器因 TransactionTooLargeException 而死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24253976/

相关文章:

python - 在各种游标/连接上使用 BEGIN TRANSACTION/ROLLBACK/COMMIT

javascript - 如何使用 android 在 webview 中播放视频?

android - 无法以编程方式授予 SET_ANIMATION_SCALE 权限

android - 自定义 attr 获取颜色返回无效值

c++ - 影响和异常(exception)

java - 在java中应该如何更好地处理这个异常?

iphone - 重新启动应用程序时出现异常 SIGKILL

database - 读锁和写锁

java - Spring + TestNG 不事务回滚

java - 检测连接是否失败 - Java Android