Android 短时间内多次启动同一个Service会不会有多次的binder调用

背景:笔者刚接触公司的新项目,发现项目中有些场景居然在短时间内(几十毫秒内)发送同一个Service,本来功能没有什么大问题,但是笔者有点怀疑:短时间内发送多个相同的Service会不会影响性能?因为启动服务涉及到binder通信,ANR问题里就有一类是关于binder耗时的,特别是在低端机器,CPU繁忙,内存不足,然后短时间又有多次binder调用的话。

于是笔者问了好几个同事和朋友:短时间内多次启动同一个Service会不会有多次的binder调用。没想到这个问题形成了两派:

A :有多次binder调用, 多次启动同一个服务会走onStartCommand了肯定有onTransact

B :没有多次,如果启动的服务的是同一个进程的服务,那么没有binder调用

各位看官,你们觉得呢?

笔者潜意识里认为是有的,但是没有证据,所以记录下这个找证据的过程。

找证据的过程其实就是看源码过程了,笔者看的是android 31的源码,由于源码冗长,所以只截取关键路径源码:

1. 应用进程

 

  

2. system_server进程

 在ActiveServices里经过一系列调用会通过ApplicationThread代理调用scheduleServicesArgs回到应用进程:

3. 应用进程: 

 

所以,短时间内启动同一个Service, 不管启动的服务是不是同一个进程都会涉及binder调用的,而且还是两次。如果启动的服务如果是另外的进程,system_server还会发socket 通知zygote fork出一个新进程。

猜你喜欢

转载自blog.csdn.net/xiaobaaidaba123/article/details/125345426