Что такое 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 — реакцию на стадии загрузки или изменение properties.

Структура и синтаксис 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. Как безопасно править:
  1. Разблокируйте загрузчик и сделайте полный бэкап boot.img и userdata.
  2. Распакуйте boot.img, правьте /init.rc или добавьте init.custom.rc (через import).
  3. Проверьте синтаксис и права, пересоберите и прошейте образ в тестовом устройстве.
  4. Используйте логирование раннего этапа (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 — это покажет реальный порядок монтирования и запуска сервисов для вашей модели.