Rockchip RK3588 Android SDK编译方法
Rockchip RK3588 Android SDK编译方法
Rockchip RK3588 Android SDK在原始Android的编译方式的基础上封装了一个编译脚本build.sh,用来简化编译命令,下面介绍build.sh脚本编译的使用
build.sh的源文件路径在device/rockchip/common/build/rockchip/build.sh
在执行repo sync更新SDK的是会自动拷贝到SDK的根目录下。
通过build.sh -h可以看到脚本的使用方法
@sys2_206:~/3_Android12_29_debug$ ./build.sh -h./build.sh: illegal option -- hUSAGE: [-U] [-CK] [-A] [-p] [-o] [-u] [-v VERSION_NAME] No ARGS means use default build option WHERE: -U = build uboot -C = build kernel with Clang-K = build kernel -A = build android -p = will build packaging in IMAGE -o = build OTA package -u = build update.img-v = build android with 'user' or 'userdebug' -d = huild kernel dts name -V = build version -J = build jobs -m = build multi dtb
下面具体介绍使用build.sh编译系统的各个模块 。
在新终端中第一次编译需要先执行环境配置和编译产品的选择,如下:
- 配置编译环境
@sys2_206:~/3_Android12_29_debug$ source build/envsetup.sh
- lunch 选择需要编译的产品,这里以rk3588_s产品为例说明
wlq@sys2_206:~/3_Android12_29_debug$ lunch You're building on LinuxLunch menu... pick a combo: 1. PX30_Android12-user 2. PX30_Android12-userdebug 3. aosp_arm-eng 4. aosp_arm64-eng 5. aosp_blueline-userdebug 6. aosp_blueline_car-userdebug 7. aosp_bonito-userdebug 8. aosp_bonito_car-userdebug 9. aosp_bramble_car-userdebug 10. aosp_cf_arm64_auto-userdebug 11. aosp_cf_arm64_phone-userdebug 12. aosp_cf_x86_64_foldable-userdebug 13. aosp_cf_x86_64_pc-userdebug 14. aosp_cf_x86_64_phone-userdebug 15. aosp_cf_x86_64_tv-userdebug 16. aosp_cf_x86_auto-userdebug 17. aosp_cf_x86_phone-userdebug 18. aosp_cf_x86_tv-userdebug 19. aosp_coral_car-userdebug 20. aosp_crosshatch-userdebug 21. aosp_crosshatch_car-userdebug 22. aosp_crosshatch_vf-userdebug 23. aosp_flame_car-userdebug 24. aosp_oriole_car-userdebug 25. aosp_raven_car-userdebug 26. aosp_redfin_car-userdebug 27. aosp_sargo-userdebug 28. aosp_sargo_car-userdebug 29. aosp_slider-userdebug 30. aosp_sunfish_car-userdebug 31. aosp_whitefin-userdebug 32. aosp_x86-eng 33. aosp_x86_64-eng 34. arm_krait-eng 35. arm_v7_v8-eng 36. armv8-eng 37. armv8_cortex_a55-eng 38. armv8_kryo385-eng 39. beagle_x15-userdebug 40. beagle_x15_auto-userdebug 41. fuchsia_arm64-eng 42. fuchsia_x86_64-eng 43. hikey-userdebug 44. hikey64_only-userdebug 45. hikey960-userdebug 46. hikey960_tv-userdebug 47. hikey_tv-userdebug 48. qemu_trusty_arm64-userdebug 49. rk3326_pie-user 50. rk3326_pie-userdebug 51. rk3326_q-user 52. rk3326_q-userdebug 53. rk3326_r-user 54. rk3326_r-userdebug 55. rk3326_s-user 56. rk3326_s-userdebug 57. rk3326_sgo-user 58. rk3326_sgo-userdebug 59. rk3368_Android12-user 60. rk3368_Android12-userdebug 61. rk3368_pie-user 62. rk3368_pie-userdebug 63. rk3399_Android10-user 64. rk3399_Android10-userdebug 65. rk3399_Android11-user 66. rk3399_Android11-userdebug 67. rk3399_Android12-user 68. rk3399_Android12-userdebug 69. rk3399_mid-user 70. rk3399_mid-userdebug 71. rk3566_32bit-user 72. rk3566_32bit-userdebug 73. rk3566_eink-user 74. rk3566_eink-userdebug 75. rk3566_einkw6-user 76. rk3566_einkw6-userdebug 77. rk3566_r-user 78. rk3566_r-userdebug 79. rk3566_s-user 80. rk3566_s-userdebug 81. rk3566_sgo-user 82. rk3566_sgo-userdebug 83. rk3568_s-user 84. rk3568_s-userdebug 85. rk3588_box-user 86. rk3588_box-userdebug 87. rk3588_s-user 88. rk3588_s-userdebug 89. rk3588_s_evb2-user 90. rk3588_s_evb2-userdebug 91. rk3588_s_evb7-user 92. rk3588_s_evb7-userdebug 93. rk3588_xr-user 94. rk3588_xr-userdebug 95. rk3588s_s-user 96. rk3588s_s-userdebug 97. sdk_car_arm-userdebug 98. sdk_car_arm64-userdebug 99. sdk_car_portrait_x86_64-userdebug 100. sdk_car_x86-userdebug 101. sdk_car_x86_64-userdebug 102. silvermont-eng 103. uml-userdebug 104. yukawa-userdebug 105. yukawa_sei510-userdebugWhich would you like? [aosp_arm-eng] rk3588_s-userdebug
uboot编译
build.sh的编译命令:
@sys2_206:~/3_Android12_29_debug$ ./build.sh -U
编译后会在u-boot目录下生成uboot.img和rk3588_spl_loader_v1.07.111.bin(不同版本的SDKv1.07.111这个版本会有差异),同时会将这2个文件拷贝到rockdev/Image-rk3588_s/
下面对应的uboot.img和MiniLoaderAll.bin,烧写这两个文件即可。
如果只是调试uboot或者rkbin,则可以在uboot目录直接编译,这样速度更快,如下
@sys2_206:~/3_Android12_29_debug/u-boot$ ./make.sh rk3588
这样编译后会在uboot目录下生成uboot.img和rk3588_spl_loader_v1.07.111.bin(不同版本的SDKv1.07.111这个版本会有差异),但是不会拷贝到rockdev/Image-rk3588_s/
下面,所以需要烧写uboot目录下的uboot.img和rk3588_spl_loader_v1.07.111.bin(不同版本的SDKv1.07.111这个版本会有差异)。
kernel编译
build.sh的编译命令:
wlq@sys2_206:~/3_Android12_29_debug$ ./build.sh -CAK -d rk3588-evb1-lp4-v10
编译后会在rockdev/Image-rk3588_s/
下生成boot.img,烧写这个boot.img即可。
其中:C
表示用clang编译器编译,如果不带C则使用gcc编译,如果需要过GMS认证的google有要求要用clang编译;-d rk3588-evb1-lp4-v10
这是指定编译的dts;
因为kernel编译完后需要通过android去打包成boot.img,所以这里需要加上A
参数,即编译kernel的时需要一起编译Android才能打包boot.img。
通过以上介绍可以知道单独编译kernel需要同时编译Android,导致编译很耗时,针对这个问题我们提供了单独编译kernel生成boot.img的方法,用于kernel的开发和调试,如下:
编译的原理:在kernel-5.10目录下将编译生成的kernel.img
和resource.img
替换到旧的boot.img
中。
以RK3588
样机为例,编译时替换对应的boot.img及dts:
其中BOOT_IMG=../rockdev/Image-rk3588_s/boot.img
这里指定的是旧的boot.img的路径,命令如下:
- 导clang到环境
cd kernel-5.10export PATH=../prebuilts/clang/host/linux-x86/clang-r416183b/bin:$PATHalias msk='make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1'
- 编译boot.img
msk ARCH=arm64 rockchip_defconfig android-11.config pcie_wifi.config && msk ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3588_s/boot.img rk3588-evb1-lp4-v10.img
编译后可以直接烧写kernel-5.10目录下的boot.img到机器的boot位置
Android编译
build.sh命令
wlq@sys2_206:~/3_Android12_29_debug$ ./build.sh -A
编译完成后会在rockdev/Image-rk3588_s/
下生成super.img,烧写这个super.img即可。
打包update.img
build.sh命令
打包update.img需要在uboot、kernel、android都编译完成的情况下才能打包update.img,所以一般在完整编译的时候使用
wlq@sys2_206:~/3_Android12_29_debug$ ./build.sh -u
编译后会在rockdev/Image-rk3588_s/
下生成update.img。
完整编译
完整编译会同时编译Android、kernel、uboot并生成update.img
build.sh命令
wlq@sys2_206:~/3_Android12_29_debug$ ./build.sh -AUCKu -d rk3588-evb1-lp4-v10
编译OTA包
编译OTA的命令参数是o
,在完整编译的时候使用。
build.sh命令
wlq@sys2_206:~/3_Android12_29_debug$ ./build.sh -AUCKou -d rk3588-evb1-lp4-v10
编译后会在rockdev/Image-rk3588_s/
生成上面提到的所有的img,包括update.img已经用于OTA升级的完整包TARGETPRODUCT−ota−∗.zip,以及用于制作差异包的中间文件TARGET_PRODUCT-ota-*.zip,以及用于制作差异包的中间文件TARGETPRODUCT−ota−∗.zip,以及用于制作差异包的中间文件TARGET_PRODUCT-target_files-*.zip
** 提示**
在单独烧写某个img时需要先在工具上更新机器里面的分区信息,然后在烧写,避免烧错分区导致无法开机。
烧写update.img到设备中发现固件没有更新的问题解决办法
这个问题是因为使用Androidtool工具烧写的时候在固件加载会进行校验,此时会将固件缓存到内存中,当重新加载固件的时候没有更新缓存导致实际烧写的固件还是之前缓存的固件。解决办法是AndroidTool工具配置关掉固件加载校验功能,具体修改如下:
打开工具所在的目录中的config.ini文件,将FW_NOT_CHECK改为TRUE,然后重启工具即可。
#当设置FW_NOT_CHECK=TRUE时,固件加载时不进行完整性校验
FW_NOT_CHECK=TRUE