Как собственный исполняемый файл Android принимает подключения к внешним сокетам?

Я работаю над разработкой собственной исполняемой службы Android, которая запускается init (я регистрирую ее в init.rc) при загрузке системы. Этот собственный исполняемый файл создает сокет, прослушивающий 0.0.0.0:4615, и должен принимать подключения извне.

ОС Android K; он работает на комплекте разработки, который имеет интерфейс Ethernet для подключения к локальной сети.

Я провел тест, запустив тот же собственный исполняемый файл в оболочке adb, что и root. Он отлично работает - внешний клиент сокета на моем компьютере с Windows может подключиться к собственному исполняемому файлу и успешно отправить/получить сообщение. Когда я запускаю его с помощью init, он успешно прослушивает 0.0.0.0:4615, но клиент внешнего сокета не может подключиться к нему - в соединении отказано.

Фрагмент, который я добавил в init.rc:

service msger-daemon /system/bin/msgerd
    class main

Когда «ps» проверил пользователя msgerd, мы обнаружили, что это root.

Пожалуйста, помогите, спасибо!


person Tom Shen    schedule 25.11.2014    source источник
comment
Разве сокеты C POSIX не должны работать независимо от типа соединения?   -  person BlamKiwi    schedule 25.11.2014
comment
Наличие службы прослушивания на телефоне может быть проблематичным, потому что, если он не находится в сети WIFI, вы не будете знать заранее, какой адрес он получит, или что телефонная компания разрешит подключения к произвольным портам через свою сеть.   -  person Some programmer dude    schedule 25.11.2014
comment
Не на телефоне, я работаю над комплектом для разработки (платой), который поддерживает Ethernet. И тест, запускающий тот же исполняемый файл в оболочке adb, что и root, проходит. Я хочу знать, как я могу заставить его работать при запуске init.   -  person Tom Shen    schedule 25.11.2014
comment
Может быть, вы можете опубликовать свой сценарий init.rc об услуге.   -  person jobcrazy    schedule 25.11.2014
comment
Фрагмент, который я добавил в init.rc, теперь находится под вопросом.   -  person Tom Shen    schedule 25.11.2014


Ответы (1)


Решается путем добавления файла политики SE в $TOP/external/sepolicy, содержимое этого файла:

# File types must be defined for file_contexts.
type msgerd, domain;
type msgerd_exec, exec_type, file_type;

init_daemon_domain(msgerd)

permissive msgerd;

# Add msgerd to various domains
net_domain(msgerd)
allow msgerd self:capability { net_admin net_raw };

Если у кого-то есть отзыв и совет, добро пожаловать!

person Tom Shen    schedule 27.11.2014