2013-12-16 3 views
1

Чтобы избежать бесполезного ответа о том, как реализовать AIDL в своем собственном проекте, я понимаю, как использовать AIDL в вашем собственном проекте.Как именно Android связывает AIDL-интерфейс и удаленную службу?

Для меня непонятно, как он используется в исходном коде Android?

Например, в пакете android.media имеется интерфейс IAudioService AIDL. И есть java-файл AudioService. И есть много примеров, где интерфейс определен в IInterfaceServiceName.aidl, а реализация - в InterfaceServiceName.java. Итак, я думал, что внутренности AIDL ищут Сервис с именем без первого капитала I, а затем используют его. Однако эта теория была снесена IWifiManager и WifiService.

Все эти реализации AIDL, однако, разделяют одну вещь - все они расширяют класс IInterfaceName.Stub. Итак, это означает, что внутренние объекты AIDL ищут классы, расширяющие IInterfaceName.Stub? Но что, если есть несколько классов, расширяющих его? И эти классы вообще не являются сервисами ...

Или есть какой-то Service Manager, который каким-то образом создает Сервисы с такими реализациями AIDL как Binders? Если да, пожалуйста, направьте меня к такому таинственному менеджеру службы.

EDIT: Я нашел этого сервис-менеджера. Это ServiceManager в пакете android.os. Теперь понятно, почему эти SomethingService фактически не являются сервисами, а на самом деле являются IBinders - диспетчер сервисов каким-то образом создает службы с данным IBinder методом add service (String, IBinder). Но теперь путаница только ухудшается. Реализация этой услуги также заключается в несколько странном ServiceManagerNative, который включает удаленную транзакцию с неизвестным IBinder. Теперь я полностью потерян. Как же запускается этот ServiceManager? Как добавляются сервисы?

+0

попробуйте прочитать эту http://mobileorchard.com/android-app-development-implementing-remote-android-services-with-aidl/ – pskink

+0

Вы не читали вопрос пихта что вы сделали? Мне НЕ интересно, как реализовать AIDL в моем приложении - я знаю, как это сделать. Вместо этого я пытаюсь понять, как именно подключаются системные службы Android и AIDL, такие как IWifiManager. –

+0

, поэтому у вас нет проблем с самим sidl, но wanr, чтобы знать внутренности Android, не так ли? – pskink

ответ

2

ServiceManager не имеет случайного, но предопределенного значения. Это Service with Binder handle равным 0. Во время загрузки системы ServiceManager является одной из первых служб, запускаемых системой (вы можете проверить это в файле init.rc). Связующее позволяет разрешить только одну услугу в качестве преобразователя имен. Все остальные службы, запущенные в системе, регистрируются ServiceManager.

+0

Спасибо.Поскольку нет других ответов, и комментарии не так полезны, я буду принимать этот ответ как правильный. –

+0

Если вы хотите, вы можете задать дополнительные вопросы, и если мне удастся, я постараюсь ответить. – Yury

+0

Ну, я хотел бы знать, где я могу найти псевдонимы для всех удаленных служб, которые подключаются ServiceManager? –

0

IAudioService.aidl определяет общедоступные методы, которые видны для других процессов. Во время компиляции из .aidl есть интерфейс IAudioService генерируется, в котором вы можете найти Сто класс:

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

теперь класс аудиообслуживание расширяет этот Stub

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

Я заметил, что это вопрос, который может быть более года назад, но, возможно, кто-то еще найдет его полезным когда-нибудь. –

 Смежные вопросы

  • Нет связанных вопросов^_^