android 查找源码中aidl文件的实现类

sancaiodm Android源码学习 2021-09-03 2156 0

我们都知道android是进程安全的,不可进程间共享数据 必须通过Binder机制传递数据,而Binder机制的实现方式之一就是AIDL机制,

在framework有大量的adil文件,

image.png

如我要查找INotificationManager.aidl 文件

hx@hx:~/workcode/sprd/aosp/frameworks$ find -name "INotificationManager.*"

./base/core/java/android/app/INotificationManager.aidl

然后我们再到out目录下去搜索一下INotificationManager.aidl文件在系统编译后自动生成的文件

image.png

如上图 系统编译后自动为我们生成一个对应的.java 与.class文件,这里我们只看java文件

image.png

可以看到定义了一个继承了IInterface接口的INotificationManager接口类,在这个接口内有两个内部类 Default 与 Stub,而在Stub下面还有一个内部Proxy类

我们来看Stub这个内部类

image.png

 如上图,传入一个IBinder对象通过Stub的内部类Proxy转换则成一个INotificationManager对象类型,并将其返回,在使用处的Client客户端获取到 Server 端的代理对象,Server 代理对象同样具有 Server 本地对象能力,因此 在Client 可以调用 Server 代理对象跟 Sever 本地对象进行数据交互,Binder 驱动在他们中间起到桥梁作用。

看一下图就明白了Stub的实现类是一个IBinder类型的,

image.png

查找这些AIDL文件的java实现类,我本人找查的方式是:

grep --include="*.java" "INotificationManager.Stub()" -srn  . /


image.png


如上图找到INotificationManager.Stub的实现类即可,

INotificationManager.aidl文件的实现java类,

    static private INotificationManager getService() {
        if (sService != null) {
            return sService;
        }
        sService = INotificationManager.Stub.asInterface(
                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
        return sService;
    }

INotificationManager nm = INotificationManager.Stub.asInterface(ServiceManager.getService(Context.NOTIFICATION_SERVICE)

红色标注部分代码就是此INotificationManager.Stub的实现类对象,等同如下部分代码


 final IBinder mService = new INotificationManager.Stub() {省略实现};

    @VisibleForTesting

    INotificationManager getBinderService() {

        return INotificationManager.Stub.asInterface(mService);

    }


NotificationManagerService类继承了aosp/framework/base/services/core/java/com/android/server/SystemService.java类,调用父类SystemService.java的publishBinderService方法用 ServiceManager.addService做了注册方便统一管理,

    protected final void publishBinderService(String name, IBinder service,

            boolean allowIsolated, int dumpPriority) {

        ServiceManager.addService(name, service, allowIsolated, dumpPriority);

    }


这涉及到android binder机制,不在此文讨论范围,

评论