2013-12-16 51 views
1

为了避免无用的答案关于如何在自己的项目中实现AIDL - 我了解如何在自己的项目中使用AIDL。Android究竟如何链接AIDL接口和远程服务?

我还不清楚它是如何在Android源代码中使用的?

例如,android.media包中有IAudioService AIDL接口。 还有AudioService java文件。在IInterfaceServiceName.aidl中定义了接口并且实现在InterfaceServiceName.java中的例子很多。所以,我认为AIDL的内部使用没有第一资本I的名称寻找Service,然后使用它。但是,这个理论被IWifiManager和WifiService所拆除。

然而,所有这些AIDL实现共享一件事 - 它们都扩展了IInterfaceName.Stub类。那么,这意味着AIDL内部寻找扩展IInterfaceName.Stub的类?但是如果有多个类扩展它呢?并且这些类别根本不是服务...

或者有一些服务管理器,它以某种方式创建服务并将这些AIDL实现作为绑定程序创建?如果是这样,请将我指向这位神秘的服务经理。

编辑:我找到了这个服务经理。它是android.os包中的ServiceManager。现在可以理解为什么这些SomethingService实际上不是服务,而是实际上IBinder--服务管理器以某种方式通过方法添加服务(String,IBinder)以给定的IBinder创建服务。但是现在混乱只会变得更糟。 这个服务的实现也在于有点奇怪的ServiceManagerNative,它涉及与未知的IBinder进行远程交易。现在我完全迷失了。那么这个ServiceManager如何启动呢?它的服务如何增加?

+0

尝试阅读本http://mobileorchard.com/android-app-development-implementing-remote-android-services-with-aidl/ – pskink

+0

你没读过的问题冷杉这句话,是吗?我不感兴趣如何在我的应用中实现AIDL - 我知道该怎么做。相反,我试图了解Android系统服务和像IWifiManager这样的AIDL如何连接。 –

+0

所以你没有任何问题与sidl本身,但想知道android内部,对不对? – pskink

回答

2

ServiceManager不是一个随机的,而是一个预定义的值。它是一个Binder句柄等于0的服务。在系统启动过程中,ServiceManager是系统启动的第一个服务之一(可以在init.rc文件中查看)。 Binder只允许一个服务作为名称解析器。在系统中启动的所有其他服务都在ServiceManager中注册。

+0

谢谢。由于没有其他答案,而且评论也没有什么帮助,我会接受这个答案是正确的。 –

+0

如果你想要的话,你可以提出其他问题,如果我管理我会尽力回答。 – Yury

+0

嗯,我想知道,我在哪里可以找到所有通过ServiceManager连接的远程服务的别名? –

0

IAudioService.aidl定义了对其他进程可见的公共方法。在编译过程中,从.aidl产生有一个接口IAudioService在这里您可以找到stub类:

public static abstract class Stub extends android.os.Binder implements android.media.IAudioService{ 

如今类AudioService扩展了这个存根

所有
public class AudioService extends IAudioService.Stub implements OnFinished { 

位置提到的文件,从主机器人文件夹:

./frameworks/base/media/java/android/media/IAudioService.aidl 
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/media/java/android/media/IAudioService.java 
./frameworks/base/media/java/android/media/AudioService.java 
+0

我注意到这是一个超过一年的问题,但也许别人会在某一天发现它有用。 –