草庐IT

Android GKI 架构简介

私房菜 2023-04-03 原文

0. 前言

本文简单介绍下GKI 相关的知识点,方便更快的了解GKI 概念和架构,如果想要了解细节,还是要看官网并结合实际。

相关术语:

ACK:Android Common Kernel

AOSP:Android Open Source Project

GKI:Generic Kernel Image

KMI:Kernel Module Interface

LTS:Long Term Supported

DLKM:Dynamically loadable kernel module

GSI:Generic System Image

VTS:Vendor Test Suite

CTS:Compatibility Test Suite

1. ACK

Android Common Kernel 的简称,是所有Android 产品内核的基础。供应商内核和设备内核位于 ACK 的下游。供应商通过修改内核源代码并添加设备驱动程序,添加了对 SoC 和外围设备的支持。这些修改内容可能很多,以至于设备上运行的代码中有多达 50% 是树外代码(并非来自上游 Linux 和 AOSP 通用内核)。

因此,一个设备内核有以下几部分组成:

  • 上游:来自 kernel.org 的 Linux 内核
  • AOSP:AOSP 通用内核的其他 Android 专用补丁程序
  • 供应商:供应商提供的 SoC 和外围设备支持以及优化补丁程序
  • 原始设备制造商 (OEM)/设备:其他设备驱动程序和自定义项

几乎所有设备都具有自定义内核。这就导致了内核碎片化问题。

图1  Android 内核层次结构导致碎片化问题

2. 碎片化的代价

2.1 安全更新需要耗费大量人力

Android 安全公告 (ASB) 中引用的安全补丁程序必须向后移植到每个设备内核中。但是,由于存在内核碎片化问题,向正常使用的 Android 设备传播安全修复的代价非常之高。

2.2 很难合并长期支持的更新

长期支持 (LTS) 版本包含安全修复和其他重大问题修复。事实证明,使用最新的 LTS 版本是提供安全修复的最有效方式。我们发现,ASB 报告的内核安全问题中有 90% 都已在保持最新状态的 Pixel 设备上得到修复。

不过,由于设备内核中所有的自定义修改,很难仅将 LTS 修复合并到设备内核中。

2.3 妨碍 Android 平台进行版本升级

由于碎片化问题,很难向正常使用的设备添加需要更改内核的 Android 新功能。Android 框架代码必须假设支持的内核版本多达 5 个,并且没有针对新的平台版本进行任何内核更改(Android 10 支持内核版本 3.18、4.4、4.9、4.14 和 4.19;在某些情况下,这些版本自 2017 年 Android 8 发布以来还未添加新功能)。

2.4 很难将内核更改贡献回上游 Linux

对内核进行完所有更改后,大多数旗舰设备附带的内核版本已经至少存在 18 个月了。例如,kernel.org 于 2017 年 11 月发布了 4.14 版内核,而首批使用 4.14 版内核的 Android 手机于 2019 年春季才发布。

上游内核发布与产品发布之间的这种长时间延迟导致 Android 社区很难将所需的功能和驱动程序馈送到上游内核中,因此解决碎片化问题并非易事。

3. GKI

GKI 通过统一核心内核并将 SoC 和板级支持从核心内核移至可加载模块中,解决了内核碎片化问题。GKI 内核为内核模块提供了稳定的内核模块接口 (KMI),因此模块和内核可以独立进行更新。

GKI 有以下特点:

  • GKI 从ACK sources 编译而来;
  • GKI 是每个架构和每个 LTS 版本的single-kernel binary 加上关联的可加载模块。(目前只有适用于 android11-5.4 和 android12-5.4 的 arm64);
  • GKI 已经过了关联 ACK 支持的所有 Android 平台版本的测试。在 GKI 内核版本的生命周期内不会发生功能弃用;
  • GKI 为给定 LTS 中的驱动程序提供了稳定版 KMI;
  • GKI 不包括SoC 专用代码或板卡专用代码;
图2  GKI kernel 和vendor模块 架构

更新点的ACKs 也称为 GKI kernels,因为它们支持分离硬件无关的通用核心内核代码和硬件无关的GKI 模块。GKI kernel 与特定于硬件的供应商模块交互,这些模块包含芯片上的系统和特定于板的代码。GKI kernel 和供应商模块之间的交互,是通过KMI 来实现的,该接口由标识供应商模块所需的函数和全局数据的符号列表组成。

3. GKI 阶段变化

GKI 是一个复杂的变化,它从Android 11版本中的 v5.4 内核开始,分几个阶段推出。

3.1 GKI 1.0

对于 Android 11 平台版本,为了保证与 Treble 兼容,必须对运行 v5.4 内核的设备进行 GKI 测试。

图3 用于GKI 兼容性测试的分区

具备 GKI 兼容性是指设备通过将 GKI 启动映像刷写到 boot 分区并将 GSI 系统映像刷写到 system 分区来安装通用系统映像 (GSI) 和 GKI 内核,因此通过了 VTS 和 CTS-on-GSI+GKI 测试。设备可以附带不同的产品内核,并且可以使用 GKI 未提供的可加载模块。不过,产品内核和 GKI 内核都必须从相同的 vendor_boot 和 vendor 分区加载模块。因此,所有产品内核都必须具有相同的二进制内核模块接口 (KMI)。供应商可以扩展产品内核的 KMI,前提是它与 GKI KMI 兼容。GKI 1.0 不要求供应商模块可卸载。

GKI 1.0 的目标

  • 当产品内核被 GKI 内核取代时,不在 VTS 或 CTS 中引入性能降低问题。
  • 减少 OEM 和供应商为了使 AOSP 通用内核保持最新状态而进行的内核维护工作。
  • 无论是升级到新 Android 平台版本的设备还是新发布的设备,都在内核中加入核心 Android 变更。
  • 绝不破坏 Android 用户空间。
  • 将硬件专用组件作为可加载模块从核心内核中分离出来。

3.2 GKI 2.0

搭载 Android S (2021) 平台版本且使用内核版本 v5.x(5.x 是 2020 年年底被选为 LTS 的内核版本)或更高版本的设备必须附带 GKI 内核。将提供已签名的启动映像,并通过 LTS 和重大问题修复定期对其进行更新。由于 KMI 将保持二进制稳定性,因此无需对供应商映像进行任何更改,即可安装这些启动映像。

GKI 2.0 的目标

  • 不为 GKI 引入明显的性能或能效降低问题。
  • 使 OEM 无需供应商参与即可提供内核安全修复和问题修复 (LTS)。
  • 降低更新设备主要内核版本(例如,将 v5.x 更新为 v5.y)所需的费用。
  • 通过按照清晰的升级过程更新内核版本,只为每个架构维护一个 GKI 内核二进制文件。

4. GKI 设计

4.1 ACK KMI kernel 分支

GKI kernels 拥有稳定的KMI。KMI 是通过kernel version 和Android platform release 的唯一标识,因此,branches 可以命名为 <androidRelease>-<kernel version>. 例如,Android 11 的5.4 GKI kernel 命名为 android11-5.4。Android 12 有两个GKI kernels,android12-5.4 android12-5.10

4.2 Common kernel 层次结构

图4   5.x KMI 内核层次结构

如图,KMI 分支会经历三个阶段:开发阶段 (dev)、稳定阶段 (stab) 和冻结阶段。

KMI 内核被冻结后,除非发现严重的安全问题,并且在不影响稳定版 KMI 的情况下无法解决该问题,否则不会接受任何 KMI 破坏性更改。分支在其整个生命周期内都将保持冻结状态。

冻结的分支中可以接受问题修复和合作伙伴功能,前提是不破坏现有 KMI。只要不影响构成当前 KMI 的接口,就可以使用新的导出符号扩展 KMI。将新接口添加到 KMI 后,它们会立即进入稳定状态,并且不能被将来的更改破坏。

例如,不允许执行向 KMI 接口所用的结构添加字段的更改,因为这会改变接口定义:

struct foo {
  int original_field1;
  int original_field2;
  int new_field; // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_something(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

 但可以添加新函数:

struct foo_ext {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo_ext &myarg)
{
  do_something_else(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

 

 

参考:

https://source.android.google.cn/devices/architecture/kernel/generic-kernel-image

有关Android GKI 架构简介的更多相关文章

  1. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  2. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  3. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  4. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  5. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  6. pytest简介 - 2

    介绍pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等测试用例的skip和xfail处理可以很好的和jenkins集成

  7. ruby - 写密集型特征的架构 - 2

    我在当前项目中使用由Oracle数据库和memcached支持的RubyonRails。有一个非常常用的功能,它依赖于单个数据库View作为数据源,并且该数据源内部有其他数据库View和表。这是一个虚拟数据库View,能够从一个地方访问所有内容,而不是物化数据库View。大多数情况下,如果用户正在使用他们希望更新的功能,那么让数据保持最新很重要。从这个View获取数据时,我将安全表内部连接到View(安全表不是View本身的一部分),其中包含一些我们用来在更细粒度级别上控制数据访问的字段。例如,安全表有user_id,prop_1,prop_2列,其中prop_1,prop_2是数据库

  8. SpringCloud入门实战(七)-Hystrix入门简介 - 2

    📝学技术、更要掌握学习的方法,一起学习,让进步发生👩🏻作者:一只IT攻城狮。💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。❤️《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址👉🏻SpringCloud入门实战系列不迷路👈🏻:SpringCloud入门实战(一)什么是SpringCloud?SpringCloud入门实战

  9. ruby - 模块化、基于组件的 Sinatra 应用程序的架构 - 2

    我正在开发一个包含大约10个不同功能组件的Sinatra应用程序。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全从config.yaml文件配置,如下所示:components:-route:'/chunky'component_type:FoodListercomponent_settings:food_type:baconmax_items:400-route:'places/paris'component_type:Mappercomponent_settings:latitude:48.85387273165654longitude:2.340087890625-

  10. 【哈士奇赠书活动 - 20期】-〖从程序员到架构师〗 - 2

    文章目录⭐️赠书活动-《从程序员到架构师》⭐️编辑推荐⭐️作者简介⭐️赠书活动→获奖名单⭐️赠书活动-《从程序员到架构师》内容简介:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》分为数据持久化层场景实战、缓存层场景实战、基于常见组件的微服务场景实战、微服务进阶场景实战和开发运维场景实战5个部分。基于对十余个架构搭建与改造项目的经验总结,介绍了大数据量、缓存、高并发、微服务、多团队协同等核心场景下的架构设计常见问题及其通用技术方案,包含冷热分离、查询分离、分表分库、秒杀架构、注册发现、熔断、限流、微服务等具体需求下的技术选型、技术原理、技术应用、技术要点等内容,将

随机推荐