Rockchip update.img unpack and pack/mkupdate Linux host for ARM Linux target/Rockchip/Arm

本文介绍如何使用Rockchip工具集为不同型号的Rockchip设备打包Linux固件,并详细展示了从更新镜像的解包到重新制作update.img的全过程。涉及的步骤包括使用afptool和rkImageMaker工具进行文件的提取与打包,以及通过shell脚本自动化整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tool git///support  Android/Linux  image for RK/Linux/Android OS 

git clone  https://github.com/rockchip-linux/tools.git


lake@localhost:~/rk/tools/linux$ cd Linux_Pack_Firmware/
lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware$ ls
rockdev
lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware$ cd rockdev/
lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware/rockdev$ ls
Image                rk3036-mkupdate.sh    rk3229-package-file         rk3326-package-file
afptool              rk3036-package-file   rk3288-mkupdate.sh          rk3328-mkupdate.sh
px30-mkupdate.sh     rk3128-mkupdate.sh    rk3288-package-file         rk3328-package-file
px30-package-file    rk3128-package-file   rk3308-mkupdate.sh          rk3399-mkupdate.sh
px3se-mkupdate.sh    rk3128h-mkupdate.sh   rk3308-package-file         rk3399-package-file
px3se-package-file   rk3128h-package-file  rk3308-package-file-ab      rkImageMaker
readme.txt           rk312x-mkupdate.sh    rk3308-package-file-ota     unpack.sh
rk1808-mkupdate.sh   rk312x-package-file   rk3308-package-file-rootfs
rk1808-package-file  rk3229-mkupdate.sh    rk3326-mkupdate.sh
lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware/rockdev$

1. unpack  update.img

lake@localhost:~/rk/Linux_Pack_Firmware/rockdev$ ln -s  ~/local/Firefly-RK3399-Ubuntu/pack/FIREFLY-RK3399-UBUNTU18.04-GPT-20190103-1514.img   update.img
lake@localhost:~/rk/Linux_Pack_Firmware/rockdev$ ls
afptool  mkupdate.sh  output  package-file  readme.txt  rkImageMaker  unpack.sh  update.img
lake@localhost:~/rk/Linux_Pack_Firmware/rockdev$ ./unpack.sh
start to unpack update.img...
********RKImageMaker ver 1.63********
Unpacking image, please wait...
Exporting boot.bin
Exporting firmware.img
Unpacking image success.
Android Firmware Package Tool v1.62
Check file... OK
------- UNPACK ------
package-file    0x0000000000000800      0x00000000000000F3
Image/MiniLoaderAll.bin 0x0000000000001000      0x000000000004394E
Image/parameter.txt     0x0000000000045000      0x0000000000000188
Image/trust.img 0x0000000000045800      0x0000000000400000
Image/uboot.img 0x0000000000445800      0x0000000000400000
Image/boot.img  0x0000000000845800      0x0000000001369000
Image/rootfs.img        0x0000000001BAE800      0x00000000B3062C00
Unpack firmware OK!
------ OK ------
Unpacking update.img OK.
Press any key to quit:
lake@localhost:~/rk/Linux_Pack_Firmware/rockdev$
lake@localhost:~/rk/Linux_Pack_Firmware/rockdev$ ls
afptool  mkupdate.sh  output  package-file  readme.txt  rkImageMaker  unpack.sh  update.img
lake@localhost:~/rk/Linux_Pack_Firmware/rockdev$ ls -l output/
Image/             MiniLoaderAll.bin  package-file       parameter.txt
lake@localhost:~/rk/Linux_Pack_Firmware/rockdev$ ls -l output/Image/
boot.img    rootfs.img  trust.img   uboot.img

2. mkupdate

cat ./rk3288-mkupdate.sh
#!/bin/bash
pause()
{
echo "Press any key to quit:"
read -n1 -s key
exit 1
}
echo "start to make update.img..."
if [ ! -f "Image/parameter" -a ! -f "Image/parameter.txt" ]; then
        echo "Error:No found parameter!"
        exit 1
fi
if [ ! -f "package-file" ]; then
        echo "Error:No found package-file!"
        exit 1
fi
./afptool -pack ./ Image/update.img || pause
./rkImageMaker -RK320A Image/MiniLoaderAll.bin Image/update.img update.img -os_type:androidos || pause
echo "Making update.img OK."
#echo "Press any key to quit:"
#read -n1 -s key
exit $?


#####  prepare  
lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware/rockdev$ ls -l Image/ 
total 5922964
-rw-r--r-- 1 jhula root     276814 Jul 30 19:32 MiniLoaderAll.bin
-rw-r--r-- 1 jhula root   20353024 Jul 30 19:32 boot.img
-rw-r--r-- 1 jhula root        392 Jul 30 19:32 parameter.txt
-rw-r--r-- 1 jhula root 3003526144 Jul 30 19:32 rootfs.img
-rw-r--r-- 1 jhula root    4194304 Jul 30 19:32 trust.img
-rw-r--r-- 1 jhula root    4194304 Jul 30 19:32 uboot.img

lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware/rockdev$ sudo ./rk3288-mkupdate.sh
start to make update.img...
Android Firmware Package Tool v1.65
------ PACKAGE ------
Add file: ./package-file
Add file: ./Image/MiniLoaderAll.bin
Add file: ./Image/parameter.txt
Add file: ./Image/trust.img
Add file: ./Image/uboot.img
Add file: ./Image/boot.img
Add file: ./Image/rootfs.img
Add CRC...

Make firmware OK!
------ OK ------
********RKImageMaker ver 1.66********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...
Generating MD5 data...

MD5 data generated successfully!
New image generated successfully!
Making update.img OK.
lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware/rockdev$
lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware/rockdev$ 
lake@localhost:~/rk/tools/linux/Linux_Pack_Firmware/rockdev$ ls -l Image/update.img 
-rw-r--r-- 1 root  root 3032553476 Jul 30 19:37 update.img

<think>我们正在解决在Android源码编译过程中,由于Android.mk文件路径错误导致的编译失败问题。错误信息通常是:“Android build error including Android.mk file No such file or directory”。 根据引用[1],Android.mk文件在编译过程中会被处理,每个模块的Android.mk文件都包含`include $(CLEAR_VARS)`和`include $(BUILD_PACKAGE)`这样的语句。如果出现找不到文件的错误,可能是路径设置不正确。 ### 解决方案步骤 #### 1. **检查文件路径和名称** - 确保`Android.mk`文件存在于正确的目录中,并且文件名拼写正确(注意大小写,Linux系统区分大小写)。 - 在预置当贝桌面时,我们创建了`vendor/rockchip/common/apps/DBLauncher`目录,并在其中放置了`DBLauncher.apk`和`Android.mk`文件。请确认这个目录结构是否正确。 #### 2. **检查`Android.mk`文件内容** - 确保`Android.mk`文件中的路径设置正确。特别是`LOCAL_PATH`变量,它应该指向当前目录。通常,我们在文件开头设置: ```makefile LOCAL_PATH := $(call my-dir) ``` 这行代码将`LOCAL_PATH`设置为当前文件所在的目录。 #### 3. **检查编译配置** - 在`device.mk`中添加`PRODUCT_PACKAGES += DBLauncher`,确保模块名(`DBLauncher`)与`Android.mk`中定义的`LOCAL_MODULE`一致(即`DBLauncher`)。 - 如果模块名不一致,编译系统将无法找到对应的模块。 #### 4. **处理依赖关系** - 如果当贝桌面依赖其他库,需要在`Android.mk`中通过`LOCAL_STATIC_LIBRARIES`或`LOCAL_SHARED_LIBRARIES`声明。 - 引用[5]提到,可以使用`LOCAL_C_INCLUDES`来指定头文件路径,例如: ```makefile LOCAL_C_INCLUDES := $(LOCAL_PATH)/include ``` #### 5. **检查编译环境** - 确保编译环境正确设置,特别是对于预编译的APK(使用`LOCAL_CERTIFICATE := PRESIGNED`),需要确保APK已经签名。 - 如果使用主机工具链(host executable),注意引用[2]提到,可能需要使用GNU工具链来编译主机目标,并调整`Android.mk`。 #### 6. **调试方法** - 在编译时使用`mm`命令单独编译模块,可以快速定位问题: ```bash cd vendor/rockchip/common/apps/DBLauncher mm ``` - 查看编译输出,确认错误信息。 #### 7. **常见错误处理** - **错误:No such file or directory**:通常是路径错误。检查`Android.mk`中引用的文件(如源文件、头文件)路径是否正确,特别是相对路径。 - **错误:No rule to make target**:检查文件是否存在,以及`LOCAL_SRC_FILES`中的文件名是否拼写正确。 - 对于预置APK,确保`LOCAL_SRC_FILES`指定的APK文件名与实际一致(例如`DBLauncher.apk`)。 ### 示例修正后的Android.mk 假设我们有以下目录结构: ``` vendor/rockchip/common/apps/DBLauncher/ ├── DBLauncher.apk └── Android.mk ``` `Android.mk`内容如下: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 模块名,必须与PRODUCT_PACKAGES中名称一致 LOCAL_MODULE := DBLauncher LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_TAGS := optional LOCAL_BUILT_MODULE_STEM := package.apk LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) # 设置为特权应用 LOCAL_PRIVILEGED_MODULE := true # 使用预签名 LOCAL_CERTIFICATE := PRESIGNED # 源文件 LOCAL_SRC_FILES := DBLauncher.apk include $(BUILD_PREBUILT) ``` ### 编译和验证 - 执行`source build/envsetup.sh`和`lunch`选择目标设备。 - 使用`make DBLauncher`单独编译模块,或`make -j8`全编译。 - 如果编译成功,生成的APK会被打包到`system/priv-app/DBLauncher`目录下。 ### 相关问题 §§相关问题§§ 1. 如何正确设置Android.mk中的LOCAL_PATH? 2. 预置APK时出现签名错误如何解决? 3. 如何调试Android源码编译中的模块依赖问题? 4.Android.mk中如何添加第三方共享库依赖?</think>### 解决 Android.mk 文件路径错误导致的编译失败问题 #### 问题分析 当出现 `Android build error including Android.mk file No such file or directory` 错误时,通常由以下原因导致: 1. **文件路径错误**:Android.mk 文件不在预期位置或路径引用错误[^1] 2. **编译环境问题**:NDK 工具链配置不正确或环境变量缺失[^2] 3. **依赖关系缺失**:模块依赖未正确声明 4. **文件权限问题**:文件不可读或执行权限不足 --- ### 解决方案步骤 #### 1. 验证文件路径和存在性 ```bash # 在源码根目录执行 find . -name Android.mk | grep DBLauncher # 检查预期路径是否存在 ls -l vendor/rockchip/common/apps/DBLauncher/Android.mk ``` - 若文件不存在:需重新创建文件(参考原始回答中的创建步骤) - 若路径错误:修正 `device.mk` 中的引用路径 #### 2. 检查 Android.mk 配置(关键修正) ```makefile # 确保 LOCAL_PATH 正确定义 LOCAL_PATH := $(call my-dir) # 必须位于文件开头 # 检查模块名称匹配 LOCAL_MODULE := DBLauncher # 必须与 PRODUCT_PACKAGES 名称一致 # 验证源文件引用 LOCAL_SRC_FILES := DBLauncher.apk # 文件名需与实际APK一致 ``` #### 3. 修正 device.mk 配置 ```makefile # device/rockchip/rk3128/device.mk PRODUCT_PACKAGES += \ DBLauncher # 必须与 LOCAL_MODULE 同名 # 添加模块路径声明(解决路径错误) PRODUCT_PACKAGE_OVERLAYS += vendor/rockchip/common/apps/DBLauncher ``` #### 4. 设置环境变量(解决 NDK 问题) ```bash # 在编译前执行 export NDK_PROJECT_PATH=$(pwd)/vendor/rockchip/common/apps/DBLauncher export APP_BUILD_SCRIPT=$(NDK_PROJECT_PATH)/Android.mk ``` #### 5. 检查文件权限 ```bash chmod a+r vendor/rockchip/common/apps/DBLauncher/Android.mk chmod a+x vendor/rockchip/common/apps/DBLauncher/DBLauncher.apk ``` #### 6. 编译调试命令 ```bash # 单独编译模块(快速验证) mmm vendor/rockchip/common/apps/DBLauncher -j8 # 查看详细错误日志 make DBLauncher 2>&1 | grep -C 10 "No such file" ``` --- ### 常见问题处理 1. **路径大小写敏感问题**: ```bash # Linux 文件系统区分大小写 mv vendor/rockchip/common/apps/dblauncher vendor/rockchip/common/apps/DBLauncher ``` 2. **NDK 工具链配置**: - 确保 `ndk-build` 在 PATH 中 - 更新 `build/core/toolchains` 中的工具链配置[^2] 3. **依赖缺失问题**: ```makefile # 在 Android.mk 中添加显式依赖 LOCAL_REQUIRED_MODULES := libcutils liblog ``` --- ### 验证流程 ```bash # 编译成功后检查 find out/target/product/rk3128/system/priv-app -name "DBLauncher*" # 检查镜像内容 make snod && simg2img system.img system_raw.img && mount -o loop system_raw.img /mnt ls -l /mnt/system/priv-app/DBLauncher ``` > **提示**:若仍失败,检查 `build/core/main.mk` 中 `ALL_MODULES` 是否包含 `DBLauncher` 模块[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值