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 -- h
USAGE: [-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
wlq@sys2_206:~/3_Android12_29_debug$ lunch
You're building on Linux
Lunch 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-userdebug
Which would you like? [aosp_arm-eng] rk3588_s-userdebug
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这个版本会有差异)。
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的路径,命令如下:
cd kernel-5.10
export PATH=../prebuilts/clang/host/linux-x86/clang-r416183b/bin:$PATH
alias msk='make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1'
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位置
build.sh命令
wlq@sys2_206:~/3_Android12_29_debug$ ./build.sh -A
编译完成后会在rockdev/Image-rk3588_s/
下生成super.img,烧写这个super.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的命令参数是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