Разработчик Chainfire, извeстный благодаря системе управления root-полномочиями SuperSU, а также приложениям FlashFire, Recently и CF.lumen, рассказывает, как он реализовал поддержку SuperSU для Google Pixel.
Чтобы приложения могли получить доступ root в системе, должно быть как минимум два компонента: бинарный файл su, в Linux-системах используемый для выполнения команд с правами root, и приложение для обработки запросов на root-доступ и вывода соответствующего уведомления на экран.
Ранние приложения для рутинга размещали эти компоненты в разделе system: бинарник su в /system/bin (или /system/xbin), а приложение (Superuser.apk или SuperSU.apk) — в /system/app. Но была в этом подходе проблема: обновление прошивки либо стирало их, либо просто не устанавливалось (если речь об инкрементальном обновлeнии). Тогда Chainfire решил размещать эти компоненты в RAM-диске, который загружается в оперативную память сразу после ядра. Такой подход абсолютно не мешал обновлениям и отлично работал до выхода Android 7.0 и смартфонов Pixel.
[ad name=»Responbl»]
Оказалось, что RAM-диск в них используется только при загрузке в recovery, тогда как содержимое «системного» RAM-диска находится в разделе system. Причем сам раздел system подключается как корень, а не к каталогу /system. Чтобы решить эту проблeму, пришлось создать утилиту, которая формирует RAM-диск заново, модифицирует ядро, чтобы оно загружало RAM-диск. Более того, чтобы она правильно отработала, сама утилита должна загружаться из RAM-диска.
Ссылка на первоисточник