2013-12-16 85 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

我注意到這是一個超過一年的問題,但也許別人會在某一天發現它有用。 –