Android的程序包管理器与TransactionTooLargeException死亡 [英] Android Package manager has died with TransactionTooLargeException

查看:1508
本文介绍了Android的程序包管理器与TransactionTooLargeException死亡的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序读取所有已安装的APK文件的列表,然后通过列表读取APK信息循环,但它抛出一个TransactionTooLargeException例外。

这是我在这里读<一href="http://developer.android.com/reference/android/os/TransactionTooLargeException.html">http://developer.android.com/reference/android/os/TransactionTooLargeException.html,谷歌建议打破大交易分成较小的交易。然而,它似乎通过APK列表循环,当这种情况发生在中间。如果我捕获异常,继续吧,剩下的一切工作正常。有没有一种方法,以减少内存的使用,同时调用getPackageInfo?这是否呼叫保持一些东西,即使它已经回来了。

下面是跟踪,当它发生了:

 在android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:89)
在com.myapp.ap preader.getAppDetails(AP preader.java:207)
在com.myapp.ap preader.collectData(AP preader.java:99)
在com.myapp.ap preader.AppDataCollectionTask.run(AppDataCollectionTask.java:26)
在com.myapp.ap$p$pader.service.AppDataTaskExecutor$AppDataAsyncTask.executeTask(AppDataTaskExecutor.java:439)
在com.myapp.ap$p$pader.service.AppDataTaskExecutor$AppDataAsyncTask.doInBackground(AppDataTaskExecutor.java:327)
在com.myapp.ap$p$pader.service.AppDataTaskExecutor$AppDataAsyncTask.doInBackground(AppDataTaskExecutor.java:1)
在android.os.AsyncTask $ 2.call(AsyncTask.java:287)
在java.util.concurrent.FutureTask.run(FutureTask.java:234)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:573)
在java.lang.Thread.run(Thread.java:856)\由nCaused:android.os.TransactionTooLargeExceptionat android.os.BinderProxy.transact(本机方法)
在android.content.pm.IPackageManager $存根$ Proxy.getPackageInfo(IPackageManager.java:1538)
在android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:84)
 

解决方案

有一个活页夹的交易,这意味着大多数IPC调用一定要大小适中1MB的限制。

如果你打一个 TransactionTooLargeException 或检索从 PackageManager 数据时,类似粘合剂的故障(例如, getPackageInfo()),尝试分裂您的要求在多个电话,用更少的标志(例如, GET_META_DATA )每次通话。希望这将减少任何一笔交易的规模是根据1MB限制。

另外,如果你使用的是返回多个结果(例如, getInstalledPackages(),试试 PackageManager 通话询问的没有的上通话,然后检索值,每个包单独,避免了很多项获得了大量数据的一次。标志

和,当然,只使用你所需要的,特别是如果您的通话可能包含一些标志。 GET_META_DATA 就是一个典型的例子:许多应用程序使用它(例如,用于播放业务),但如果你不需要知道的元数据信息,不要请求

My app reads the list of all installed APK files, and then loop through the list to read the APK info, however it throws a TransactionTooLargeException exception.

From what I have read here http://developer.android.com/reference/android/os/TransactionTooLargeException.html, google recommends to break large transactions into smaller transactions. However it seems this happens in the middle when looping through the APK list. If I catch the exception and continue it, the rest all works fine. Is there a way to reduce the memory usage while calling the getPackageInfo? Does that call hold some thing even after it already returned.

Here is the trace when it happened:

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)

解决方案

There is a 1MB limit on a Binder transaction, which means most IPC invocations have to be modest in size.

If you hit a TransactionTooLargeException or similar Binder failures when retrieving data from PackageManager (e.g., getPackageInfo()), try splitting your request over multiple calls, with fewer flags (e.g., GET_META_DATA) per call. Hopefully this will reduce the size of any individual transaction to be under the 1MB limit.

Also, if you are using calls on PackageManager that return multiple results (e.g., getInstalledPackages(), try asking for no flags on that call, then retrieving the values for each package individually, to avoid getting a lot of data on a lot of entries at once.

And, of course, only use flags that you need, particularly if your call might contain some. GET_META_DATA is a classic example of that: many apps use it (e.g., for Play Services), but if you do not need to know the metadata information, don't request it.

这篇关于Android的程序包管理器与TransactionTooLargeException死亡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆