binder通信原理

要着手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异常,异常堆栈越是往上面是异常所在点,越往下面是上层代码。当点击按钮的时候底层会给

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy