美文网首页
TransactionTooLargeException问题解决

TransactionTooLargeException问题解决

作者: Duzzi | 来源:发表于2019-08-28 15:29 被阅读0次

    前阵子项目targetSdkVersion从23升级到了26,友盟统计上出现了很多TransactionTooLargeException导致的crash,日志如下

    java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 579328 bytes
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3873)
        at android.os.Handler.handleCallback(Handler.java:754)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:165)
        at android.app.ActivityThread.main(ActivityThread.java:6375)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
    Caused by: android.os.TransactionTooLargeException: data parcel size 579328 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:622)
        at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3688)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.morgoo.droidplugin.hook.proxy.ProxyHook.invoke(ProxyHook.java:62)
        at com.morgoo.droidplugin.hook.proxy.IActivityManagerHook.invoke(IActivityManagerHook.java:63)
        at java.lang.reflect.Proxy.invoke(Proxy.java:813)
        at $Proxy25.activityStopped(Unknown Source)
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3865)
        ... 7 more
    android.os.TransactionTooLargeException: data parcel size 579328 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:622)
        at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3688)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.morgoo.droidplugin.hook.proxy.ProxyHook.invoke(ProxyHook.java:62)
        at com.morgoo.droidplugin.hook.proxy.IActivityManagerHook.invoke(IActivityManagerHook.java:63)
        at java.lang.reflect.Proxy.invoke(Proxy.java:813)
        at $Proxy25.activityStopped(Unknown Source)
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3865)
        at android.os.Handler.handleCallback(Handler.java:754)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:165)
        at android.app.ActivityThread.main(ActivityThread.java:6375)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
    
    

    一、原因分析:

    • targetSdkVersion在23及其以下只会有TransactionTooLargeException的警告,并不会导致crash。

    • targetSdkVersion在24及其以上会抛出TransactionTooLargeException导致crash,具体可查看7.0行为变更

    许多平台 API 现在开始检查在Binder 事务间发送的大负载,系统现在会将 TransactionTooLargeExceptions 作为 RuntimeExceptions 再次引发,而不再只是默默记录或抑制它们。一个常见例子是在 [Activity.onSaveInstanceState()](https://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)) 上存储过多数据,导致 ActivityThread.StopInfo 在您的应用面向 Android 7.0 时引发 RuntimeException

    二、可能导致该crash的几种情况

    虽然可以一眼看出是binder通讯中传递了过大的数据,但是要定位具体是哪里传递了过大的数据并没有那么容易,这里只把可能发生的情况列举出来:

    1. activity或者fragment跳转时,传递的bundle携带了过大的数据,比如传递了bitmap或者size很大的ArrayList
      可以借用toolargetool查看。
    2. Activity.onSaveInstanceState()保存了过大的数据
    3. FragmentStatePagerAdaptersaveState保存了过多的历史Fragment实例的状态数据,重写saveState
      image.png

    三、问题解决

    第一次迭代中对1和2两种情况做了保护,上线后依然出现TransactionTooLargeException
    第二次迭代中对3做了处理,再次上线后没有出现TransactionTooLargeException,问题结局。

    thanks:
    https://stackoverflow.com/questions/11451393/what-to-do-on-transactiontoolargeexception
    https://www.cnblogs.com/tgltt/p/9834584.html

    相关文章

      网友评论

          本文标题:TransactionTooLargeException问题解决

          本文链接:https://www.haomeiwen.com/subject/uaipectx.html