Что такое init в Android и зачем нужен init.rc
Init — это первый пользовательский процесс (PID 1), который после старта ядра монтирует разделы, настраивает SELinux и права, запускает демоны и системные сервисы. Init.rc — декларативный набор правил (on, service и команды типа mount, chmod, start), который управляет порядком и условиями этих действий.
Роль init в цепочке загрузки
Коротко: без init устройство не загрузится в пользовательский интерфейс. Упрощённая последовательность:
- Boot ROM → первичный загрузчик (PBL/SBL/LK) → загрузка boot.img.
- Ядро Linux стартует и монтирует ramdisk, в котором лежит /init — бинарник init (PID 1).
- Init парсит init.rc и связанные файлы, монтирует system/vendor/data, настраивает SELinux, создаёт каталоги, устанавливает права и запускает низкоуровневые демоны (logd, vold, netd) и zygote.
- Zygote поднимает Android Runtime, SystemServer и фреймворк, после чего появляется лаунчер.
Init действует как супервизор для нативных демонов: классы сервисов (core, main, late_start и т. п.) задают порядок, параметры restarts контролируют автоперезапуск, а on
Структура и синтаксис init.rc
Init — бинарник; поведение описано в наборе rc‑файлов. Основные конструкции:
- on
— блок действий для события (on boot, on fs, on property:…). - service
[args] — определение сервиса; параметры: user, group, class, disabled, oneshot, restart и т. п. - Команды внутри: mount, mkdir, chmod, chown, setprop, start, stop, restorecon, write.
Примеры:
- on boot — ранние монтирования и setprop sys.boot_completed=0 → позже устанавливается в 1.
- service zygote /system/bin/app_process ... class main user root group root
Файлы лежат в нескольких местах: корне ramdisk (/init.rc, /init.*.rc), а также в /system, /vendor и /product (init.vendor.rc, init.device.rc и т. п.). Init читает их в определённом порядке и строит таблицу действий.
В первых 200 символах: init — PID 1, читает init.rc и поднимает систему: монтирует разделы, настраивает SELinux/права и запускает демоны.
Практика: когда и как менять init.rc, и какие есть инструменты
Где применяется правка:
- Кастомные прошивки и адаптации под железо.
- Подключение раннего ADB, добавление своих сервисов, изменение политик SELinux. Как безопасно править:
- Разблокируйте загрузчик и сделайте полный бэкап boot.img и userdata.
- Распакуйте boot.img, правьте /init.rc или добавьте init.custom.rc (через import).
- Проверьте синтаксис и права, пересоберите и прошейте образ в тестовом устройстве.
- Используйте логирование раннего этапа (early logd, dmesg, netconsole) для отладки.
Риски: ошибка синтаксиса, неверные права или отключение критичных сервисов приводит к bootloop или кирпичу.
Никогда не правьте init.rc на рабочем устройстве без полного бэкапа (boot.img и разделов). Ошибки легко делают устройство неработоспособным.
Частые ошибки
- Пропущенные imports: дополнительные init.*.rc не подгружаются — сервисы не стартуют.
- Неправильные права/владельцы /dev — демоны не могут открыть устройства.
- Неправильные классы сервисов — критичные службы запустятся слишком поздно.
- Отсутствие restorecon/правильной политики SELinux — процессы падают из‑за неверных контекстов.
FAQ
- Можно ли добавить свой сервис без прошивки? Только если у вас есть root и доступ к соответствующим разделам; на большинстве фабричных устройств требуется пересборка boot.img.
- Как быстро отладить bootloop после правки init.rc? Верните оригинальный boot.img через recovery/fastboot или используйте serial/adb‑early логирование для поиска ошибки парсинга.
- Где посмотреть текущие init-файлы на устройстве? В распакованном boot.img или в /vendor, /system при наличии доступа (root или при сборке прошивки).
Если изучаете загрузку своего телефона, начните с распаковки boot.img и просмотра всех init.*.rc — это покажет реальный порядок монтирования и запуска сервисов для вашей модели.