Linux 稳定内核版本合并

每天都有大量的更改提交到上游 Linux 内核。通常不会评估这些更改对安全性的影响,但其中许多更改都有可能影响内核的安全性。评估每项更改对安全性的影响是一项成本高昂且很可能并不可行的操作。相比之下,一种更可持续且更易于维护的方法是定期与上游 Linux 内核同步更改。

我们建议您定期使用较新的长期支持 (LTS) 内核来更新设备。定期的 LTS 更新有助于在公开披露或被恶意攻击者发现之前解决无法识别的潜在安全漏洞,如 2019 年早些时候发布的这篇 Project Zero 报告中所述的问题。

前提条件

  • Android 通用内核分支(来自 AOSP)
  • 目标设备内核的 LTS 合并暂存分支
  • 设备内核发布分支
  • Git 代码库
  • 内核构建工具链

合并 LTS 更改

合并 LTS 更改
图 1:合并 LTS 更改

下面概述了 LTS 合并的典型步骤。

  • 将目标内核发布分支反向合并到 LTS 暂存分支
  • 在本地将 Linux 稳定内核分支或 Android 通用内核分支合并到 LTS 暂存分支
  • 解决合并冲突(根据需要,咨询区域负责人/代码所有者)
  • 在本地构建并执行健全性/单元测试(请参阅下面的测试部分)
  • 上传 Android 通用内核分支更改并将其合并到 LTS 暂存分支
  • 使用 LTS 暂存分支进行全面测试(请参阅下面的测试部分)
  • 查看测试结果
  • 解决所有退化问题,并根据需要平分合并
  • 将 LTS 暂存分支合并到主设备内核发布分支
  • 为您的设备创建包含暂存 LTS 内核的新 Android build
  • 使用新内核编译发布 build/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 数据线将目标设备连接到您的计算机,并使用 Android 调试桥 (ADB) 将 .ko 推送到该设备。

    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 测试

首先使用新的 LTS 内核和模块在本地构建 -userdebug 映像。

在 /dev/kmsg 日志中查看是否有任何错误,确认没有任何错误后再继续操作。测试以下内容,以确保一切正常。

  • WLAN 网速
  • Chrome 浏览器
  • 使用相机应用拍摄图片和视频
  • 使用内置扬声器和蓝牙耳机播放 YouTube 视频
  • 通过运营商网络拨打电话
  • 通过 WLAN 进行视频通话

自动化测试套件

使用供应商测试套件 (VTS) 提供的测试套件和自动化稳定性压力测试来执行最终验证,以确保产品映像不会退化。