繁体   English   中英

Android 中的捆绑包有限制吗?

[英]Is there any limit of bundle in Android?

我想知道android bundle的数据大小是否有上限。 我尝试按大小 > 80k 的包发布数据,并抛出 android 致命异常。数据是可序列化的。

这取决于捆绑包的用途。 捆绑包本身仅受内存量的限制。

捆绑包的两个主要用途是使用意图在组件之间传递信息和保存活动的状态。

1. 意图/绑定器

当用于在 Android 组件之间传递信息时,bundle 被序列化为绑定事务。 一个进程中所有绑定器事务的总大小为 1MB。 如果超过此限制,您将收到此致命错误“!!! FAILED BINDER TRANSACTION !!!”

建议您将这些包中的数据保持得尽可能小,因为它是一个共享缓冲区,任何大于几千字节的内容都应写入磁盘。

参考: https : //android.googlesource.com/platform/frameworks/base/+/jb-release/core/jni/android_util_Binder.cpp

ALOGE("!!! FAILED BINDER TRANSACTION !!!");
        // TransactionTooLargeException is a checked exception, only throw from certain methods.
        // FIXME: Transaction too large is the most common reason for FAILED_TRANSACTION
        //        but it is not the only one.  The Binder driver can return BR_FAILED_REPLY
        //        for other reasons also, such as if the transaction is malformed or
        //        refers to an FD that has been closed.  We should change the driver
        //        to enable us to distinguish these cases in the future.

参考: http : //developer.android.com/reference/android/os/TransactionTooLargeException.html

Binder 事务缓冲区有一个有限的固定大小,当前为 1Mb,由进程的所有正在进行的事务共享。 因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也会抛出此异常。

2. 保存的实例状态(Activity onSaveInstanceState、onPause 等)

我发现我可以在用于保存 Activity 状态的包中存储的大小没有限制。 我做了一些测试,在我收到内存不足异常试图分配我试图保存的数据之前,可以成功存储大约 175mb。

更新:这项研究是在 2014 年进行的,新版本的 Android 可能会因超过 500kb 的包而崩溃

我认为限制是 500kb。 您可以将传递的对象保存在文件中,并在包中发送文件的路径。 您可以查看我在SO提出的类似问题

Binder 事务缓冲区有一个有限的固定大小,目前为1MB ,它由进程中所有正在进行的事务共享。 由于此限制是在进程级别而不是每个活动级别,因此这些事务包括应用程序中的所有绑定事务,例如 onSaveInstanceState、startActivity 以及与系统的任何交互。 当超出大小限制时,将引发 TransactionTooLargeException。

对于savedInstanceState 的特定情况,数据量应该保持较小,因为只要用户可以导航回该活动(即使该活动的进程被终止),系统进程就需要保留提供的数据。 我们建议您将保存的状态保持在少于50k的数据。

Parcelable 和捆绑

是的,现在在 android Nougat 中,如果您大致超过限制(500Kb),它将崩溃。

安卓牛轧糖问题

是的,它有 1MB 的限制。

您可以使用Singleton类来传递数据。

根据Google Android API ,日期应小于 50K。

我认为最大的包大小是 1024 KiloBytes。 为了在活动之间传输大对象,您应该尝试其他方式(内存缓存、本地存储等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM