Android包pipe理器已经因为TransactionTooLargeException而死亡

我的应用程序读取所有安装的APK文件的列表,然后遍历列表读取APK信息,但是它引发了一个TransactionTooLargeExceptionexception

从我在这里阅读的http://developer.android.com/reference/android/os/TransactionTooLargeException.html ,谷歌build议将大型交易分成较小的交易。 不过,在循环浏览APK列表时,似乎发生在中间。 如果我发现exception并继续,其余的都可以正常工作。 有没有一种方法来减less内存使用量,同时调用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) 

Solutions Collecting From Web of "Android包pipe理器已经因为TransactionTooLargeException而死亡"

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

如果在从PackageManager检索数据(如getPackageInfo() )时遇到TransactionTooLargeException或类似的Binder失败,请尝试将请求分割为多个调用,每个调用的标志(例如, GET_META_DATA )较less。 希望这可以将任何单个交易的规模降低到1MB的限制以内。

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

而且,当然,只使用你需要的标志,特别是如果你的电话可能包含一些。 GET_META_DATA就是一个典型的例子:许多应用程序都使用它(例如Play服务),但是如果你不需要知道元数据信息,就不要求它。

我find了解决这个问题的方法,并在这里发布。

简而言之,它find已安装的应用程序的封面名称(使用ADB),然后逐一获取有关每个应用程序的信息。