要着手binder分析,我们可以用一个简单的activity跳转逻辑来分析,最好的办法是让intent中携带的数据超过1M的数据,然后通过logcat中异常堆栈来分析:
1
2
3
4
|
val intent = Intent(this, BitmapActivity::class.java)
val data = ByteArray(1024*1024)
intent.putExtra("data",data)
startActivity(intent)
|
此处是直接携带1M的数据,然后系统给我来了个异常信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
java.lang.RuntimeException: Failure from system
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1749)
at android.app.Activity.startActivityForResult(Activity.java:5533)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.kt:704)
at android.app.Activity.startActivityForResult(Activity.java:5486)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.kt:683)
at android.app.Activity.startActivity(Activity.java:5892)
at android.app.Activity.startActivity(Activity.java:5845)
at com.example.coroutinescopedemo.BottomSheetActivity.onCreate$lambda$0(BottomSheetActivity.kt:27)
at com.example.coroutinescopedemo.BottomSheetActivity.$r8$lambda$CWhZfDsJCDnJCQuDq0om0F9MZaU(Unknow
at com.example.coroutinescopedemo.BottomSheetActivity$$ExternalSyntheticLambda0.onClick(D8$$Synthet
at android.view.View.performClick(View.java:7753)
at android.view.View.performClickInternal(View.java:7730)
at android.view.View.access$3700(View.java:861)
at android.view.View$PerformClick.run(View.java:29146)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8293)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
Caused by: android.os.TransactionTooLargeException: data parcel size 1049092 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(BinderProxy.java:624)
at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:2664)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1743)
at android.app.Activity.startActivityForResult(Activity.java:5533)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.kt:704)
at android.app.Activity.startActivityForResult(Activity.java:5486)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.kt:683)
at android.app.Activity.startActivity(Activity.java:5892)
at android.app.Activity.startActivity(Activity.java:5845)
at com.example.coroutinescopedemo.BottomSheetActivity.onCreate$lambda$0(BottomSheetActivity.kt:27)
at com.example.coroutinescopedemo.BottomSheetActivity.$r8$lambda$CWhZfDsJCDnJCQuDq0om0F9MZaU(Unknow
at com.example.coroutinescopedemo.BottomSheetActivity$$ExternalSyntheticLambda0.onClick(D8$$Synthet
at android.view.View.performClick(View.java:7753)
at android.view.View.performClickInternal(View.java:7730)
at android.view.View.access$3700(View.java:861)
at android.view.View$PerformClick.run(View.java:29146)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8293)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
|
可以看到异常分两块,一块是上面的java.lang.RuntimeException: Failure from system
,它是Instrumentation中的execStartActivity抛的异常,最终是因为在android.os.BinderProxy.transactNative(Native Method)中抛了android.os.TransactionTooLargeException: data parcel size 1049092 bytes
异常,异常堆栈越是往上面是异常所在点,越往下面是上层代码。当点击按钮的时候底层会给