Linux-стабильные слияния

Каждый день в исходное ядро ​​Linux вносится значительное количество изменений. Эти изменения обычно не оцениваются на предмет влияния на безопасность, но многие из них потенциально могут повлиять на безопасность ядра. Оценка влияния каждого из этих изменений на безопасность — дорогостоящая и, вероятно, неосуществимая операция. Вместо этого более устойчивый и удобный в обслуживании подход заключается в регулярной синхронизации изменений с исходным ядром Linux.

Рекомендуется регулярно обновлять устройства новыми ядрами с долгосрочной поддержкой (LTS). Регулярные обновления LTS могут помочь устранить потенциальные нераспознанные уязвимости безопасности, такие как отчет Project Zero, опубликованный ранее в 2019 году, до того, как они будут публично раскрыты или обнаружены злоумышленниками.

Предварительные условия

  • Общая ветка ядра Android (из AOSP)
  • Ветка промежуточного слияния LTS для ядра целевого устройства.
  • Ветка выпуска ядра устройства
  • Git-репо
  • Набор инструментов для сборки ядра

Слияние с изменениями LTS

Объединение изменений LTS
Рисунок 1. Объединение изменений LTS.

Следующие шаги описывают типичные шаги LTS-слияния.

  • Обратное слияние целевой ветки выпуска ядра с промежуточной веткой -LTS.
  • Локально объединить стабильную версию Linux или общую версию Android в промежуточную ветку -LTS.
  • Устраните конфликты слияния (при необходимости проконсультируйтесь с владельцами областей/кодов)
  • Сборка локально и выполнение работоспособного/модульного тестирования (см. раздел тестирования ниже).
  • Загрузите и объедините общие изменения Android в промежуточную ветку LTS.
  • Тщательно протестируйте, используя промежуточную ветку -LTS (см. раздел тестирования ниже).
  • Просмотрите результаты теста
  • Устраните любые регрессии, при необходимости выполните слияние пополам.
  • Объединить промежуточную ветку -LTS с веткой выпуска ядра основного устройства.
  • Создайте новую сборку Android для своих устройств, включающую промежуточное ядро ​​LTS.
  • Скомпилируйте релизную сборку/ROM с новым ядром.

Пример слияния с LTS.

Объедините android-4.9 с основной (через промежуточную версию LTS) и проверкой и синхронизацией промежуточной ветки LTS:

repo init -b <Device kernel LTS staging branch>  # init
repo sync
git checkout -b lts <Device kernel LTS staging branch>
git merge <Device kernel release branch>         # back-merge
git commit

На этом этапе лучше всего выполнить обратное слияние с удаленным источником, прежде чем продолжить. После этого объедините общий Android с промежуточной версией LTS.

git merge -X patience android-4.9-q            # LTS merge

Разрешение конфликтов слияния

В большинстве случаев возникают конфликты между общим ядром Android и промежуточной ветвью -LTS. Разрешение конфликтов слияния во время слияний LTS может оказаться сложной задачей, поэтому ниже приведены несколько полезных советов по их решению.

Постепенное слияние

Если с момента обновления ядра устройства с помощью LTS прошло значительное время, велика вероятность, что с момента последнего объединенного обновления было выпущено много (>50) стабильных выпусков. Лучший способ решить эту проблему — медленно наверстывать упущенное, объединяя меньшее количество выпусков за раз (<= 5 второстепенных версий), одновременно тестируя на каждом этапе пути.

Например, если подуровень версии ядра устройства — 4.14.100, а вышестоящий стабильный подуровень — 4.14.155, лучше всего объединять небольшими порциями, чтобы обеспечить возможность адекватного рассмотрения и тестирования разумного объема изменений.

В целом мы обнаружили, что поэтапная работа с пакетами по <= 5 второстепенных выпусков на одно слияние обеспечивает более управляемый набор исправлений.

Тестирование

Быстрый тест загрузки

Чтобы выполнить быстрый загрузочный тест, вам необходимо сначала объединить изменения LTS локально и собрать ядро.
Следующие шаги объясняют процесс быстрой загрузки.

Подключите целевое устройство к компьютеру с помощью USB-кабеля и отправьте .ko на устройство с помощью Android Debug Bridge (ADB).

adb root
adb disable-verity
adb reboot
(wait for device boot-to-home)
adb root
adb remount
adb push *.ko vendor/lib/modules/
adb reboot bootloader

Загрузите dtbo и загрузите образ ядра.

fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)

Проверьте журнал /dev/kmsg на наличие ошибок.

adb shell
su
cat /dev/kmsg  (inspect kernel log for obvious new errors)

Android-тесты

Сначала создайте образ -userdebug локально с новым ядром и модулями LTS.

Проверьте /dev/kmsg на наличие ошибок и убедитесь, что их нет, прежде чем продолжить. Проверьте следующие вещи, чтобы убедиться, что все работает так, как ожидалось.

  • Скорость Wi-Fi
  • Браузер Хром
  • Захват изображений и видео с помощью приложения камеры
  • Воспроизведение видео YouTube со встроенными динамиками и Bluetooth-гарнитурой.
  • Звонки через сеть оператора
  • Видеозвонок через Wi-Fi

Пакеты автоматизированного тестирования

Окончательная проверка, позволяющая гарантировать, что образ продукта не регрессирует, выполняется с использованием наборов тестов, доступных через набор тестов поставщика (VTS), и автоматизированное стресс-тестирование стабильности.