一.GKI簡介
GKI:Generic Kernel Image 通用內(nèi)核映像。
Android13 GMS和EDLA認證的一個難點是google強制要求要支持GKI。GKI通用內(nèi)核映像,是google為了解決內(nèi)核碎片化的問題,而設(shè)計的通過提供統(tǒng)一核心內(nèi)核并將SoC和板級驅(qū)動從核心內(nèi)核移至可加載模塊中。核心內(nèi)核為驅(qū)動模塊提供了穩(wěn)定的內(nèi)核模塊接口,模塊驅(qū)動和核心內(nèi)核可以獨立進行更新。內(nèi)核接口可以通過upstream的方式進行擴展。 Soc和板級廠商在驅(qū)動開發(fā)時需要使用已經(jīng)定義的內(nèi)核接口,如果要新加核心內(nèi)核接口需要提交給google,這個周期會比較長,所以要提前做好開發(fā)準備。
二.什么產(chǎn)品需要使用GKI
使用Android13且需要過GMS認證和EDLA認證的產(chǎn)品。
使用Android12 的RK3588和RK3588S的需要過GMS認證和EDLA認證的產(chǎn)品。
不過GMS認證和EDLA認證的產(chǎn)品不強制要求使用GKI。
三.碎片化的代價
1.安全更新需要耗費大量人力:
Android 安全公告 (ASB)?中引用的安全補丁程序必須向后移植到每個設(shè)備內(nèi)核中。但是,由于存在內(nèi)核碎片化問題,向正常使用的 Android 設(shè)備傳播安全修復(fù)的代價非常之高。
2.很難合并長期支持的更新:
長期支持 (LTS) 版本包含安全修復(fù)和其他重大問題修復(fù)。事實證明,使用最新的 LTS 版本是提供安全修復(fù)的最有效方式。我們發(fā)現(xiàn),ASB 報告的內(nèi)核安全問題中有 90% 都已在保持最新狀態(tài)的 Pixel 設(shè)備上得到修復(fù)。
3.妨礙 Android 平臺進行版本升級
由于碎片化問題,很難向正常使用的設(shè)備添加需要更改內(nèi)核的 Android 新功能。Android 框架代碼必須假設(shè)支持的內(nèi)核版本多達 5 個,并且沒有針對新的平臺版本進行任何內(nèi)核更改(Android 10 支持內(nèi)核版本 3.18、4.4、4.9、4.14 和 4.19;在某些情況下,這些版本自 2017 年 Android 8 發(fā)布以來還未添加新功能)。
4.很難將內(nèi)核更改貢獻回上游 Linux
對內(nèi)核進行完所有更改后,大多數(shù)旗艦設(shè)備附帶的內(nèi)核版本已經(jīng)至少存在 18 個月了。例如,kernel.org 于 2017 年 11 月發(fā)布了 4.14 版內(nèi)核,而首批使用 4.14 版內(nèi)核的 Android 手機于 2019 年春季才發(fā)布。
上游內(nèi)核發(fā)布與產(chǎn)品發(fā)布之間的這種長時間延遲導(dǎo)致 Android 社區(qū)很難將所需的功能和驅(qū)動程序饋送到上游內(nèi)核中,因此解決碎片化問題并非易事。
四.GKI和非GKI的差別
通用內(nèi)核boot.img:
GKI | 非GKI |
---|---|
由google定期發(fā)布boot.img,代碼不能自己修改 | 由RK提供內(nèi)核源碼編譯,可以自由修改 |
驅(qū)動模塊:
GKI | 非GKI |
---|---|
以KO的形式加載,調(diào)用的內(nèi)核接口必需是google發(fā)布的boot.img里面包含的 | 內(nèi)嵌在boot中,由RK提供內(nèi)核源碼編譯,可以自由修改和添加內(nèi)核接口 |
kernel代碼:
GKI | 非GKI |
---|---|
RK發(fā)布的kernel源碼僅用于編譯驅(qū)動模塊的KO | RK發(fā)布的kernel源碼用于完整的內(nèi)核和模塊驅(qū)動的編譯,模塊以.o的形式內(nèi)嵌編譯 |
?
五.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文件有區(qū)分芯片平臺驅(qū)動和板級驅(qū)動,所以在開發(fā)新產(chǎn)品的時候需要增加板級驅(qū)動的KO load文件,load文件以device下面產(chǎn)品目錄中定義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文件里面放的是板級的驅(qū)動模塊,如:觸摸屏、camera、sensor等芯片平臺以為的驅(qū)動模塊,如:
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產(chǎn)品目錄下配置GKI選項:文章來源:http://www.zghlxwxcb.cn/news/detail-761871.html
~/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的一樣:文章來源地址http://www.zghlxwxcb.cn/news/detail-761871.html
source build/envsetup.sh
lunch rk3588_t-userdebug
./build.sh -ACUKup
到了這里,關(guān)于RK3568平臺 Android13 GKI架構(gòu)開發(fā)方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!