1. Android开发

1.1. 1. 编译环境搭建

  1. 准备台电脑,编译Android对机器要很高,推荐标准配置,避免机器某个导致Android编译失败。

标准配置:

  • 64位处理器32线程

  • 64位物理内存32GB

  • 固态硬盘1TB 空闲的磁盘空间

  • 系统:使用 Ubuntu 22.04 操作系统或更高版本

最高配置:

  • 64位处理器72线程

  • 64位物理内存128GB

  • NVME固态硬盘7TB 空闲的磁盘空间

  • 系统:使用 Ubuntu 22.04 操作系统或更高版本

1.2. 2. 编译 Android 镜像

注意

在编译安卓镜像的时候,切忌用root用户去编译。

  1. 下载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

# 然后解压
$ cat android*.tar.gza* | tar -xzv

#进入sdk根目录
$ cd android*

#执行脚本安装依赖
$./install_dependencies.sh 并输入密码即可开始自动安装依赖。

# 切换python2以保证u-boot编译通过
sudo ln -sf /usr/bin/python2 /usr/bin/python
  1. 编译SDK自带的板型

Android11 以 鲁班猫2 HDMI为例;

# 执行设置环境变量:
source build/envsetup.sh

# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
 50. rk3568_lubancat_2_v2_hdmi-user              HDMI接口
 51. rk3568_lubancat_2_v2_hdmi-userdebug
 52. rk3568_lubancat_2_v2_mipi1080p-user         野火5.5寸屏幕
 53. rk3568_lubancat_2_v2_mipi1080p-userdebug
 54. rk3568_lubancat_2_v2_mipi600p-user          野火7寸屏幕
 55. rk3568_lubancat_2_v2_mipi600p-userdebug
 56. rk3568_lubancat_2_v2_mipi800p-user          野火10.1寸屏幕
 57. rk3568_lubancat_2_v2_mipi800p-userdebug

#选择数字: 51
  • user:权限受限;适用于生产环境

  • userdebug:与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型,合适开发调试

Android12 以 鲁班猫4 HDMI为例;

# 执行设置环境变量:
source build/envsetup.sh

# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
 61. rk3588s_lubancat_4_hdmi-user
 62. rk3588s_lubancat_4_hdmi-userdebug              HDMI接口
 63. rk3588s_lubancat_4_hdmi_tv-user
 64. rk3588s_lubancat_4_hdmi_tv-userdebug           HDMI Android12 TV版
 65. rk3588s_lubancat_4_mipi1080p-user
 66. rk3588s_lubancat_4_mipi1080p-userdebug         野火5.5寸屏幕
 67. rk3588s_lubancat_4_mipi600p-user
 68. rk3588s_lubancat_4_mipi600p-userdebug          野火7寸屏幕
 69. rk3588s_lubancat_4_mipi800p-user
 70. rk3588s_lubancat_4_mipi800p-userdebug          野火10.1寸屏幕

# 选择数字: 62
  1. build.sh 一键编译

./build.sh -UKAu

注意

编译kernel时会弹出IO电压域确认提示框,请看原理图认各IO电压域选用的是1.8V还是3.3V,然后在编译时 会弹出界面让你再确认一次,按上面dts的配置选择并确认即可。一定要根据硬件实际情况来配置电压域,否则有烧器件的风险!!!

可以查看设备树配置知道各IO电压域是1.8V还是3.3V,如下图所示,除VCCIO4和VCCIO6为1.8V,其余均为3.3V。

io-voltage.png未找到图片

在编译过程中遇到内存不足,可降低建构线程数:

sudo vi build.sh

找到 BUILD_JOBS=56 56是线程数,改到16线程再保存即可。
按 a 进行编辑,把56改成16,最后 :wq! 再编译
  1. 生成的固件位于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
  1. 可使用./build.sh单独编译

# 编译U-boot
./build.sh -U

# 编译 Kernel
./build.sh -K

# 编译Android
./build.sh -A

# 镜像打包
./build.sh -u
  • 注意大小写

1.3. 4. 编译Android TV

编译Android TV版本要求清理建构 make clean 再编译,避免开机遇到奇怪问题

建议选择user版本,这样不会被app提示本机已root并强制退出

Android11 以 鲁班猫2 HDMI为例;

# 执行设置环境变量:
source build/envsetup.sh

# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
 86. rk356x_lubancat_2_android_tv_11-user           Android TV版 HDMI接口
 87. rk356x_lubancat_2_android_tv_11-userdebug

# 选择数字: 86

Android12 以 鲁班猫4 HDMI为例;

# 执行设置环境变量:
source build/envsetup.sh

# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
 63. rk3588s_lubancat_4_hdmi_tv-user
 64. rk3588s_lubancat_4_hdmi_tv-userdebug           HDMI Android12 TV版

# 选择数字: 63
  1. build.sh 一键编译

./build.sh -UKAu

了解./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

1.4. 5. 预置第三方apk

  1. 预置不可卸载、可卸载的apK

源码路径查看:android11/device/rockchip/rk356x/rk3568_lubancat_2_hdmi

# 进入到这个目录下,分别新建三个文件夹:
preinstall                  存放不可卸载应用
preinstall_del_forever      存放可卸载的应用
preinstall_del              存放卸载后恢复出厂设置会复原应用

将apk文件放置该目录即可 apk最好不带中文。

-rw-rw-r--  1 d d    80 Sep 22  2022 Android.mk
-rw-rw-r--  1 d d   298 Sep 22  2022 AndroidBoard.mk
-rw-rw-r--  1 d d  1141 Apr 10 02:08 BoardConfig.mk
-rw-rw-r--  1 d d   152 Sep 22  2022 bt_vendor.conf
-rwxrwxr-x  1 d d  6129 Sep 22  2022 config.cfg*
-rw-rw-r--  1 d d  7959 Sep 22  2022 config.cfg_ab
-rw-rw-r--  1 d d 11009 Sep 22  2022 config.cfg_ab_gki
-rw-rw-r--  1 d d   316 Sep 22  2022 dt-overlay.in
-rw-rw-r--  1 d d 24273 Sep 22  2022 media_profiles_default.xml
drwxrwxr-x  3 d d  4096 Sep 22  2022 ota/
drwxrwxr-x  5 d d  4096 Jun 13 00:20 preinstall_del/    <———— 将apk文件放进去。可卸载,恢复出厂设置会复原应用
-rw-rw-r--  1 d d  3249 Sep 22  2022 recovery.fstab
-rw-rw-r--  1 d d  1824 Sep 22  2022 recovery.fstab_AB
-rw-rw-r--  1 d d  1712 Apr 10 02:07 rk3568_lubancat_2_hdmi.mk

根据需求只需将 apk 放在对应文件夹即可,比如将 lubancat.apk 设置为不可卸载应用,那么需要放进preinstall文件夹中。编译镜像烧写进去会发现已预置apk。

1.5. 6. 建构Android系统OTA升级

OTA(Over-The-Air)升级包是指将系统更新推送到用户设备的过程中的文件包。OTA升级包由设备制造商和手机操作系统供应商共同制定,包含了系统更新的补丁、新特性和其他内容。升级包的大小通常取决于设备型号、系统版本和升级包的内容。较大的 OTA 升级包可能会对设备的性能产生影响,因此在下载和安装过程中需要谨慎处理。

现在将编译2个不同版本,分别是完全升级和增量升级,可以通过本地升级或者网络在线升级(网络在线升级我们暂时不提供,企业客户需要的请联系售后提供支持)

野火网盘镜像一概不加入OTA升级包,如需要请用户自行根据教程去做ota升级包。

  • 完全升级(完整包) :完整升级是将整个系统或应用程序的最新版本下载并安装到设备上,升级包较大,可能达到数百 MB 甚至几 GB,因为它包含了所有的系统文件和应用程序文件,可以修复旧系统中的所有问题,包括未发现的 bug 和系统文件的损坏。

  • 增量升级(差异包):增量升级是只下载和安装自上次更新以来发生变化的部分,升级包较小,只有几 MB 到几十 MB,因为它只包含了变化的部分,可以显著减少下载时间和数据使用量,提高更新效率。

当前AndroidSDK源码是0.0.1 我们将编译制作0.0.2和0.0.3这2个包用在制作增量包上使用。

如果希望完全更新不会出现一些问题,直接编译跳过做增量升级包,使用完整升级包更新系统,完整包和增量包区别是空间大小,下载大小和时间长短。

1.5.1. 制作OTA升级包

  1. 构建完整更新

先编译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.zip

rk3588s_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
  1. 再次编译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进行备份保存

  1. 构建增量更新

执行下面代码将制作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 密钥进行加密或解密。

1.5.2. Android本地U盘升级

  1. 测试完整升级和增量升级

首先使用adb执行getprop ro.product.version可以看到版本=0.0.1

  • 完全升级:ota-update.zip

  • 增量升级:files-update.zip

将U盘或者TF卡格式化FAT32,把ota-update.zip或者files-update.zip 重命名为 update.zip 并复制到U盘鲁班猫板子上,系统检测会弹出是否需要固件升级,如图所示:

../../_images/ota1.png ../../_images/ota2.png ../../_images/ota3.jpg ../../_images/ota4.jpg

完整升级使用adb检测执行getprop ro.product.version可以看到版本从0.0.1变成0.0.2就升级成功;增量升级后执行adb可以看到版本从0.0.2变成0.0.3代表升级升级成功了。