当前位置:   article > 正文

RK3568平台 Android13 GKI架构开发方式_玩转android gki

玩转android 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配置:

  1. ~/a2_Android13_sdk/u-boot$ git diff
  2. diff --git a/configs/rk3568_defconfig b/configs/rk3568_defconfig
  3. index fbd9820acc..e23e438792 100644
  4. --- a/configs/rk3588_defconfig
  5. +++ b/configs/rk3588_defconfig
  6. @@ -207,6 +207,7 @@ CONFIG_RSA_N_SIZE=0x200
  7. CONFIG_RSA_E_SIZE=0x10
  8. CONFIG_RSA_C_SIZE=0x20
  9. CONFIG_SHA512=y
  10. CONFIG_LZ4=y
  11. CONFIG_LZMA=y
  12. CONFIG_SPL_GZIP=y
  13. @@ -220,3 +221,4 @@ CONFIG_RK_AVB_LIBAVB_USER=y
  14. CONFIG_OPTEE_CLIENT=y
  15. CONFIG_OPTEE_V2=y
  16. CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
  17. +CONFIG_ANDROID_AB=y

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

  1. wlq@sys2_206:~/a0_Android13_gki$ tree mkcombinedroot/res/board/
  2. mkcombinedroot/res/board/
  3. ├── px30-mini-evb-ddr3-v11-avb.load
  4. ├── rk3326-863-lp3-v10-rkisp1.load
  5. ├── rk3326-evb-lp3-v10-avb.load
  6. ├── rk3399-evb-ind-lpddr4-android-avb.load
  7. ├── rk3399-evb-ind-lpddr4-v13-android-avb.load
  8. ├── rk3562-evb1-lp4x-v10.load
  9. ├── rk3562-rk817-tablet-v10.load
  10. ├── rk3566-evb2-lp4x-v10.load
  11. ├── rk3566-rk817-tablet.load
  12. ├── rk3568-evb1-ddr4-v10.load
  13. ├── rk3588-evb1-lp4-v10.load
  14. ├── rk3588-evb7-lp4-v10.load
  15. └── rk3588s-tablet-v10.load

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

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

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

  1. ~/a2_Android13_sdk/device/rockchip/rk3588$ git diff
  2. diff --git a/rk3588_t/BoardConfig.mk b/rk3588_t/BoardConfig.mk
  3. old mode 100644
  4. new mode 100755
  5. index 50da541..06da5f3
  6. --- a/rk3588_t/BoardConfig.mk
  7. +++ b/rk3588_t/BoardConfig.mk
  8. @@ -15,10 +15,21 @@
  9. #
  10. include device/rockchip/rk3588/BoardConfig.mk
  11. BUILD_WITH_GO_OPT := false
  12. +BOARD_BUILD_GKI := true
  13. -# AB image definition
  14. -BOARD_USES_AB_IMAGE := false
  15. -BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false
  16. +ifeq ($(strip $(BOARD_BUILD_GKI)), true)
  17. + #for gki
  18. + # AB image definition
  19. + BOARD_USES_AB_IMAGE := true
  20. + BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := true
  21. + PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config
  22. +else
  23. + BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false
  24. + BOARD_USES_AB_IMAGE := false
  25. + PRODUCT_KERNEL_CONFIG := rockchip_defconfig android-13.config
  26. +endif
  27. BOARD_GRAVITY_SENSOR_SUPPORT := true
  28. BOARD_COMPASS_SENSOR_SUPPORT := true
  29. @@ -26,14 +37,21 @@ BOARD_SENSOR_COMPASS_AK8963-64 := true
  30. BOARD_GYROSCOPE_SENSOR_SUPPORT := true
  31. BOARD_PROXIMITY_SENSOR_SUPPORT := true
  32. BOARD_LIGHT_SENSOR_SUPPORT := true
  33. ifeq ($(strip $(BOARD_USES_AB_IMAGE)), true)
  34. include device/rockchip/common/BoardConfig_AB.mk
  35. TARGET_RECOVERY_FSTAB := device/rockchip/rk3588/rk3588_t/recovery.fstab_AB
  36. endif
  37. -
  38. +ifeq ($(strip $(BOARD_BUILD_GKI)), true)
  39. + #for gki
  40. + BOARD_SUPER_PARTITION_SIZE := 4294967296
  41. + BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_SIZE := $(shell expr $(BOARD_SUPER_PARTITION_SIZE) - 4194304)
  42. +endif
  43. PRODUCT_UBOOT_CONFIG := rk3588
  44. PRODUCT_KERNEL_DTS := rk3588-evb1-lp4-v10
  45. BOARD_GSENSOR_MXC6655XA_SUPPORT := true
  46. BOARD_CAMERA_SUPPORT_EXT := true

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

  1. source build/envsetup.sh
  2. lunch rk3588_t-userdebug
  3. ./build.sh -ACUKup

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/455228
推荐阅读
相关标签
  

闽ICP备14008679号