RK3588 编译 Android 13 镜像方法
下载Android SDK源代码 # 下载完成后,在解压前先校验下MD5码: $ md5sum -c android*.txt android*_rk35xx_*_sdk.tar.gzaa: OK android*_rk35xx_*_sdk.tar.gzab: OK android*_rk35xx_*_sdk.tar.gzac: OK android*_rk35xx_*_sdk.tar.gzad: OK android*_rk35xx_*_sdk.tar.gzae: OK android*_rk35xx_*_sdk.tar.gzaf: OK android*_rk35xx_*_sdk.tar.gzag: OK android*_rk35xx_*_sdk.tar.gzah: OK# 解压Android源码 $ cat *.tar.gz* | tar -xzv#进入Android SDK根目录 $ cd android*#执行脚本安装依赖 $./install_dependencies.sh 并输入密码即可开始自动安装依赖。# 切换python2以保证u-boot编译通过 sudo ln -sf /usr/bin/python2 /usr/bin/python
编译SDK自带的板型
# 执行设置环境变量: source build/envsetup.sh# 列出配置菜单 lunch ............................................................. 请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台 .............................................................61. rk3588s_lubancat_4_hdmi-user62. rk3588s_lubancat_4_hdmi-userdebug HDMI接口63. rk3588s_lubancat_4_hdmi_tv-user64. rk3588s_lubancat_4_hdmi_tv-userdebug HDMI Android12 TV版65. rk3588s_lubancat_4_mipi1080p-user66. rk3588s_lubancat_4_mipi1080p-userdebug 野火5.5寸屏幕67. rk3588s_lubancat_4_mipi600p-user68. rk3588s_lubancat_4_mipi600p-userdebug 野火7寸屏幕69. rk3588s_lubancat_4_mipi800p-user70. rk3588s_lubancat_4_mipi800p-userdebug 野火10.1寸屏幕# 选择数字: 62
build.sh 一键编译
# -J16后面数字表示16个线程数,如果遇到编译报错或者内存不足可降低线程数 ./build.sh -UKAu -J16
生成的固件位于rockdev/Image-rk3568_lubancat_2_hdmi目录下:
~/android11/rockdev/Image-rk3568_lubancat_2_hdmi$ ll total 3622700 drwxrwxr-x 2 d d 4096 Sep 8 07:34 ./ drwxrwxr-x 5 d d 4096 Sep 13 02:50 ../ -rwxrwxr-x 1 d d 1048576 Aug 1 10:14 baseparameter.img* -rw-rw-r-- 1 d d 35432448 Sep 8 07:27 boot-debug.img -rw-rw-r-- 1 d d 35284992 Sep 8 07:26 boot.img -rwxrwxr-x 1 d d 6129 Aug 1 10:14 config.cfg* -rw-rw-r-- 1 d d 623 Sep 8 07:26 dtbo.img -rw-rw-r-- 1 d d 465344 Sep 8 05:42 MiniLoaderAll.bin -rw-rw-r-- 1 d d 49152 Aug 1 11:10 misc.img -rw-rw-r-- 1 d d 630 Sep 8 07:26 parameter.txt -rw-rw-r-- 1 d d 49152 Aug 1 11:10 pcba_small_misc.img -rw-rw-r-- 1 d d 49153 Aug 1 11:10 pcba_whole_misc.img -rw-rw-r-- 1 d d 127311872 Sep 8 07:27 recovery.img -rw-rw-r-- 1 d d 2636288 Sep 8 07:25 resource.img -rw-r--r-- 1 d d 1667579532 Sep 8 07:30 super.img -rw-rw-r-- 1 d d 4194304 Sep 8 05:42 uboot.img -rw-rw-r-- 1 d d 1836413514 Sep 8 07:34 update.img <----这就是打包完成的Android镜像 -rwxrwxr-x 1 d d 4096 Aug 1 10:14 vbmeta.img
可使用./build.sh单独编译:
# 编译U-boot ./build.sh -U# 编译 Kernel ./build.sh -K# 编译Android ./build.sh -A# 镜像打包 ./build.sh -u# 线程数 ./build.sh -J# 打包update.zip升级包 ./build.sh -Auo
# 执行设置环境变量: source build/envsetup.sh#清理建构 make clean# 列出配置菜单 lunch ............................................................. 请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台 .............................................................63. rk3588s_lubancat_4_hdmi_tv-user64. rk3588s_lubancat_4_hdmi_tv-userdebug HDMI Android12 TV版# 选择数字: 63
build.sh 一键编译
./build.sh -UKAu -J16
了解./build.sh菜单
dev@dev/rk356x-lubancat-android1x$./build.sh: option requires an argument -- 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- 编译kernel ./build.sh -K - 编译uboot ./build.sh -U - 编译android ./build.sh -A - 编译kernel with Clang ./build.sh -C - 打包固件 ./build.sh -u
预置第三方apk
预置不可卸载、可卸载的apk
首先进入指定目录:device/rockchip/rk356x/rk3568_lubancat_2_hdmi
# 创建存放不可卸载应用的文件夹 mkdir preinstall# 创建存放可卸载应用的文件夹 mkdir preinstall_del_forever# 创建存放卸载后可通过恢复出厂设置复原的应用的文件夹 mkdir preinstall_del将APK文件放入对应目录的示例:# 将一个APK放入不可卸载目录 cp /path/to/your_app.apk ./preinstall/# 将一个APK放入可卸载目录 cp /path/to/your_app2.apk ./preinstall_del_forever/# 将一个APK放入可卸载但可恢复目录 cp /path/to/your_app3.apk ./preinstall_del/注意事项:确保路径 device/rockchip/rk356x/rk3568_lubancat_2_hdmi 存在,替换 /path/to/your_app.apk 为您实际的APK文件路径
APK文件名建议:
使用英文命名 避免使用中文字符 建议使用小写字母和下划线 示例:myapp_v1.0.apk
根据需求只需将 apk 放在对应文件夹即可,比如将 lubancat.apk 设置为不可卸载应用,那么需要放进preinstall文件夹中。编译镜像烧写进去会发现已预置apk。
制作OTA升级包
构建完整更新
先编译0.0.2版本修改device/rockchip/rk3588/device.mk,找到ro.product.version = 0.0.1 改为 0.0.2
构安卓12的时候,带o,./build.sh -Auo 是打包update ota升级版,形成文件名是rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip 编译完成后,会在rockdev/Image-rk3588_lubancat_4_hdmi/目录下生成所需镜像,如下所示: dev@dev:~/android/android12-dev/rockdev/Image-rk3588s_lubancat_4_v1_hdmi$ ll ........ -rw-rw-r-- 1 dev dev 725114113 Oct 18 07:54 rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip -rw-rw-r-- 1 dev dev 2011523312 Oct 18 07:54 rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip .......将 rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip 重命名为 ota-update.zip 完整升级包。 mv ./rockdev/Image-rk3588s_lubancat_4_v1_hdmi/rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip ./ota-update.ziprk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip的0.0.2版本作为基础素材包,重命名为0.0.2.zip备份下来,用来制作增量升级包会用到。 mv ./rockdev/Image-rk3588s_lubancat_4_v1_hdmi/rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip ./0.0.2.zip
再次编译0.0.3
接着修改device/rockchip/rk3588/device.mk,找到ro.product.version = 0.0.2 改为 0.0.3
./build.sh -UCKAuo编译完成后,会在rockdev/Image-rk3588_lubancat_4_hdmi/目录下生成所需镜像,如下所示: dev@dev:~/android/android12-dev/rockdev/Image-rk3588s_lubancat_4_v1_hdmi$ ll ........ -rw-rw-r-- 1 dev dev 725114113 Oct 18 07:54 rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip -rw-rw-r-- 1 dev dev 2011523312 Oct 18 07:54 rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip .......将rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip 重命名 为0.0.3.zip mv ./rockdev/Image-rk3588s_lubancat_4_v1_hdmi/rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip ./0.0.3.zip
将上面0.0.2.zip和0.0.3.zip进行备份保存
构建增量更新
执行下面代码将制作OTA增量包 ota_from_target_files --block -v -i 0.0.2.zip -p out/host/linux-x86 -k build/target/product/security/testkey 0.0.3.zip files-update.zip 会形成files-update.zip增量升级包在当前目录。这个命令是使用Ota(Over-the-air)工具从目标文件中读取数据,用于OTA更新。 下面分解每个选项: -block: 使用block模式进行OTA read。 -v: 增加 verbosity,显示更多详细信息。 -i <zip_file>: 指定要从哪个 zip 压缩包中读取数据,这里是指 0.0.2.zip。 -p <out_dir>: 指定输出 directory,用于存储从目标文件中读取的数据。这里是 out/host/linux-x86。 -k <key_file>: 指定密钥文件,用于加密或解密读取的数据。这里是 build/target/product/security/testkey。 这个命令会从 0.0.2.zip 和 0.0.3.zip 中读取数据,并将其存储在 out/host/linux-x86目录中,使用 testkey 密钥进行加密或解密。