Наверняка у тебя как у пользователя Android возникало желание сделать операционную систему лучше, добавить полезное, убрать лишнее и поделиться своим творением с обществом. Сборка собственной прошивки из исходников — сложный процесс, требующий глубоких знаний предмета, однако никто не запрещает взять стандартную прошивку смартфона и адаптировать ее под свои нужды. Это не так уж и сложно сделать.

Начнем с того, что тебе нужен Linux. В Windows ты сможешь только разобрать прошивку, но собрать обратно уже не получится по чисто техническим причинам. Теперь о прошивке. Обычно они распространяются в виде ZIP-архивов, прошиваемых через кастомные рекавери. Именно один из них нам и понадобится для опытов. Начинать путь ромодела я рекомендую с какой-нибудь максимально приближенной к AOSP кастомной прошивки, потому что в ней зачастую проще разобраться, чем в стоке.

Нужный ZIP можно найти на XDA Developers или 4PDA. Но имей в виду, что нужна прошивка конкретно для твоей модели аппарата, — у того же Galaxy S7 есть несколько модификаций для разных рынков, не всегда совместимых между собой.

 

Структура ZIP-файла с прошивкой

После загрузки распакуем архив с помощью любого архиватора. Внутри будет следующий набор файлов и папок:

  • META-INF — папка с метаинформацией о прошивке (сертификат автора, манифест со списком файлов, их контрольными суммами), скриптом обновления (updater-script) и инсталлятором (update-binary), который выполняет команды скрипта по монтированию разделов, копированию файлов и другим действиям с NAND-памятью;
  • boot.img — образ с ядром и RAM-диском (он прошивается в раздел boot);
  • system.new.dat — это, грубо говоря, и есть сама прошивка, а точнее образ раздела system, содержащий операционную систему Android за вычетом ядра;
  • system.transfer.list — содержит список команд, которые необходимо выполнить, чтобы поблочно скопировать содержимое system.new.dat в раздел system при установке прошивки;
  • system.patch.dat — используется для OTA-обновлений, то есть выборочного внесения изменений в прошивку; если прошивка «полная», он имеет нулевой размер.
Содержимое ZIP-файла прошивки LineageOS для Nexus 5
Содержимое ZIP-файла прошивки LineageOS для Nexus 5
 

Распаковываем system.new.dat

Файлы system.new.dat и system.transfer.list представляют для нас наибольший интерес. Точнее, не они, а содержащаяся в них система. Но добраться до нее не так просто.

 

Скрипт

Самые ленивые могут разобрать прошивку с помощью скрипта System_Extractor-Linux.

  1. Распаковываем архив с прошивкой в любую папку.
  2. Качаем скрипт по ссылке и разархивируем в любую папку.
  3. Запускаем файл ext (если будет ругаться на отсутствие Java, просто пропусти, нажав y; Java нужна только для запаковки).
  4. Теперь выбираем распаковку, нажав кнопку 1, а затем Enter.
  5. Новая папка с именем extract_* появится рядом с файлом ext и папкой tools. Копируем в нее файлы system.new.dat и system.transfer.list.
  6. После копирования файлов нажимаем Enter и ждем. Через некоторое время нужно будет опять нажать Enter, ввести пароль администратора и еще раз тапнуть Enter.
  7. Готово. Содержимое system в папке extract_*/output.
Скрипт для распаковки system.new.dat в Linux
Скрипт для распаковки system.new.dat в Linux
 

Ручной способ

Распаковываем архив с прошивкой в любую папку (например, в rom):

$ mkdir ~/rom
$ unzip путь_до_архива -d ~/rom/

Скачиваем нужные нам инструменты в эту папку:

$ cd ~/rom
$ wget https://github.com/xpirt/sdat2img/raw/master/sdat2img.py

Запускаем скрипт:

$ chmod +x sdat2img.py
$ ./sdat2img.py system.transfer.list system.new.dat system.img

Он преобразует файл system.new.dat в raw-образ с именем system.img. Монтируем образ к подпапке mnt:

$ mkdir mnt
$ sudo mount -t ext4 -o loop system.img ~/rom/mnt
Содержимое образа system
Содержимое образа system
 

Структура каталогов Android

После распаковки system появится следующая каталоговая структура:

  • app — предустановленные приложения со стандартными привилегиями;
  • priv-app — предустановленные приложения с повышенными привилегиями, в том числе некоторые компоненты системы;
  • bin — бинарные файлы формата ELF, аналог каталогов /bin и /usr/bin в Linux. Содержит различные системные компоненты, используемые более высокоуровневыми компонентами системы;
  • etc — файлы настроек. Полный аналог /etc в Linux, используемый, однако, только теми самыми системными компонентами. Приложения Android хранят индивидуальные настройки в каталогах /data/data/;
  • fonts — шрифты. По умолчанию содержит только фирменные шрифты Roboto;
  • framework — библиотеки Java-классов, используемых системой и приложениями. Тут же лежит файл framework-res.apk, содержащий полное описание интерфейса операционной системы, включая все графические файлы;
  • lib и lib64 — Linux-библиотеки, используемые низкоуровневыми компонентами системы. Аналог каталогов /lib и /usr/lib в Linux, включая такие стандартные библиотеки, как libc, libz, libssl. На устройствах с архитектурой ARMv7 и ниже каталог lib64 будет отсутствовать;
  • media — медиафайлы: рингтоны, звуки уведомлений, звуки интерфейса и анимация загрузки ОС;
  • tts — файлы, необходимые синтезатору речи;
  • usr — каталог, который обычно содержит файлы, необходимые для работы приложений из каталога bin. По сути, аналог /usr/share;
  • vendor — файлы, поставляемые производителем устройства. Обычно содержит бинарный firmware для различных железных компонентов, например модуля Wi-Fi;
  • xbin — необязательный каталог; кастомные прошивки используют его для хранения таких вещей, как интерпретатор bash, SSH, PowerTOP, BusyBox, и других полезных инструментов;
  • build.prop — файл, содержащий информацию о сборке, а также различные низкоуровневые настройки;
  • addon.d — содержит скрипты, запускаемые после установки прошивки. Сюда же GApps прописывают свой скрипт, благодаря которому возрождаются после переустановки прошивки.

Ознакомившись с базовой структурой Android, начнем вносить изменения.

 

Удаляем и добавляем приложения

Все предустановленные программы можно найти в двух папках:

  • /system/app/;
  • /system/priv-app/.

Друг от друга они отличаются привилегиями доступа. Если программы из app имеют такие же полномочия, как сторонние программы (например, установленные из Play Store), то приложения из priv-app могут использовать привилегированные API (права privileged). Подробнее об этом можно узнать из нашей статьи.

Для предустановки приложения в прошивку просто кинь ее APK-файл в /system/app/. Можно, конечно, создать отдельную папку, но в нашем случае в этом нет смысла, потому что папка служит для хранения библиотек и odex-файлов, которых у нас попросту нет. Для удаления просто удали папку с ним.

Можно пойти дальше и поменять стоковые приложения на аналоги. К примеру, для замены календаря удаляем папку Calendar и копируем в /system/app наш любимый com.rpagyc.simplecalendar.apk. А можно и не копировать. Тогда прошивка будет без календаря.

Главное, помни: стоковые программы могут быть связаны между собой. Поэтому удаление одной проги вполне может привести к полной неработоспособности другой (к примеру, CalendarProvider и Calendar: удалив первый, ты сделаешь неработоспособным не только стоковый, но и любой другой календарь). К счастью, в чистых AOSP-прошивках взаимосвязей не так много.

 

Меняем анимацию загрузки

Анимация хранится в виде PNG-картинок, упакованных в архив /system/media/bootanimation.zip без сжатия. Внутри архива находятся:

  • desc.txt — файл, описывающий анимацию;
  • part0 — папка с файлами анимаций, которые воспроизводятся первыми;
  • part1 — папка с файлами анимаций, которые воспроизводятся вторыми;
  • part? — крайняя папка, изображения с которой воспроизводятся в конце.

Файл desc.txt может содержать нечто вроде

1920 1080 60
p 1 0 part0
p 0 0 part1

Назначение этих строк интуитивно понятно: 1920 × 1080 — разрешение картинки, 60 — число кадров в секунду. Part0 и part1 указывают на папки, из которых будет воспроизводиться анимация, и последовательность воспроизведения. Вообще, может быть как одна часть, так и несколько (три и больше).

Изображения, находящиеся в папках part, пронумерованы пятью цифрами в порядке воспроизведения: 00000.png, 00001.png, 00002.png… Эти изображения можно поменять на свои, тем самым создав оригинальную анимацию. А можно просто удалить файл bootanimation.zip. Тогда девайс будет показывать анимацию из стандартного Android. Или воспользоваться уже готовой коллекцией анимаций на 4PDA.

Четыре части в bootanimation.zip для LineageOS
Четыре части в bootanimation.zip для LineageOS

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …