RK3568平台 Android13 GKI架构开发方式

news2024/11/27 19:46:22

一.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.mk
 BUILD_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
+endif

 BOARD_GRAVITY_SENSOR_SUPPORT := true
 BOARD_COMPASS_SENSOR_SUPPORT := true
@@ -26,14 +37,21 @@ BOARD_SENSOR_COMPASS_AK8963-64 := true
 BOARD_GYROSCOPE_SENSOR_SUPPORT := true
 BOARD_PROXIMITY_SENSOR_SUPPORT := true
 BOARD_LIGHT_SENSOR_SUPPORT := true
 ifeq ($(strip $(BOARD_USES_AB_IMAGE)), true)
     include device/rockchip/common/BoardConfig_AB.mk
     TARGET_RECOVERY_FSTAB := device/rockchip/rk3588/rk3588_t/recovery.fstab_AB
 endif
-
+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)
+endif
 PRODUCT_UBOOT_CONFIG := rk3588
 PRODUCT_KERNEL_DTS := rk3588-evb1-lp4-v10
 BOARD_GSENSOR_MXC6655XA_SUPPORT := true
 BOARD_CAMERA_SUPPORT_EXT := true

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

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

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

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

相关文章

29 UVM Command Line Processor (CLP)

随着设计和验证环境的复杂性增加,编译时间也增加了,这也影响了验证时间。因此,需要对其进行优化,以便在不强制重新编译的情况下考虑新的配置或参数。我们已经看到了function or task如何基于传递参数进行行为。类似地,…

30 UVM Adder Testbench Example

1 Adder Design 加法器设计在时钟的上升沿产生两个变量的加法。复位信号用于clear out信号。注:加法器可以很容易地用组合逻辑开发。引入时钟和重置,使其具有测试台代码中时钟和重置的样子/风格。 module adder(input clk, reset, input [7:0] in1, in…

BikeDNA(二) OSM数据的内在分析1

BikeDNA(二) OSM数据的内在分析1 该笔记本分析给定区域的 OSM 自行车基础设施数据的质量。 质量评估是“内在的”,即仅基于一个输入数据集,而不使用外部信息。 对于将 OSM 数据与用户提供的参考数据集进行比较的外在质量评估&…

Halcon闭运算closing

Halcon闭运算 文章目录 Halcon闭运算 闭运算的计算步骤,为先膨胀,后腐蚀。这两步操作能将看起来很接近的元素,如区域内部的空洞或外部孤立的点连接成一体,区域的外观和面积也不会有明显的改变。通俗地说,就是类似于“填…

金蝶云星空其他出库单,审核中/审批流中可以选择序列号设置

文章目录 其他出库单,审核中,审批流中可以选择序列号设置 其他出库单,审核中,审批流中可以选择序列号设置

2023 总结:我在上海做程序员的第八年

文章目录 生活举办了婚礼拿到上海户口输出的数据看书还不够 赚钱工作副业 专业技术开源图片分析工具 AndroidBitmapMonitor成为谷歌开发者专家学习的终极目的 健康总结历史总结 大家好,我是拭心。 这篇文章里,我将从生活、赚钱、专业技术、健康几方面总…

Oracle-深入了解cache buffer chain

文章目录 1.Cache buffer chain介绍2.Buffer cache的工作原理3 Buffer chains4.Multi-versioning of Buffers5.Latches6.诊断CBC latch等待7.解决 CBC Latch等待 1.Cache buffer chain介绍 经常看到会话等待事件“latch:cache buffers chain”。 如果想知道意味着什…

Ubuntu安装FSearch

文章目录 简介安装配置Fsearch的搜索路径参考资料 简介 Fsearch是Ubuntu等Linux系统中用于文件快速搜索的软件,类似于Windows系统中的Everything。下面介绍如何在Ubuntu系统中安装并使用Fsearch,只需简单几步!🏃🏃 安…

力扣LeetCode第26题 删除有序数组中的重复项

一、题目 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1&#xff1…

C++使用MINGW64集成Direct3D开发环境

霸王•吕布 / MinCPlusCompiler GitCodewindows mingw64 c简易开发编译工具,集成Direct3D FMOD Cmake编译工具https://gitcode.net/qq_35829452/mincpluscompiler 一.MINGW64编译器 gcc.exe C语言编译器g.exe C语言编译器mingw32-make.exe -j 4 CMake编译工具 二.MINGW64编…

Dungeon Scrawl——在线虚拟世界地图制作器

今天带来一款十分有趣的地图应用,同样也是在线地图工具,如果我们想要制作此类风格的地图,这款工具定能助我们一臂之力。 按照惯例先给出网址: Dungeon Scrawl | Free Online D&D Map Maker 进入网站,点击Start S…

CSS 缩减顶部动画

<template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container" mou…

华为模拟器eNSP报警提示解决办法

新安装的华为模拟器eNSP 启动交换机或路由器等设备是经常出现配置更改的提示&#xff0c;是不是很烦&#xff1f; Dec 29 2023 10:46:04-08:00 Huawei DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5 .25.191.3.1 configurations have been changed. The current change nu…

设计模式—单例模式 / DCL失效问题 / 暴力破解单例 (反射/序列化)

单例模式 杂谈 前提饿汉模式&#xff1a;懒汉模式&#xff1a; 线程不安全线程安全 双重锁懒汉模式(Double Check Lock)静态内部类模式枚举单例 杂谈 和同学在聚会的时候聊起设计模式&#xff0c;聊完之后发现我对自己的设计模式的看法貌似存在误解&#xff0c;当我看到设计…

00-开篇导读:学习分库分表开源框架的正确方法

1 前言 互联网高速发展带来海量的信息化数据&#xff0c;也带来更多的技术挑战。各种智能终端设备&#xff08;比如摄像头或车载设备等&#xff09;以每天千万级的数据量上报业务数据&#xff0c;电商、社交等互联网行业更不必说。这样量级的数据处理&#xff0c;已经远不是传…

IO进程线程 day1 IO基础+标准IO

1、使用fgets统计一个文件的行号 #include <stdio.h> #include<string.h> #include<stdlib.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("1.c","r"))NULL){return -1;}int count0;char buf;while(buf!EOF){b…

消息队列LiteQueue

文章目录 一、简介二、设计2.1 队列结构设计2.2 队列接口设计 三、实现3.1 队列锁的实现3.2 创建队列3.3 写入队列3.4 读出数据3.5 判断队列是否为空3.6 判断队列是否为满3.7 清空队列3.8 删除队列 四、测试参考 一、简介 收到消息时先把接收到的消息放到队列中。在任务中从队…

360高级java面试真题

今年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验…

问界M9激光雷达解说

什么是激光雷达 激光雷达(英文:Lidar),是一种通过发射激光束来测量目标位置、速度等特征量的雷达系统。其工作原理是将激光光束照射到目标物体上,然后通过测量激光光束从发射到反射回来的时间,来计算目标物体的距离、位置、速度等参数。激光雷达通常用于测量地形、地貌、…

关键字:throw关键字

在 Java 中&#xff0c;throw关键字用于抛出异常。当程序执行过程中发生意外情况&#xff0c;如错误的输入、资源不足、错误的逻辑等&#xff0c;导致程序无法正常执行下去时&#xff0c;可以使用throw关键字抛出异常。 以下是使用throw关键字的一些示例&#xff1a; 抛出异常…