Есть ли какие-то ограничения в комплекте Android? - PullRequest
14 голосов
/ 18 декабря 2011

Я хочу знать, есть ли верхний предел размера данных в комплекте Android.Я пытаюсь опубликовать данные по пакетам, размер которых> 80 КБ, и выбрасываю исключение для Android со смертельным исходом. Данные сериализуемы.

Ответы [ 7 ]

36 голосов
/ 14 января 2015

Зависит от назначения комплекта.Сам пакет ограничен только объемом памяти.

Два основных варианта использования пакетов - передача информации между компонентами с использованием намерений и сохранение состояния действий.

1.Intents / Binder

При использовании для передачи информации между компонентами Android пакет сериализуется в транзакцию связывания.Общий размер всех транзакций связывания в процессе составляет 1 МБ.Если вы превысите этот лимит, вы получите эту фатальную ошибку «!!! СБОЙ БЕЗОПАСНОГО БИНДЕРА !!!»

Рекомендуется, чтобы данные в этих пакетах были как можно меньше, потому что это общий буфер, что-то ещена диск должно быть записано несколько килобайт.

Ссылка: 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 имеет ограниченный фиксированный размер, в настоящее время - 1 МБ, который используется всеми транзакциями, выполняемыми для процесса.Следовательно, это исключение может быть вызвано, когда выполняется много транзакций, даже если большинство отдельных транзакций имеют умеренный размер.

2.Сохраненное состояние экземпляра (Activity onSaveInstanceState, onPause и т. Д.)

Я не нашел ограничений по размеру, который я мог бы сохранить в пакете, используемом для сохранения состояния Activity.Я провел несколько тестов и смог успешно сохранить около 175 МБ, прежде чем получил исключение нехватки памяти, пытаясь выделить данные, которые я пытался сохранить.

11 голосов
/ 18 декабря 2011

Я думаю, что предел составляет 500 КБ.Вы можете сохранить переданный объект в файле и вместо этого отправить путь к файлу в комплекте.Вы можете проверить аналогичный вопрос, заданный мной на SO

1 голос
/ 30 марта 2017

Да, есть, и теперь в Android Nougat он вылетит, если вы превысили лимит примерно (500Kb).

выпуск Android-нуги

0 голосов
/ 16 октября 2018

Буфер транзакций Binder имеет ограниченный фиксированный размер, в настоящее время 1MB , который используется всеми транзакциями, выполняемыми для процесса. Поскольку этот лимит находится на уровне процесса, а не на уровне активности, эти транзакции включают все транзакции связывания в приложении, такие как onSaveInstanceState, startActivity и любое взаимодействие с системой. При превышении предельного размера создается исключение TransactionTooLargeException.

В конкретном случае saveInstanceState объем данных должен быть небольшим, поскольку системный процесс должен удерживать предоставленные данные до тех пор, пока пользователь не сможет вернуться к этой операции (даже если процесс операции убит). Мы рекомендуем сохранить сохраненное состояние менее чем 50k данных.

Parcelable and Bundles

0 голосов
/ 31 октября 2017

В соответствии с Google Android API дата должна быть меньше 50 КБ.

0 голосов
/ 02 февраля 2017

Да, он ограничен 1 МБ.

Вы можете использовать Singleton класс для передачи данных.

0 голосов
/ 18 декабря 2011

Я думаю, что максимальный размер пакета составляет 1024 килобайта.Чтобы передавать большие объекты между действиями, вы должны попробовать другие способы (кэш памяти, локальное хранилище и т. Д.).

...