RK3568平台 Android13 GKI架构开发方式

一.GKI简介

GKI:Generic Kernel Image 通用内核映像。
Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像,是google为了解决内核碎片化的问题,而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加载模块中。核心内核为驱动模块提供了稳定的内核模块接口,模块驱动和核心内核可以独立进行更新。内核接口可以通过upstream的方式进行扩展。 Soc和板级厂商在驱动开发时需要使用已经定义的内核接口,如果要新加核心内核接口需要提交给google,这个周期会比较长,所以要提前做好开发准备。


二.什么产品需要使用GKI

使用Android13且需要过GMS认证和EDLA认证的产品。

使用Android12 的RK3588和RK3588S的需要过GMS认证和EDLA认证的产品。

不过GMS认证和EDLA认证的产品不强制要求使用GKI。

三.碎片化的代价

1.安全更新需要耗费大量人力:

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

2.很难合并长期支持的更新:

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

3.妨碍 Android 平台进行版本升级

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

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

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

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

四.GKI和非GKI的差别

通用内核boot.img:

GKI非GKI
由google定期发布boot.img,代码不能自己修改由RK提供内核源码编译,可以自由修改

驱动模块:

GKI非GKI
以KO的形式加载,调用的内核接口必需是google发布的boot.img里面包含的内嵌在boot中,由RK提供内核源码编译,可以自由修改和添加内核接口

kernel代码:

GKI非GKI
RK发布的kernel源码仅用于编译驱动模块的KORK发布的kernel源码用于完整的内核和模块驱动的编译,模块以.o的形式内嵌编译

 

五.Rockchip GKI编译

uboot需要打开AB配置:

~/a2_Android13_sdk/u-boot$ git diff
diff --git a/configs/rk3568_defconfig b/configs/rk3568_defconfig
index fbd9820acc..e23e438792 100644
--- a/configs/rk3588_defconfig
+++ b/configs/rk3588_defconfig
@@ -207,6 +207,7 @@ CONFIG_RSA_N_SIZE=0x200
CONFIG_RSA_E_SIZE=0x10
CONFIG_RSA_C_SIZE=0x20
CONFIG_SHA512=y
CONFIG_LZ4=y
CONFIG_LZMA=y
CONFIG_SPL_GZIP=y
@@ -220,3 +221,4 @@ CONFIG_RK_AVB_LIBAVB_USER=y
CONFIG_OPTEE_CLIENT=y
CONFIG_OPTEE_V2=y
CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
+CONFIG_ANDROID_AB=y

增加板级的KO load文件
Rockchip的GKI框架里面加载KO的load文件有区分芯片平台驱动和板级驱动,所以在开发新产品的时候需要增加板级驱动的KO load文件,load文件以device下面产品目录中定义PRODUCT_KERNEL_DTS的dts的名字命名,并且保存在mkcombinedroot/res/board/下面,如:

wlq@sys2_206:~/a0_Android13_gki$ tree mkcombinedroot/res/board/
mkcombinedroot/res/board/
├── px30-mini-evb-ddr3-v11-avb.load
├── rk3326-863-lp3-v10-rkisp1.load
├── rk3326-evb-lp3-v10-avb.load
├── rk3399-evb-ind-lpddr4-android-avb.load
├── rk3399-evb-ind-lpddr4-v13-android-avb.load
├── rk3562-evb1-lp4x-v10.load
├── rk3562-rk817-tablet-v10.load
├── rk3566-evb2-lp4x-v10.load
├── rk3566-rk817-tablet.load
├── rk3568-evb1-ddr4-v10.load
├── rk3588-evb1-lp4-v10.load
├── rk3588-evb7-lp4-v10.load
└── rk3588s-tablet-v10.load

板级的KO load文件里面放的是板级的驱动模块,如:触摸屏、camera、sensor等芯片平台以为的驱动模块,如:

wlq@sys2_206:~/a0_Android13_gki$ cat mkcombinedroot/res/board/rk3588-evb1-lp4-v10.load
cw2015_battery.ko
imx415.ko
ov50c40.ko
ov13855.ko
gt1x-ts.ko
snd-soc-es8323.ko

Android的device产品目录下配置GKI选项:

~/a2_Android13_sdk/device/rockchip/rk3588$ git diff
diff --git a/rk3588_t/BoardConfig.mk b/rk3588_t/BoardConfig.mk
old mode 100644
new mode 100755
index 50da541..06da5f3
--- a/rk3588_t/BoardConfig.mk
+++ b/rk3588_t/BoardConfig.mk
@@ -15,10 +15,21 @@#include device/rockchip/rk3588/BoardConfig.mkBUILD_WITH_GO_OPT := false
+BOARD_BUILD_GKI := true-# AB image definition
-BOARD_USES_AB_IMAGE := false
-BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false
+ifeq ($(strip $(BOARD_BUILD_GKI)), true)
+    #for gki
+    # AB image definition
+    BOARD_USES_AB_IMAGE := true
+    BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := true
+    PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config
+else
+    BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false
+    BOARD_USES_AB_IMAGE := false
+    PRODUCT_KERNEL_CONFIG := rockchip_defconfig android-13.config
+endifBOARD_GRAVITY_SENSOR_SUPPORT := trueBOARD_COMPASS_SENSOR_SUPPORT := true
@@ -26,14 +37,21 @@ BOARD_SENSOR_COMPASS_AK8963-64 := trueBOARD_GYROSCOPE_SENSOR_SUPPORT := trueBOARD_PROXIMITY_SENSOR_SUPPORT := trueBOARD_LIGHT_SENSOR_SUPPORT := trueifeq ($(strip $(BOARD_USES_AB_IMAGE)), true)include device/rockchip/common/BoardConfig_AB.mkTARGET_RECOVERY_FSTAB := device/rockchip/rk3588/rk3588_t/recovery.fstab_ABendif
-
+ifeq ($(strip $(BOARD_BUILD_GKI)), true)
+    #for gki
+    BOARD_SUPER_PARTITION_SIZE := 4294967296
+    BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_SIZE := $(shell expr $(BOARD_SUPER_PARTITION_SIZE) - 4194304)
+endifPRODUCT_UBOOT_CONFIG := rk3588PRODUCT_KERNEL_DTS := rk3588-evb1-lp4-v10BOARD_GSENSOR_MXC6655XA_SUPPORT := trueBOARD_CAMERA_SUPPORT_EXT := true

完整编译方式与非GKI的一样:

source  build/envsetup.sh
lunch rk3588_t-userdebug
./build.sh -ACUKup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

008、所有权

所有权可以说是Rust中最为独特的一个功能了。正是所有权概念和相关工具的引入,Rust才能够在没有垃圾回收机制的前提下保障内存安全。 因此,正确地了解所有权概念及其在Rust中的实现方式,对于所有Rust开发者来讲都是十分重要的。在本文中&…

创新技术,助力电力行业:配网故障定位系统的应用与优势

随着科技的不断发展,电力行业也在不断地进行技术创新。在这个过程中,配网故障定位系统作为一种新型的技术手段,为电力行业的安全生产和管理提供了有力的支持。本文将介绍配网行波型故障预警与定位系统的应用与优势,以期为电力行业…

PHP特性知识点扫盲 - 下篇

概述 在实际的生产环境中遇到了实际需要解决的问题,需要把服务部署的方式梳理出来,在同一个服务器中部署多个PHP环境,架构图如下: 架构方案 在工作实践中遇到的很多问题的普遍性都是相通的,公司运行的可新项目都是版…

腾讯云轻量应用服务器和云服务器哪个好?肯定是...

腾讯云轻量应用服务器和云服务器哪个好?云服务器CVM更好,但是轻量应用服务器性价比更高,轻量应用服务器CPU内存公网带宽配置更高,价格更优惠。腾讯云服务器网txyfwq.com轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&…

复盘2023年,让你变强的54句话(句句扎心!)

w关注 ▲晓衡的游戏开发圈▲ 一起共同成长这是晓衡公众号第 525 篇原创分享 罗翔老师说:“我觉得人最大的痛苦,就是无法跨越知道和做到的鸿沟。”最怕问初衷,梦幻成空,年少励志三千里,踌躇百步无寸功,转眼高…

第十二章 创建Callout Library - 为旧版短字符串配置 $ZF 堆

文章目录 第十二章 创建Callout Library - 为旧版短字符串配置 $ZF 堆为旧版短字符串配置 $ZF 堆 第十二章 创建Callout Library - 为旧版短字符串配置 $ZF 堆 为旧版短字符串配置 $ZF 堆 注意:本节仅适用于旧版短字符串(请参阅“使用 B 链接类型传递短…

微服务-理论(CAP,一致性协议)

CAP理论 关于CAP理论的介绍可以直接看这篇文章 CAP分别是什么? 一致性(Consistency 一致性包括强一致性,弱一致性,最终一致性。 一致性其实是指数据的一致性,为什么数据会不一致呢? 如上面这张图&…

下界通配符(? super Type)

在Java中,? super Type是一个下界通配符,表示参数化类型的下限是Type。这意味着容器可以持有Type类型的任何对象或者Type的父类型对象。 使用场景 这种类型的通配符通常用于泛型方法中,允许方法接受Type的实例或其父类型的集合。这是基于PE…

【最优化方法】对称矩阵的对角化

文章目录 正交化方法示例 矩阵正交化 正交化方法 设 R n R^n Rn 中线性无关组 a 1 , a 2 , a 3 , … , a n a_1,a_2,a_3,\dots,a_n a1​,a2​,a3​,…,an​,令 β 1 α 1 β 2 α 2 − [ α 2 β 1 ] ∣ ∣ β 1 ∣ ∣ β 1 β 3 α 3 − [ α 3 β 1 ] ∣ ∣…

oCPC实践录 | 目标ROI的出价与转化回传调控算法

这篇文章我们聊聊广告主在oCPC下,怎么调控自己的出价或者回传转化优化自己的ROI。 ROI是广告主最关心的指标了,根据oCPC出价的基本原理ocpc_bid pcvr * given_cpa * k, 广告主在整个出价中有两个可以控制的变量来影响出价,一个是直接的give…

NB-IoT BC260Y Open CPU SDK⑱ctlwm2m连接天翼物联CWing平台

NB-IoT BC260Y Open CPU SDK⑱ctlwm2m连接天翼物联CWing平台 1、平台介绍2、SDK支持CTLWM2M协议2、CTLWM2M API的使用3、软件设计1)、上报业务数据2)、上报报警事件3)、上报故障事件4)、接收平台数据并应答5)、根据唤醒模式触发不同的应用4、实例分析5、以下是调试的结果:…

Redis缓存穿透,缓存击穿,缓存雪崩

文章目录 Redis缓存穿透,缓存击穿,缓存雪崩1. 缓存穿透1.1 解决方案1:缓存空数据1.2 解决方案2:使用布隆过滤器1.2.1 布隆过滤器介绍 2. 缓存击穿2.1 解决方案1:互斥锁2.2 解决方案2:逻辑过期 3. 缓存雪崩3…

NumPy 中级教程——随机数生成

Python NumPy 中级教程:随机数生成 在数据科学、机器学习和统计学等领域中,随机数生成是一个关键的操作。NumPy 提供了丰富的随机数生成功能,包括生成服从不同分布的随机数、设置随机种子等。在本篇博客中,我们将深入介绍 NumPy …

【漏洞复现】OpenSSH ProxyCommand命令注入漏洞(CVE-2023-51385)

文章目录 前言一、漏洞背景二、漏洞详情三、影响范围四、漏洞验证 前言 OpenSSH存在命令注入漏洞(CVE-2023-51385),攻击者可利用该漏洞注入恶意Shell字符导致命令注入。 一、漏洞背景 OpenSSH 是 SSH (Secure SHell&#xff09…

Oracle笔记-查看表已使用空间最大空间

目前以Oracle18c为例,主要是查这个表USER_SEGMENTS。 在 Oracle 18c 数据库中,USER_SEGMENTS 是一个系统表,用于存储当前用户(当前会话)拥有的所有段的信息。段是 Oracle 中分配存储空间的逻辑单位,用于存…

HTTP协议编程实战(二)实战二

使用析构函数主要是在里面关闭套接字(socket); waitForReadyRead()里面参数是毫秒,失败返回false; \r\n表示请求头部已经结束了,HTTP/1.1是版本号,200 ok表示请求响应成功 关闭的话就在前面加/

javaScript中的常用事件

文章目录 javaScript中什么是事件?基本原理javaScript中的时间使用1,窗口事件1.1、onblur1.2、onfocus1.3、onload1.4、onresize 2,表单事件2.1、onchange2.2、**oninput**2.3、oninvalid2.4、onselect2.5、onsubmit 3,键盘事件3.…

国科大图像处理2023速通期末——汇总2017-2019

国科大2023.12.28图像处理0854期末重点 图像处理 王伟强 作业 课件 资料 一、填空 一个阴极射线管它的输入与输出满足 s r 2 sr^{2} sr2,这将使得显示系统产生比希望的效果更暗的图像,此时伽马校正通常在信号进入显示器前被进行预处理,令p…

记录爬虫编写步骤

本文讲解 Python 爬虫实战案例:抓取百度贴吧(https://tieba.baidu.com/)页面,比如 Python爬虫吧、编程吧,只抓取贴吧的前 5 个页面即可。今天一个毕业学生问到一个问题:不清楚编写爬虫的步骤,不…

TF-IDF(Term Frequency-Inverse Document Frequency)算法 简介

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索和文本挖掘的常用算法。它用于评估一个词对于一个文档集合中某个文档的重要性。 这个算法的基本思想是:如果一个词在一个文档中频繁出现,并且在整个文档集合…