今天系统需要采用aidl进行跨进程调用,讨论到了aidl对象调用效率问题,总结如下
1. 同一个apk,同一个进程的Activity 调用Service,系统会直接把binder这个java对象传递给Activity,会一般的回调无异
源码
/** * Cast an IBinder object into an com.example.testaidlservice.IMyAidlInterface interface, * generating a proxy if needed. */ public static com.example.testaidlservice.IMyAidlInterface asInterface(android.os.IBinder obj) { if ((obj == null)) { return null; } android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); if (((iin != null) && (iin instanceof com.example.testaidlservice.IMyAidlInterface))) { return ((com.example.testaidlservice.IMyAidlInterface) iin); } return new com.example.testaidlservice.IMyAidlInterface.Stub.Proxy(obj); }
2. 同一个Apk,Activity 指定process a, Service process 为b, Activity aidl调用Service,当然需要进行序列化反序列化,需要创建一次对象
3.不同apk, Activity 调用另一个Apk的Service, 系统需要对Service的binder对象序列化,在
Client端进行反序列化
4. 不同Apk , share uid不同, process相同, 实际上还是两个进程,当然也需要binder的序列化反序列化
5. 不同Apk, shareuid 相同, process相同,实际上是一个进程,但是aidl调用,仍然需要 进行序列化反序列化, 在客户端创建对象
结论:
1.Android 为了提高aidl的效率, 对于同一个apk内,同一个进程内的aidl调用,直接转递了java对象,其他情况,需要对对象进行一次序列化和反序列化,性能比前者低
2.只有在shareuid process 都相同的情况下,组件占用的进程才相同。 更多请参考 http://www.cnblogs.com/gansc23/archive/2011/01/21/1941134.html