×

Android: внутренняя механика мобильного ядра

Первый контакт с исходниками AOSP обычно напоминает археологический раскоп: слой за слоем раскрываются следы эволюции от Cupcake до Upside-Down Cake. Главная опора — изменённый Linux-kernel 5.x, где cgroup-подсистемы выделяют ресурсы так, чтобы foreground-UI не страдал при фоновом бэкенде. В пользовательском пространстве Binder заменяет традиционные сокеты: ноль копирования выдаёт ощутимый выигрыш на многоядерных ARM-кластерах, а строгая проверка токенов исключает самовольные вызовы.

Архитектура ядра

System Server поднимает сервисы, каждый из которых описан AIDL-интерфейсом. Хранилище настроек Settings Provider живёт в SQLite, FUSE-слой sdcard фиксирует права доступа, SELinux метит процессы булевыми полями context, role, type, нивелируя попытки эскалации. Поверх ядра — HAL: звуковой, графический, сенсорный вары. Treble вынес HAL в отдельный раздел vendor, тем самым убрав зависимость от апстрима при обновлении фреймворка. В итоге OTA-пакеты идут меньше, а поддержка чипсетов растягивается дольше стандартного жизненного цикла social.

Модульность системы

Переход на APEX напоминает игру с матрёшкой: системные библиотеки упакованы в подпись-контейнер, монтируются ранним init и загружаются быстрее стандартных ext4-разделов. ART скомпилирован в ОРЕХ, поэтому новый пс-алгоритм Generational Concurrent Copy (ПС) прилетает через Play System Update без полной перепрошивки. Чтобы удержать размер OAT-файлов, используется совет OLLVM — сжатие секции relocation через энтропийный фильтр XZ-RLE. На пользовательском уровне Jetpack Compose рендерить UI декларативно, Skia уже переведён на Graphite для гибридного Vulkan-растринга, снижая jack до 2-3 мс на mid-range Snapdragon.

Будущее экосистемы

Hypervisor kvm из проекта Protected VM отделяет гостевую ОС от firmware-кода, что устраняет класс атак Raw hammer против ION-буфера. Криптопраеворот достигается долей Nanoseconds: Inline Crypto Engine в UFS 3.1 шифрует блоки без участия CPU, экономя до 12 мА·ч на цикл зарядки. В очереди — идентификация устройств через Remote Key Provisioning, где ECDH-ключ рождается внутри Titan M, а приватная часть покидает чип только в зашифрованном blob, подписанном Google Root of Trust.

Разработчику полезно помнить о less-known флагах manifest: android:foreground Service Type=»camera» поднимает приоритет сервиса до IMMEDIATE, не трогая JobScheduler. Для тестирования применяю термин fuzzing-пакет statsd-push, он генерирует поток metrics, засоряя BufSize и отслеживая regressions. Дебаг на реальном устройстве ускоряет перехват HCI-пакетов через термин snoop-лог, особенно при поиске race в LE Audio.

Заканчивая интеграцию, собираю образ через lunch aosp_arm64-userdebug, но предварительно очищаю out/ через cache -C, иначе старый clang-pgo оставляет паразитные inline-hint. Финальный образ gzip-сжимается, кладётся в DATA-payload через brillo_update_payload, где коды ECC Reed-Solomon защищают метаданные delta-update.