资讯详情

资讯详情

RKDevTool实战:固件解包打包与Android系统定制指南

1. RKDevTool的真实定位不只是烧录更是固件拆解与重组的利器做瑞芯微平台开发的朋友对RKDevTool应该都不陌生但我发现很多人对它的认识停留在烧录工具这个层面——设备连上电脑Load进固件点个按钮完了。我最早也是这么用的直到接手一个需要给盒子定制系统的项目要预装几个APK、删掉厂商塞进来的一堆无用应用、换掉开机画面才知道原来RKDevTool还内置了完整的固件解包和打包能力这才是真正干活的地方。说白了RKDevTool是瑞芯微官方提供的Windows图形化工具它干三件事。第一件是烧录把编译好的固件或者单个分区镜像写进开发板/盒子/平板的存储芯片里第二件是解包把一个完整的update.img固件包拆成一个个独立的分区镜像文件第三件是打包把修改过的分区镜像重新组合成一个完整的update.img。后面这两件事就是本文要展开的核心。很多人会问我为什么要去解包固件直接用源码编译不就行了做过实际项目的都懂——很多时候你根本没有完整的源码。你可能从方案商那里只拿到一个编译好的update.img厂商又不愿意给你源码或者只给了中间层的SDK这时候想改系统唯一的路径就是解包固件 → 修改分区镜像 → 重新打包。即使你有源码解包打包也是快速验证改动最快的方式总不至于改一个开机logo就去重新编译整个系统。还有一个非常实际的场景备份。开发板在长期使用中原厂固件是你排查软硬件问题的基准参照物。把固件解包后你能直观看到每个分区的占用情况、版本信息、驱动有无更新甚至能从里面挖出厂商隐藏的调试接口配置。这些在平时也许用不上真到出问题时就是你排查问题的底牌。这里必须先纠正一个普遍的误解解包和打包操作不需要连接任何设备完全是PC端本地操作所以你完全可以在一台没有开发板的Windows电脑上完成固件的拆解和重组。而烧录才需要设备进入Loader模式。搞清楚这一点你就能把解包打包当成一种文件格式转换来理解心理负担能小很多。2. Windows下的环境准备驱动、版本和配套工具箱2.1 选对RKDevTool版本RKDevTool并不是越新越好这可能是新手最容易踩的坑。瑞芯微的芯片型号跨度很大从早期的RK2918、RK3288到后来的RK3399、RK3568、RK3588每代芯片的固件格式、Loader机制都有差异。新版RKDevTool确实能兼容部分老芯片但老版本工具去解新平台的固件大概率直接报错。我见过有人拿RKDevTool v2.65去解RK3568的固件工具直接崩溃换了配套的v3.15版本就正常了。我的建议是如果你是拿开发板做项目优先去开发板厂商官网下载他们配套提供的RKDevTool版本而不是在通用渠道随便找一个。因为板厂一般会针对自己的固件定制过工具兼容性最有保障。如果你从瑞芯微官方渠道获取那就按你使用的芯片型号对应下载推荐版本。2.2 DriverAssitant驱动安装驱动是绕不开的第一道坎。RKDevTool运行本身不需要驱动但你要烧录验证就必须让Windows识别到Loader模式下的设备。驱动工具一般叫DriverAssitant属于瑞芯微的USB驱动包。安装时有几个细节右键以管理员身份运行权限不够会出现安装失败或者设备管理器里显示黄色感叹号。安装前关闭360、腾讯管家之类的安全软件驱动被拦截的情况比想象中常见。在Windows 10/11上如果提示驱动签名问题需要重启进入高级启动选项选择禁用驱动程序强制签名模式再装一次。设备连接后怎么确认驱动正常打开设备管理器会看到一个Rockchip USB相关的设备条目如果显示正常且没有感叹号就可以正常烧录了。2.3 配套工具箱RKDevTool解决的是固件整体的解包和打包但真正动刀修改分区镜像时还得靠几个配套工具。我按使用频率整理了这份清单工具用途使用时机7-Zip只读查看system.img等镜像内部文件快速确认系统里预装了什么APPimgRePackerRK命令行方式解包/打包瑞芯微固件RKDevTool图形界面处理不了的场景magiskboot解包/重打包boot.img需要修改内核或ramdisk时WSL或Ubuntu虚拟机挂载system.img并读写修改需要增删系统文件时Notepad或VS Code编辑parameter.txt等文本配置修改分区表时这套工具箱里WSLWindows Subsystem for Linux是我强烈建议提前装好的。很多分区镜像是ext4格式Windows原生不识别WSL只需一行命令就能挂载读写比装双系统省事太多。3. 先看懂update.img固件内部结构与分区表解读3.1 固件包的基本构成不打无准备之仗。动手解包之前你得先知道update.img里面装了什么。瑞芯微固件本质上是一个复合文件它把一个Loader引导程序、一个参数分区表文件以及若干个独立的分区镜像打包在一起。用RKDevTool解包后典型的输出目录是这样的output/ ├── Image/ │ ├── loader.bin │ ├── parameter.txt │ ├── uboot.img │ ├── trust.img │ ├── misc.img │ ├── boot.img │ ├── recovery.img │ ├── resource.img │ ├── system.img │ ├── vendor.img │ └── userdata.img └── (RKDevTool生成的配置文件)不同芯片、不同方案的固件分区镜像的个数和名称会有差异。比如RK3588平台可能多出super.img动态分区、dtbo.img等而一些低端盒子甚至只有boot、system、userdata三个分区。不要死记硬背重点是理解每个分区的作用后面修改时才能有的放矢。3.2 parameter.txt分区表怎么读parameter.txt是整个固件的目录索引所有分区的大小、起始位置都靠它定义。打包工具也是靠它才能把一个system.img放到正确的位置上。不同平台的parameter.txt内容略有不同但核心结构相似我截取一段典型示例FIRMWARE_VER: 1.0 MACHINE_MODEL: RK3568 MACHINE_ID: 007 MANUFACTURER: Rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: 3568 CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE: mtdpartsrk29xxnand:0x000020000x00004000(uboot),0x000020000x00006000(trust),0x000020000x00008000(misc),0x000100000x0000a000(boot),0x000100000x0001a000(recovery),0x000100000x0002a000(backup),0x000200000x0003a000(cache),0x000400000x0005a000(metadata),0x000200000x0009a000(kernel),0x000200000x000ba000(ramdisk),0x000200000x000da000(resource),0x00f000000x000fa000(system),0x000400000x00ffa000(vendor),0x000080000x0103a000(uboot_a),0x000000000x01042000(userdata)这一行长长的CMDLINE是看懂整个分区布局的关键。它的格式是分区大小起始位置(分区名)分区大小和起始位置都以512字节为一个扇区单位。换算方法很简单实际字节数 扇区数 × 512。比如0x000100000x0000a000(boot)boot分区大小是0x00010000 × 512 32MB起始位置是0x0000a000 × 512 20MB。系统固件在烧录时烧录工具就是按照这个表把每个分区镜像写到对应位置。所以你在修改分区大小时参数表里的数值必须同步改否则镜像写入的位置就错了。3.3 各分区镜像的作用理解分区作用是决定改哪里的前提。我整理了一张常用分区说明表分区主要作用实际修改需求uboot.imgU-Boot引导程序一般不动trust.imgARM TrustZone安全固件一般不动misc.img系统启动模式标记几乎不碰boot.img内核ramdisk改内核参数、root权限时动recovery.img恢复模式系统特殊需求才动resource.img开机logo、LCD驱动配置换开机画面必动system.imgAndroid主系统只读分区预装APK、精简应用、改系统配置vendor.img硬件抽象和私有库驱动相关修改时动userdata.img用户数据分区放预置数据时动这里要特别注意system.img。在Android系统中它是只读挂载的你在解包打包后往里面添加文件如果操作姿势不对会导致开机后系统起不来或者改动丢失。后面第6节我会专门讲这个。4. 解包实操把update.img拆成可编辑的分区镜像4.1 图形化解包步骤铺垫这么多可以动手了。用RKDevTool解包的操作路径并不复杂完整步骤如下用管理员身份运行RKDevTool插不插开发板都无所谓解包是纯本地操作。切换到窗口顶部的固件选项卡这个选项卡就是你做固件级操作的入口。点击解包按钮此时会弹出文件选择窗口选中你要处理的update.img。接下来选择解包文件的输出目录建议单独建一个专门文件夹比如D:\work\rk3568_fw不要撒在桌面。点击确认后工具开始解包。大固件比如system分区有几个GB级别的会需要一点时间耐心等待进度条走完。完成之后打开输出目录能看到Image子文件夹以及工具生成的一个配置文件这个配置文件记录了固件的基础信息打包时要用到。整个过程没有任何隐藏步骤简单到一次就能记住。但有几个操作细节值得注意输出目录路径尽量不要带中文和特殊字符。个别版本的工具对中文路径处理有bug会出现解包报错或者输出文件缺失。解包过程中如果弹出杀毒软件警告把RKDevTool加入白名单再重新操作。工具生成的配置文件有时会被杀软误报。解包得到的system.img可能是ext4格式Windows资源管理器双击打不开这是正常的不是文件坏了。4.2 解包产物说明解包完成后不要急着改文件先把产物的卫生搞明白。Image文件夹下每个文件对应一个分区其中三个是所有平台都共有的骨架loader.bin芯片上电最先执行的引导代码负责初始化DDR和内存储控制器然后跳转到U-Boot。这个文件一般不需要动。parameter.txt刚才讲过的分区表所有分区的布局信息都在这里。后面如果调整分区大小改的就是它。boot.imgLinux内核和ramdisk的组合体系统启动的核心。system.img体积最大的镜像Android系统主体就在里面。如果你用7-Zip直接打开system.img可以快速浏览整个Android系统的文件结构查看/system/app、/system/priv-app、/system/etc等目录。这在前期评估我要预装哪些APK、要删哪些内置应用时非常方便不用等到挂在Linux下。4.3 解包失败排查思路解包失败是这个流程里最让人头秃的环节但绝大多数失败原因其实很集中。我把自己遇到过的几个高频问题整理成了排查表错误现象可能原因处理方式工具直接崩溃退出RKDevTool版本与固件不匹配换用板厂配套的版本提示无法识别固件格式固件被加密或文件头损坏向厂商确认是否加密固件解包后找不到某分区固件本身没有该分区属正常不影响使用进度条卡在中间不动输出目录权限不够或磁盘空间不足更换目录并检查剩余空间解包出的system.img大小异常输出文件被安全软件隔离关闭实时防护后重新解包最麻烦的是加密固件。部分商业方案商为了保护固件会对update.img做加密处理RKDevTool解包时会直接报错。这种情况下没有任何办法绕过只能联系方案商要未加密版本或者授权。遇到这种情况别浪费时间去折腾工具直接走沟通渠道最务实。5. 打包实操修改完之后重新组装固件5.1 打包前必须检查的三件事第一步是检查分区大小。system.img这类镜像修改后体积可能增大比如你预装了一批APK整个镜像比原来大了几百MB。此时务必确认镜像大小没有超过parameter.txt里定义的分区大小——超过就装不下烧录会报错或者烧进去后分区表错乱。检查方法是解包后先用属性查看各镜像体积再和parameter.txt里的扇区数换算字节数对比。换算公式我再说一遍字节数 扇区数 × 512。第二步是确认文件格式没有变。比如system.img原本是ext4格式你修改操作结束后仍然要保持ext4格式挂载、卸载不要中途转成格式换掉。有些人在Windows下用工具把system.img里的文件提取出来改完再塞回去做出来的镜像文件系统和分区表不匹配烧进去直接无法挂载。第三步是确保目录结构完整。如果解包后的Image文件夹里少了某个镜像文件或者目录结构被改动过RKDevTool打包时会报错或者生成一个残缺固件。所以我建议你解包后先复制一份完整目录作为备份再在其中一份上做修改这样随时可以拿备份目录重新打包。5.2 图形化打包步骤RKDevTool打包流程和解包互为镜像同样在固件选项卡里操作点击打包按钮此时弹出的是文件夹选择框需要你选择解包时生成的目录也就是包含Image子文件夹的那个目录。RKDevTool会读取目录中的配置信息和parameter.txt在界面上显示固件版本、芯片型号等概要信息确认无误。设置输出固件的文件名和保存路径比如D:\output\my_custom_update.img。点击开始执行打包进度条走完后会提示成功。打包完成后不要立刻就拿去刷机先看一下文件大小是否与原始固件包在同一量级。如果你只改了很小的东西输出包却比原包大了几倍十有八九是哪里出了问题。还有一种场景我只需要替换固件中的某一个分区镜像不需要完整重新打包。这时可以在下载镜像选项卡里只加载那个分区对应的镜像文件单独烧录到设备上。这是开发调试阶段最省时间的做法——改一次system.img只烧system分区几秒钟就完事不用全量刷机。5.3 打包后的固件验证方法这里我强烈建议做两层验证缺一不可。第一层验证是拆开再看一遍。把你刚打包生成的update.img重新用RKDevTool解包一次对比一下解包产物和你修改前的目录结构。重点看分区数量是否一致、parameter.txt内容是否被正确写入、system.img的哈希值是否和你修改后的一致。这一步能快速发现打包过程中的低级错误。第二层验证是烧录试机。准备一台开发板先进入Loader模式烧录打包好的固件然后检查系统能否正常启动、之前修改的内容是否生效。千万不要跳过这一步直接上生产环境。5.4 打包失败与烧录异常的排查我自己在打包和验证阶段踩过的坑列出来给大家排雷问题可能原因解决方法打包时报参数错误parameter.txt被修改后格式损坏检查是否用带BOM的编码保存或者被改坏重新编辑烧录时提示loader错误loader.bin与parameter.txt不匹配尽量保持从原固件解包出的loader不动烧录后黑屏无显示boot.img或resource.img损坏用备份的原镜像单独烧录验证开机卡在logo界面system.img挂载失败或文件系统损坏检查system.img格式和修改过程重新打包预装APK没生效system.img里的包未正确处理确认APK放对了目录且权限正确有一个细节容易被忽略修改过parameter.txt后保存文件时务必另存为UTF-8无BOM格式。用Windows自带记事本编辑再保存很可能会带上BOM头RKDevTool读这个文件时会解析不到前几个字段导致打包后固件信息错乱。6. 解包打包之间的深水操作boot.img、system.img和开机logo6.1 boot.img内核与ramdisk的拆装如果你的需求涉及root权限、修改内核启动参数、替换ramdisk里的init逻辑那就得动boot.img。boot.img的格式和整个update.img不一样它的内部结构由mkbootimg工具生成必须在拆分后再修改。在Windows下我习惯用magiskboot这个神器。它体积小、对格式校验宽松是Android mod圈的事实标准。基本操作流程# 拆分boot.img magiskboot unpack boot.img # 拆分会得到kernel和ramdisk.cpio # 解压ramdisk.cpio magiskboot cpio ramdisk.cpio extract # 目录里就是ramdisk的文件系统可以做修改 # 修改完成后重新打包 magiskboot repack boot.img拆开boot.img后你会看到若干文件其中最重要的是kernel压缩过的Linux内核和ramdisk.cpio根文件系统。日常开发里改得最多的是ramdisk里的内容比如加一个启动脚本、修改default.prop有些版本叫prop.default里的系统属性、初始化root权限等。修改完boot.img后记得把它替换到解包目录的Image/boot.img位置再去RKDevTool里执行打包。如果你不确定自己改对了没有先把原始boot.img备份随时可以回退。6.2 system.imgWindows下查看Linux下修改system.img是预装APK、精简应用的主战场但它在Windows下属于半只读状态——能看不好改。提一句7-Zip打开system.img只能浏览和提取不能写回所以真正的修改工作得进Linux环境我用的是WSL。在WSL里挂载system.img推荐的流程# 先创建一个挂载点 sudo mkdir -p /mnt/sys # 挂载镜像为loop设备系统检测到是ext4会自动处理 sudo mount -o loop system.img /mnt/sys # 对/mnt/sys里的文件进行增删改 # 例如添加APK到预装目录 sudo cp app.apk /mnt/sys/system/app/ sudo chmod 644 /mnt/sys/system/app/app.apk sudo chown 0:0 /mnt/sys/system/app/app.apk # 改完后取消挂载 sudo umount /mnt/sys三个操作时最核心的坑文件权限、属主、SELinux标签。Android系统的system分区是只读挂载的所有内置APK的权限、属主必须和系统要求一致。一般规律是文件权限644属主可读写组和其他只读目录权限755属主为root。如果不加这些操作很可能出现系统启动正常但APK全部消失或者安装不了。SELinux标签是更隐蔽的坑。Android从7.0开始全面强制启用SELinux你新加的文件如果没有正确的安全上下文比如u:object_r:system_file:s0系统在挂载后会拒绝访问。简单的处理办法是在Linux环境下复制同目录下其他同类型文件的标签# 先设置好属主权限 sudo chown root:root app.apk sudo chmod 644 app.apk # 参考同目录文件设置SELinux上下文 sudo chcon --reference/mnt/sys/system/app/ExistingApp.apk /mnt/sys/system/app/app.apk6.3 resource.img与开机logo开机logo并不能靠替换boot.img里的图片来实现它存放在resource.img里。这个分区还包含LCD屏的驱动配置、内核资源等修改它需要专门的工具。通常的做法是用瑞芯微官方的resource_tool或者配套脚本先把resource.img里的logo.bmp等文件提取出来替换成你自己的图片再写回去。操作流程用resource_tool查看resource.img内容。提取logo.bmp和logo_kernel.bmp两个文件。把自制图片转成BMP格式和原图分辨率一致比如1280x720或1920x1080以原图为准。用resource_tool写回新图片。生成的resource_new.img替换到Image目录重新打包。如果你只是想让开机画面好看一点不用去碰其他复杂配置只替换一个logo.bmp就够了。自制图片保存为BMP时注意使用24位或32位色深太离谱的格式会导致开机显示异常。7. 我从解包打包踩坑中获得的操作习惯解包打包本身不难难的是把流程稳定跑完不出幺蛾子。一年多下来我逐渐养成了一套自己的操作习惯不一定适合所有人但确实帮我少踩了很多坑分享给大家参考。每次动手之前先做整固件备份。拿到任何一个开发板或者盒子的固件第一件事就是把原厂update.img备份到至少两个地方一个工作目录一个网盘/移动硬盘。原因很简单——修改后的固件可能会把设备刷死这时候原厂包就是你唯一的救命稻草。不要以为改一个APK不会出大问题我就见过有人改system.img时把文件系统搞坏整台设备变砖最后靠原厂包重新恢复。每次只改一个变量。这句话是调试的黄金法则在固件定制里同样适用。比如你要同时改开机logo和预装APK就分两次操作第一次只改logo烧录验证第二次只改APK烧录验证。这样出问题时你能立刻定位到是哪个修改引起的。我有一次图省事一次性把system.img和boot.img都改了结果设备起不来不知道是系统文件改错还是内核参数配置问题排查了一整天最后还是回到分步验证才找到原因。修改分区表时多做一步运算。修改parameter.txt之前哪怕只是改一个小分区的大小也建议亲自动手算一下各个分区的地址是否重叠。很多人直接复制一段网上找的分区表粘贴进去结果boot和recovery分区重叠烧录后启动逻辑完全错乱。只要花点时间算一遍就能避免这种低级问题。定期的文档记录。我会为每个项目维护一个固件变更记录表记录第几次修改、改了哪些分区镜像、是否烧录验证、遇到的问题和结论。这个习惯看起来很老土但当你同时维护好几个平台、好几个版本固件的时候靠脑子记忆是扛不住三个月后的自己来问这个固件改了什么的。以上这些习惯加在一起让我的解包打包流程从偶尔成功经常踩坑变成了一次跑通稳定可复现。RKDevTool能干的事情还有很多比如单独升级某个分区、导出设备分区表、量产时固件批量烧录工具本身值得花时间完整研究一遍。现在回头想当初如果早一点把固件解包打包的能力掌握熟练前面几个项目至少能省下一个多星期的摸索时间。希望这篇经验分享能帮你少走这一段弯路。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →