- Demystify TransactionTooLargeException
- Analysis
- please fix this bug #120
- Comments
- DuJerry commented Aug 1, 2019
- miguelpruivo commented Aug 1, 2019
- DuJerry commented Aug 1, 2019
- miguelpruivo commented Aug 1, 2019
- DuJerry commented Aug 2, 2019
- miguelpruivo commented Aug 2, 2019
- miguelpruivo commented Aug 5, 2019
- miguelpruivo commented Aug 9, 2019
- wreppun commented Aug 22, 2019
- Полное руководство по выходу из Android System Recovery 3e Ошибка
- Часть 1 , Что такое восстановление системы Android
- Часть 2 , Как выйти из Android Восстановление системы Ошибка 3e
- Метод 1 : Проверьте клавиши / кнопки, чтобы увидеть, правильно ли они работают
- Метод 2 : Выньте аккумулятор и вставьте его снова
- Метод 3 : Перезагрузите свой телефон Android
- Часть 3 , Как восстановить потерянные данные, когда застрял в Android System Recovery 3e
- Как сделать восстановление системы Android
- Бонусные Советы : Как войти в режим восстановления данных Android, чтобы исправить ваш телефон или планшет Android
- Как войти в режим восстановления системы Android на устройстве Google Pixel / Nexus
- Как загрузиться в режиме восстановления на Samsung Galaxy и других
- Часто задаваемые вопросы о Android System Recovery
Demystify TransactionTooLargeException
Jan 11 · 7 min read
Recently, ShopBack Android app had encountered a stability issue caused by TransactionTooLargeException which led app crash-free rate drop significantly. Fortunately, we know that the exception was thrown when app shown store page then the user backgrounded the app. Here is the call stacks when the exception occurs:
According to the call stacks, it only shows that exce p tion was thrown by Android framework and didn’t include any of our application code. So it is not easy to find out the reason in intuitive ways. Here I would like to share how I identified the root cause and the lesson learned from this issue.
Analysis
First of all, the exception is thrown when app goes to background during binder transaction, and the reason for this exception is that the buffer size of each remote procedure call(IPC) is limited to 1 MB, if the buffer size is over 1 MB, the exception will be thrown. Although it is easy to know how the exception occurs, we still don’t know which data with a large size causes app to crash.
According to the call stacks, we can suspect this issue might be related to onSaveInstanceState() which gives Activity/Fragment a way to save UI states to Android system before app goes to background in order to restore app’s UI state in case the app’s process is killed by Android OS. However, after checking the app’s implementation, we didn’t even implement activity’s and fragment’s onSaveInstanceState() callback. So we need to dive into framework code to check what data will be stored silently when onSaveInstanceState() is called.
Above code snippet is the starting point of activity’s onStop() handling flow in Android framework. ActivityClientRecord is the data structure used to keep activity’s instance and some information related to the activity by framework. The function does three things below:
- Get the corresponding ActivityClientRecord instance of the target activity which is going to Stop state.
- Pass above ActivityClientRecord instance to performStopActivityInner() that we will go into this method for details later.
- Set above ActivityClientRecord instance to StopInfo , and use StopInfo to notify Android system the activity is no longer visible to the user.
We notice that it sets ActivityClientRecord ’s state field which is a Bundle object to the StopInfo (ie. stopInfo.setState(r.state) ), so let’s keep tracing the source code to check what does StopInfo do.
In the run() method of StopInfo , the Bundle object( mState ) will be send to Activity Manager Service(AMS) by binder transaction and if its size is too big, the exception will be thrown when the Android version is greater than 6. This symptom also matches the Firebase Crashlytics result that almost all crashes occurred in Android 7 and above.
Furthermore, you may notice that framework has put development log for developers to check bundle size if there is an exception occurs (so sweet 😍). We can use adb command to check whether the size of Bundle object exceeds limit or not as following screenshot. Obviously, the size was too big when the exception occurred.
Now we know the Activity where the exception occurs truly keeps too many data when our app goes to background, Besides, because of the key word in log, android:support:fragments , we can suspect that the data may be kept by the fragments in the Activity, but we still don’t know what’s the data it keeps, so let’s keep tracing the source code.
Continue from performStopActivityInner() mentioned before, it invokes above function, callActivityOnStop() invokes Activity’s onStop() and onSaveInstanceState() . According to the source code, you can also find that onSaveInstanceState() may be invoked before or after onStop() depends on Android OS version.
According above code snippet, it shows that ActivityClientRecord ’s state filed is assigned by an empty Bundle object which will be passed to onSaveInstanceState () as its parameter(ie. onSaveInstanceState (Bundle outState) ).
So far, we know that the Bundle object which passed to onSaveInstanceState() is an empty Bundle object without any data, and it will also be sent to Android system by binder transaction. And in this issue, the Bundle object contains too many data and cause TransactionTooLargeException. So we keep tracing the source code to find out what data will be stored to the Bundle object.
Here we start to trace the default implementation of Activity’s onSaveInstanceState() for finding more clues. According to above code snippet of FragmentActivity.java, it indicates the value of android:support:fragment in Bundle object comes from mFragment.saveAllState() . Let’s keep tracing saveAllSate () to see what does it do.
saveAllState() is the core logic of saving state of fragments in an Activity. mFragmentStore is a member field of FragmentManager that is used to store all fragment instances which are added to the Activity. There are two array lists in mFragmentStore for storing added fragments called mActive and mAdded , so above flow will go through both of them to collect the data that need to be kept from all added fragments. And last, these data will be set to FragmentManagerState which is a data class implements Parcelable interface and put to Bundle object with the key android:support:fragment . You may wonder that why does saveActiveFragments() return a list of FragmentState which is also a data class that implements Parcelable interface, but saveAddedFragments() only returns a list of string. The reason is that mActive list is a superset of mAdded list that includes all fragments referenced by any FragmentTransaction objects in the back-stack, so framework saves complete information for the fragments in mActive list, but only save string information for the fragments in mAdded list. For more details about mActive and mAdded , you can refer to here.
Now we can check what data is kept by FragmentState . According to above code snippet, we found that most of data field are primitive type which should not increase the data size too much, except the mArgument whose type is Bundle and assigned from Fragment’s argument object .
After tracing the source code, we can almost confirm that the issue is related to some Fragment put too much data in its Argument field, so we can review our implementation again to check what data in Fragment’s Argument causes this problem.
Below diagram illustrates the overall picture of above code flow.
Источник
please fix this bug #120
Comments
DuJerry commented Aug 1, 2019
I/FilePicker(24101): [SingleFilePick] File URI:content://com.huawei.hidisk.fileprovider/root/storage/emulated/0/Android/data/com.android.family_bill/files/family_bill.backup
E/FilePickerUtils(24101): Getting for API 19 or abovecontent://com.huawei.hidisk.fileprovider/root/storage/emulated/0/Android/data/com.android.family_bill/files/family_bill.backup
E/FilePickerUtils(24101): NO DOCUMENT URI — CONTENT
D/AndroidRuntime(24101): Shutting down VM
E/AndroidRuntime(24101): FATAL EXCEPTION: main
E/AndroidRuntime(24101): Process: com.android.family_bill, PID: 24101
E/AndroidRuntime(24101): java.lang.RuntimeException: Failure delivering result ResultInfo
E/AndroidRuntime(24101): at android.app.ActivityThread.deliverResults(ActivityThread.java:4932)
E/AndroidRuntime(24101): at android.app.ActivityThread.handleSendResult(ActivityThread.java:4975)
E/AndroidRuntime(24101): at android.app.ActivityThread.-wrap20(Unknown Source:0)
E/AndroidRuntime(24101): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1950)
E/AndroidRuntime(24101): at android.os.Handler.dispatchMessage(Handler.java:108)
E/AndroidRuntime(24101): at android.os.Looper.loop(Looper.java:166)
E/AndroidRuntime(24101): at android.app.ActivityThread.main(ActivityThread.java:7425)
E/AndroidRuntime(24101): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(24101): at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
E/AndroidRuntime(24101): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
E/AndroidRuntime(24101): Caused by: java.lang.IllegalArgumentException: column ‘_data’ does not exist
E/AndroidRuntime(24101): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:333)
E/AndroidRuntime(24101): at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:87)
E/AndroidRuntime(24101): at com.mr.flutter.plugin.filepicker.FileUtils.getDataColumn(FileUtils.java:132)
E/AndroidRuntime(24101): at com.mr.flutter.plugin.filepicker.FileUtils.getForApi19(FileUtils.java:113)
E/AndroidRuntime(24101): at com.mr.flutter.plugin.filepicker.FileUtils.getPath(FileUtils.java:29)
E/AndroidRuntime(24101): at com.mr.flutter.plugin.filepicker.FilePickerPlugin$1.onActivityResult(FilePickerPlugin.java:81)
E/AndroidRuntime(24101): at io.flutter.app.FlutterPluginRegistry.onActivityResult(FlutterPluginRegistry.java:204)
E/AndroidRuntime(24101): at io.flutter.app.FlutterActivityDelegate.onActivityResult(FlutterActivityDelegate.java:132)
E/AndroidRuntime(24101): at io.flutter.app.FlutterFragmentActivity.onActivityResult(FlutterFragmentActivity.java:137)
E/AndroidRuntime(24101): at android.app.Activity.dispatchActivityResult(Activity.java:7690)
E/AndroidRuntime(24101): at android.app.ActivityThread.deliverResults(ActivityThread.java:4928)
E/AndroidRuntime(24101): . 9 more
The text was updated successfully, but these errors were encountered:
miguelpruivo commented Aug 1, 2019
Hi, how are you picking the file? I need a few more details so I can help you.
DuJerry commented Aug 1, 2019
`File file = await FilePicker.getFile(type: FileType.ANY, fileExtension: ‘backup’);’
‘String jsonStr = await file.readAsString();`
The above is my calling code. and the phone is huawei nova youth (WAS-AL00), android version is 8.0.0, emui version is 8.0.0 .
I wonder if the above information can help you.
miguelpruivo commented Aug 1, 2019
Would you mind to try on a different phone and see if still happens? (Or you can just drop the file in an emulator with version 8.0 and see if its working).
DuJerry commented Aug 2, 2019
i try it on emulator and xiaomi mix 2s, it`s ok . only on huawei nova youth report error, maybe it’s compatibility.
miguelpruivo commented Aug 2, 2019
@timordu, this are the kind of issues that are tough to follow, but I’ll try my best.
- Does the devices where it works fine, have the same android version?
- Did you use the exact same file?
- If the answers to the previous questions are both true, in the Huawei nova youth, does that happen with all files, or just that one?
miguelpruivo commented Aug 5, 2019
Bumping this @timordu.
miguelpruivo commented Aug 9, 2019
Closing since no further information was given. Feel free to reopen if the problem is still on. Thank you.
wreppun commented Aug 22, 2019
I just got a similar StackTrace on a chromebook HP x360 Android 7.1.1 (API 25) :
It recommends using a ContentResolver -> InputStream instead of a ContentResolver -> Cursor
Источник
Полное руководство по выходу из Android System Recovery 3e Ошибка
Размещено от Билл Фаррелл Январь 13, 2021 18: 40
Как только ваш телефон Android зависает в ошибке 3e и входит в Android Recovery System, вы просто следуйте решениям в этом посте, чтобы исправить это. Тем не менее, получите профессиональное программное обеспечение для восстановления данных Android, чтобы вернуть потерянные данные в процессе ремонта.
Иногда при включении или перезапуске телефона Android ничего не остается, кроме экрана «Восстановление системы Android».
Вы можете увидеть много команд, таких как восстановление системы Android, очистить раздел кэша и другие.
Это кажется трудной задачей с таким количеством незнакомых предложений, и многие люди не знают, как выбраться из Android восстановление системы вручную.
К счастью, эта статья призвана показать вам полное руководство по исправлению восстановления системы Android. Я имею в виду, что вы можете узнать подробности об определении, решении и дополнительной информации о восстановлении системы Android. Так что, если вы не знаете, с ошибкой восстановления системы Android 3e, то эта статья может вам помочь.
- Часть 1: Что такое восстановление системы Android
- Часть 2: Как выйти из Android Восстановление системы Ошибка 3e
- Часть 3: Как восстановить потерянные данные, когда застряли на Android System Recovery 3e
- Бонусные советы: Как войти в режим восстановления данных Android, чтобы исправить свой Android
- Часто задаваемые вопросы о Android System Recovery
Часть 1 , Что такое восстановление системы Android
Так почему же появляется экран восстановления системы Android? Другими словами, что люди могут извлечь выгоду из режима восстановления системы Android?
Ну, это может быть полезной командой во время полной перезагрузки Android. А когда ваш телефон или планшет Android не включен должным образом, восстановление системы Android может помочь решить проблему без доступа к настройкам телефона. Таким образом, ваш Android может войти в режим восстановления системы автоматически, чтобы исправить системную ошибку.
Тем не менее, все идет не так, когда вы застряли в восстановлении системы Android.
Как вы знаете, восстановление системы Android — это встроенная функция, которая может использоваться для диагностики и исправления системных ошибок, которая похожа на Режим Android Odin.
Если что-то происходит за пределами его возможностей, то вы должны получить неотвечающий черный экран с командой восстановления системы Android 3e no.
Часть 2 , Как выйти из Android Восстановление системы Ошибка 3e
Вот несколько распространенных решений по исправлению не работающего экрана Android восстановления системы. И вы также можете выполнить следующие шаги, чтобы проверить, если что-то идет не так, а затем происходит ошибка восстановления системы Android.
Метод 1 : Проверьте клавиши / кнопки, чтобы увидеть, правильно ли они работают
Нажмите эти клавиши и кнопки несколько раз, а затем отпустите их для проверки. Иногда вы просто нажимаете слишком глубоко, поэтому эти кнопки все еще могут застрять и не вернуться в исходное положение. Проверьте работоспособность физических клавиш и кнопок Android (Кнопка включения Android не работает?).
Метод 2 : Выньте аккумулятор и вставьте его снова
Выньте батарею из вашего устройства Android. Подождите несколько минут, а затем снова вставьте его и включите, чтобы проверить, все ли в порядке.
Метод 3 : Перезагрузите свой телефон Android
Длительно нажмите кнопку питания и кнопку увеличения громкости, пока ее экран не станет черным. После этого удерживайте кнопку питания, чтобы включить телефон Android. Может сработать и выйти из системы восстановления Android с ошибкой 3e.
Часть 3 , Как восстановить потерянные данные, когда застрял в Android System Recovery 3e
Если описанные выше методы не работают, вам необходимо стереть данные или выполнить сброс до заводских настроек. Но вы потеряете все свои данные Android, особенно если у вас нет файла резервной копии Android раньше. Для восстановления данных с Android, который застрял на Android-системе восстановления 3e, используется Apeaksoft Разбитое извлечение данных Android это самое безопасное и простое решение.
- Исправить сбой, зависание или блокировку телефона Android обратно в нормальное состояние.
- Извлечение данных из поврежденного телефона внутренней памяти и SD-карты одним щелчком мыши.
- Поддержка практически всех телефонов Samsung, таких как Samsung Galaxy Note / S и т. Д.
Как сделать восстановление системы Android
Шаг 1 , Запустите сломанное извлечение данных Android
Бесплатно загрузите и установите программное обеспечение для восстановления системы Android. Запустите его и найдите на левой панели «Извлечение сломанных данных Android». Подключите Android к Mac или ПК и выберите кнопку «Пуск» в зависимости от ситуации.
Шаг 2 , Запрос на восстановление режима восстановления системы Android
Вам будет задан вопрос, почему ваш Android завис на экране восстановления системы. Выберите «Другие» и нажмите кнопку «Далее», чтобы продолжить. Позже выберите модель своего телефона и имя.
Шаг 3 , Выйдите из Android Data Recovery и восстановите данные Android
Следуйте инструкциям на экране, чтобы перевести Android в режим загрузки, нажмите «Пуск», после чего вы сможете выйти из режима восстановления системы Android.
Выбирайте файлы по категориям и подробно просматривайте. Вы можете сканировать и восстанавливать определенные данные с Android без потери данных. Нажмите «Восстановить» и установите папку назначения для восстановления файлов Android.
Бонусные Советы : Как войти в режим восстановления данных Android, чтобы исправить ваш телефон или планшет Android
Но если вам нужно войти в систему восстановления системы Android, перезагрузите систему сейчас, то вы можете обратиться к следующим советам. Все, что вам нужно, это нажать аппаратные клавиши, и тогда вы сможете загрузиться в режиме восстановления данных Android.
Как войти в режим восстановления системы Android на устройстве Google Pixel / Nexus
Шаг 1 , Удерживайте кнопку питания и сдвиньте ползунок.
Шаг 2 . Нажмите Power и Volume Down, чтобы получить доступ к информации Android, выберите «Пуск».
Шаг 3 . Используйте кнопки увеличения и уменьшения громкости, чтобы выбрать «Recovery Mode», нажмите Power для подтверждения.
Шаг 4 , Нажмите Power и Volume Up примерно на 3 секунд, а затем отпустите Volume Up.
Шаг 5 , Удерживайте кнопку питания, чтобы увидеть параметры восстановления системы Android.
Шаг 6 , Просто используйте клавиши громкости и питания, чтобы войти в систему восстановления Android.
Как загрузиться в режиме восстановления на Samsung Galaxy и других
Шаг 1 , Нажмите Power и сдвиньте, чтобы выключить Android.
Шаг 2 , Удерживайте и нажимайте клавиши включения и увеличения громкости.
Шаг 3 , Не отпускайте их, пока не появится логотип Samsung.
Шаг 4 , Выберите восстановление системы Android. 3e примените обновление от adb и других пользователей с помощью клавиш громкости и питания.
Часто задаваемые вопросы о Android System Recovery
Вредно ли восстановление системы Android для моего телефона?
Нет. Android System Recovery — это встроенная функция на телефоне Android, позволяющая реагировать на зависание телефона или зависание телефона при некоторых ошибках. Это может помочь диагностировать и исправить системные ошибки телефона и защитить телефон от атак вирусов или неизвестных вредоносных программ.
Как исправить ошибку без команды?
При попытке перезагрузить телефон Android часто не возникает ошибка команд, и этот экран ничего не сообщает, а просто говорит «Нет команды». Чтобы исправить это, вы должны нажать и удерживать кнопку питания, затем нажать и отпустить кнопку увеличения громкости, но продолжать удерживать кнопку питания, и после этого вы можете увидеть список с опцией Wipe data / factory reset.
Как перевести телефон в режим восстановления?
Действия по переводу телефона Android в режим восстановления отличаются от моделей телефонов. Вот пример телефона Samsung. Шаг 1. Нажмите и удерживайте кнопку питания, а затем выберите кнопку выключения питания, чтобы выключить телефон Samsung. Шаг 2. После этого вам нужно одновременно нажать кнопку питания, кнопку увеличения громкости и кнопку «Домой». Шаг 3. Отпустите три кнопки, пока не появится логотип Samsung, и с помощью кнопки увеличения громкости выберите режим восстановления Android и нажмите кнопку питания, чтобы подтвердить его. Подробные шаги могут ссылаться на Режим восстановления Android.
Затем вы можете выполнить вышеуказанные операции, чтобы с легкостью перевести другие телефоны и планшеты Android в режим восстановления системы, включая HTC, LG, Motorola, OnePlus и т. Д. В результате вы можете без проблем входить или выходить из режима восстановления системы Android в соответствии с этим статья. Надеюсь, что вы можете исправить Android восстановления системы 3e скачать и другие ошибки быстро и успешно с лучшим Apeaksoft Разбитое извлечение данных Android.
Источник