android - 활용 - 안드로이드 번들에 몇 가지 한계가 있습니까?




액티비티의 뜻 (5)

바인더 트랜잭션 버퍼의 제한된 고정 크기 (현재 1MB )는 프로세스 진행중인 모든 트랜잭션이 공유합니다. 이 한도는 액티비티 수준이 아닌 프로세스 수준이므로 이러한 트랜잭션에는 onSaveInstanceState, startActivity 및 시스템과의 모든 상호 작용과 같은 응용 프로그램의 모든 바인더 트랜잭션이 포함됩니다. 크기 제한을 초과하면 TransactionTooLargeException이 발생합니다.

특정 사례 인 savedInstanceState의 경우, 사용자가 해당 활동으로 되돌아 갈 수있는 한 (활동 프로세스가 종료 되더라도) 시스템 프로세스가 제공된 데이터를 보류해야하므로 데이터 양을 줄여야합니다. 저장된 상태를 50k 미만의 데이터로 유지하는 것이 좋습니다 .

소포 및 번들

안드로이드 번들의 데이터 크기에 상한선이 있는지 알고 싶습니다. 나는 크기가 80k보다 큰 번들로 데이터를 게시하려고 시도하고 안드로이드 치명적인 예외를 throw합니다. 데이터는 Serializable입니다.


그렇습니다. 그리고 지금 안드로이드 누가 (Nougat)에서 대략 한도 (500Kb)를 초과하면 추락 할 것입니다.

안드로이드 누가 문제


나는 한계가 500kb다고 생각한다. 전달 된 객체를 파일에 저장하고 대신 번들에 파일의 경로를 보낼 수 있습니다. 나와 비슷한 질문을 확인하실 수 있습니다.


번들의 목적에 따라 다릅니다. 번들 자체는 메모리 양에 의해서만 제한됩니다.

번들의 두 가지 주요 용도는 인 텐트를 사용하여 구성 요소간에 정보를 전달하고 활동 상태를 저장하는 것입니다.

1. 의도 / 바인더

Android 구성 요소간에 정보를 전달하는 데 사용되면 번들이 바인더 트랜잭션으로 직렬화됩니다. 프로세스의 모든 바인더 트랜잭션의 전체 크기는 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

바인더 트랜잭션 버퍼에는 제한된 고정 크기 (현재 1Mb)가 있으며 프로세스에 대해 진행중인 모든 트랜잭션이 공유합니다. 따라서 대부분의 개별 트랜잭션이 중간 크기 인 경우에도 진행중인 많은 트랜잭션이있을 때이 예외가 발생할 수 있습니다.

2. 저장된 인스턴스 상태 (onSaveInstanceState, onPause 등의 활동)

액티비티 상태를 보존하는 데 사용 된 번들에 저장할 수있는 크기에 제한이 없습니다. 일부 테스트를 수행하고 저장하려고 시도한 데이터를 할당하려고 할 때 메모리 부족 예외가 발생하기 전에 약 175MB를 성공적으로 저장할 수있었습니다.






bundle