Может ли приложение для Android общаться с собственной службой Android с помощью сокетов?

Я пытаюсь заставить приложение Android общаться с собственной службой (либо кросс-компилированным двоичным файлом ARM, либо скриптом Linux), и мне интересно, могу ли я сделать это с помощью сокетов?

По сути, собственная служба будет запускаться при инициализации и ждать, пока приложение отправит ему данные, прежде чем делать что-то еще.

Возможно ли это, и нужны ли для этого приложению Android права root?

Спасибо.


person user1118764    schedule 06.06.2012    source источник


Ответы (1)


Да, это возможно. И нет, для этого приложению не требуется никакого специального разрешения — для сокета домена unix вам даже не нужно разрешение в Интернете.

Единственное место, где вам потребуется специальное разрешение, это то, что запускает службу - по сути, вы должны дать ему значения oom killer, которые сообщат Android оставить этот процесс в покое и/или настроить его на автоматический перезапуск. В противном случае система Android с ограниченными ресурсами может убить загадочный процесс, который, похоже, не связан с какой-либо конкретной законной деятельностью или услугой.

Более подходящими для Android средствами интеграции, конечно же, было бы реализовать ваш сервис, более похожий на существующие сервисы Android, т. е. с API-интерфейсом-заглушкой, который запускается в клиентском процессе и передает данные через Binder IPC в сервис, работающий в специальном процессе (довольно возможно системный процесс). Это также может упростить регулирование доступа к вашей службе с помощью существующей схемы разрешений пакета/манифеста. Но в конечном счете это стилистическая вещь, и хотя, возможно, в какой-то степени это связано с тем, чтобы Google одобрил ваше устройство, это не единственный способ сделать что-то, что работает.

person Chris Stratton    schedule 06.06.2012
comment
Спасибо. Я написал простое клиентское приложение для Android для подключения к сокету 10.0.2.2, но когда я пытаюсь его запустить, оно зависает. Я думаю, мне не хватает родного сервиса. Могу ли я просто написать его на C, скомпилировать как двоичный файл ARM и запустить на устройстве? 10.0.2.2 работает как петлевой адрес устройства или только для эмуляторов? - person user1118764; 06.06.2012
comment
Это только для эмуляторов. Android официально не поддерживает дополнительные встроенные сервисы — вы можете скомпилировать и запустить один из них, но вам потребуется изменить защищенные настройки, чтобы он продолжал работать. В настоящее время вы можете использовать систему сборки ndk, изменив BUILD_SHARED_LIBRARY на BUILD_EXECUTABLE. - person Chris Stratton; 14.06.2012
comment
Просто чтобы расширить это, хотя вы не можете использовать специальный псевдоним эмулятора 10.0.2.2 на физическом устройстве, вы можете использовать 127.0.0.1, который является стандартным адресом обратной связи. Однако, как я уже упоминал в ответе, может быть предпочтительнее использовать сокет домена unix (локальный сокет на языке java), а не сокет IP, поскольку это позволяет избежать необходимости в разрешении Интернета. - person Chris Stratton; 10.12.2015