新闻详情

新闻详情

首页 / 资讯中心 / 详情

安卓系统镜像解包打包全链路:simg2img、make_ext4fs 与 mkuserimg.sh 实战

发布时间:2026/9/29 16:11:17来源:尧图网络
安卓系统镜像解包打包全链路:simg2img、make_ext4fs 与 mkuserimg.sh 实战
简介这份资源是面向Android系统开发者、ROM制作人和设备调试者的已编译工具集用于解决系统镜像解包、打包与格式转换等操作需求。包内共4个文件包含make_ext4fs、simg2img、img2simg三个可执行程序及一个mkuserimg.sh脚本压缩包约136KB体积轻便解压后可直接在命令行调用。其中img2simg与simg2img负责稀疏镜像与标准镜像的双向转换make_ext4fs用于生成ext4文件系统镜像mkuserimg.sh则整合内核、根文件系统等组件生成完整用户镜像。已有2942人学习下载说明该工具集在镜像处理场景中具有实际参考价值。借助这套工具读者可快速完成分区镜像的转换、文件系统构建与用户镜像打包理解Android系统内部结构并为定制系统与调试问题提供可复用的命令行方案。1. 安卓系统镜像解包打包从 img 到 ext4 再回到 img 的完整链路手里拿到一个安卓设备的固件包解压出来一堆.img文件想改里面的东西——换个开机动画、删几个预装应用、调一下build.prop——结果发现这些 img 根本不是能直接挂载的格式。这是做安卓系统裁剪、机顶盒定制、行车记录仪固件改造时最常撞上的第一堵墙。img2simg、make_ext4fs、mkuserimg.sh、simg2img这四个工具就是拆墙的整套家伙事。它们解决的核心问题只有一个安卓的system.img、vendor.img这类分区镜像在 sparse 格式和 ext4 格式之间来回转换并且能重新打包成设备能识别的镜像。适合谁做 ROM 定制的、搞机顶盒系统裁剪的、折腾开发板安卓移植的以及任何需要修改安卓分区内容再刷回去的人。这套工具集已经编译好意味着你不需要从 AOSP 源码树里单独编它们拿到就能用。2. 四个工具各管什么先搞清楚 sparse 和 ext4 的区别2.1 为什么安卓镜像不能直接 mount安卓的system.img在出厂时通常是sparse 格式也叫 Android sparse image。这种格式不是文件系统的真实布局而是一种压缩表示——它把连续的零数据块用简短的头部描述代替目的是让镜像文件更小、刷机时写入更快。你直接mount -o loop system.img /mnt会失败因为内核的 loop 设备不认识 sparse 头部。要修改里面的内容必须先把 sparse 转成raw ext4 格式这时候它才是一个真正的 ext4 文件系统镜像可以挂载、可以读写。改完之后再转回 sparse 格式或者直接打包成设备能刷的镜像。四个工具的分工是这样的工具方向作用simg2imgsparse → raw把 sparse 镜像转成 raw ext4 镜像img2simgraw → sparse把 raw 镜像转回 sparse 格式make_ext4fs目录 → ext4从一个目录生成 ext4 文件系统镜像mkuserimg.sh目录 → img封装脚本调用 make_ext4fs 并处理权限、selinux 等实际工作流通常是simg2img解开 → mount 修改 → 用make_ext4fs或mkuserimg.sh重新打包 → 必要时img2simg转回 sparse。2.2 simg2img 和 img2simg 的最小用法先确认工具可执行chmod x simg2img img2simg make_ext4fs mkuserimg.sh ./simg2img --help如果输出用法说明说明工具链没问题。接下来做转换# sparse 转 raw得到可挂载的 ext4 镜像 ./simg2img system.img system_raw.img # 查看转换后的文件类型 file system_raw.img # 期望输出Linux rev 1.0 ext4 filesystem data ... # 挂载查看内容 mkdir -p /mnt/system sudo mount -o loop system_raw.img /mnt/system ls /mnt/systemsimg2img的输入是 sparse 格式输出是 raw 格式。转换后的文件通常比原文件大很多因为零数据块被展开了。这是正常的不用担心。反过来改完之后如果要转回 sparse# raw 转 sparse ./img2simg system_raw.img system_new.img # 验证 file system_new.img # 期望输出Android sparse image ...注意img2simg默认的 sparse 头部版本和块大小可能和原厂不一致。有些设备对 sparse 格式有严格要求如果刷回去不认需要加参数调整。2.3 make_ext4fs 的关键参数怎么设make_ext4fs是从一个目录直接生成 ext4 镜像的工具。它的基本用法./make_ext4fs -l 2048M -s -a system system_new.img /path/to/system_dir参数逐个说清楚-l 2048M指定镜像大小。这个值必须大于目录实际内容大小否则会报错。一般设成比原分区略大或相等。如果不知道原分区大小可以用du -sh /path/to/system_dir看实际占用然后留 10% 余量。-s生成 sparse 格式。不加这个参数生成的是 raw ext4。如果你后面还要用img2simg这里就不加-s。-a system指定挂载点名称。这个参数影响镜像内部的挂载信息一般填分区名比如system、vendor、userdata。最后一个参数是输出文件名再后面是源目录。常见翻车点-l设小了打包到一半报 “No space left on device”。解决办法是先du -sb看目录字节数再往上取整。2.4 mkuserimg.sh 帮你处理了哪些脏活mkuserimg.sh是一个 shell 封装脚本内部调用make_ext4fs但它额外处理了几件事./mkuserimg.sh -s /path/to/system_dir system_new.img ext4 system 2048M参数顺序是-s生成 sparse、源目录、输出文件、文件系统类型、挂载点、分区大小。它比直接调make_ext4fs多做的事包括设置正确的文件权限和 SELinux 上下文标签、处理file_contexts文件、确保lostfound目录存在。如果你直接make_ext4fs打包出来的镜像刷进去后出现权限拒绝或 SELinux 报错大概率就是少了这些处理。提示不同安卓版本的mkuserimg.sh参数顺序可能不同。拿到工具后先cat mkuserimg.sh看一眼内部实现确认参数顺序再执行。3. 完整实操改一个 system.img 并重新打包刷回3.1 从固件包里定位并解开 system.img假设你拿到一个固件包解压后目录结构是这样的firmware/ ├── system.img ├── vendor.img ├── boot.img └── ...先确认system.img是不是 sparse 格式file system.img # 输出可能是Android sparse image, version: 1.0, ... # 也可能是Linux rev 1.0 ext4 filesystem data ...如果是 sparse用simg2img转换./simg2img system.img system_raw.img如果是 raw ext4跳过这步。然后挂载sudo mkdir -p /mnt/android_system sudo mount -o loop,rw system_raw.img /mnt/android_system-o rw表示以读写方式挂载这样你可以直接修改内容。如果只想查看不加rw也行。3.2 修改内容时的权限和 SELinux 坑挂载之后你可以删应用、改配置。但有几个坑必须提前知道权限问题安卓系统目录里的文件权限和普通 Linux 不一样。比如/system/bin下的可执行文件通常是755/system/etc下的配置文件可能是644。如果你用cp覆盖文件默认权限可能不对导致刷进去后服务起不来。改完之后用chmod和chown修正# 示例确保文件权限正确 sudo chmod 755 /mnt/android_system/bin/some_binary sudo chown root:root /mnt/android_system/bin/some_binarySELinux 上下文安卓 5.0 以后 SELinux 是 enforcing 模式每个文件都有安全上下文标签。如果你新增了文件但没有打标签开机后 init 进程会拒绝访问。查看当前标签ls -Z /mnt/android_system/bin/如果新增文件需要打标签用chconsudo chcon u:object_r:system_file:s0 /mnt/android_system/bin/new_file但更稳妥的做法是修改完后用mkuserimg.sh重新打包它会根据file_contexts自动处理标签。前提是你的工具目录里有对应设备的file_contexts文件。3.3 用 mkuserimg.sh 重新打包并验证修改完成后先卸载sudo umount /mnt/android_system然后打包。假设你要生成 sparse 格式的镜像./mkuserimg.sh -s /path/to/modified_system system_new.img ext4 system 2048M如果mkuserimg.sh报错找不到make_ext4fs检查脚本里的路径变量或者把make_ext4fs放到 PATH 里export PATH$PATH:/path/to/tools打包完成后验证# 确认是 sparse 格式 file system_new.img # 转回 raw 再挂载检查内容是否完整 ./simg2img system_new.img system_check.img sudo mount -o loop system_check.img /mnt/check ls /mnt/check sudo umount /mnt/check如果挂载后能看到你修改的内容说明打包成功。3.4 刷回设备前的最后检查刷机有风险刷前先确认几件事镜像大小是否超过分区大小。用ls -l system_new.img看文件大小对比设备分区表里system分区的大小。超过的话刷进去会失败甚至变砖。sparse 格式版本是否匹配。有些老设备只认 sparse v1新工具默认可能生成 v2。如果刷不进去试试img2simg的兼容参数。是否有回滚方案。刷之前把原厂system.img备份好最好确认设备有 fastboot 或 recovery 模式可以救回来。4. 避坑指南五个让新手翻车的典型场景4.1 挂载报 “wrong fs type” 或 “bad option”现象mount -o loop system.img /mnt报错提示文件系统类型不对。原因system.img还是 sparse 格式没有转成 raw ext4。内核的 loop 设备不认识 sparse 头部。解决先执行./simg2img system.img system_raw.img再挂载system_raw.img。用file命令确认转换后的格式是 ext4。4.2 make_ext4fs 报 “No space left on device”现象打包到一半失败提示空间不足。原因-l参数指定的镜像大小小于源目录实际内容大小。make_ext4fs需要预留 inode 和块的开销实际可用空间比-l值略小。解决用du -sb /path/to/dir看目录字节数然后-l设成这个值乘以 1.1 到 1.2。如果目录里有大量小文件还要考虑 inode 数量可以加-i参数调整 inode 大小。4.3 刷进去后开机卡 logo 或无限重启现象镜像刷入成功但设备开不了机。原因最常见的是 SELinux 上下文丢失或权限不对。其次是删除了系统关键组件或者build.prop改错了参数。解决先用mkuserimg.sh重新打包确保 SELinux 标签正确。如果还是不行对比原厂镜像和你修改后的镜像用diff看目录结构差异。重点检查/system/bin/init、/system/etc/init/下的 rc 文件、以及build.prop里的ro.开头属性。4.4 img2simg 转出来的镜像刷不进去现象img2simg转换成功但 fastboot 刷入时报错。原因sparse 头部版本或块大小不匹配。不同设备对 sparse 格式的支持程度不同。解决试试img2simg的-b参数指定块大小或者直接用make_ext4fs -s生成 sparse 格式而不是先 raw 再转。另外确认输出文件大小没有超过分区限制。4.5 挂载后修改文件重新打包发现修改丢失现象明明在挂载目录里改了文件打包后挂载检查发现还是旧内容。原因可能是挂载时用了只读模式或者修改后没有sync就卸载。还有一种可能是打包时源目录指错了。解决挂载时加-o rw修改后执行sync再umount。打包前用ls确认源目录里确实有你修改的内容。如果用的是mkuserimg.sh确认第一个参数是修改后的目录路径。5. 进阶技巧用 file_contexts 和 fs_config 精确控制打包结果前面提到mkuserimg.sh会自动处理 SELinux 标签和权限但前提是工具目录里有正确的file_contexts和fs_config文件。这两个文件决定了镜像里每个文件的权限、所有者和安全上下文。如果你做的定制比较深比如新增了系统服务或修改了分区布局就需要自己维护这两个文件。file_contexts的格式是每行一条规则/system/bin/init u:object_r:init_exec:s0 /system/bin/sh u:object_r:shell_exec:s0 /system/etc/init/*.rc u:object_r:system_file:s0左边是路径支持通配符右边是 SELinux 上下文。打包时make_ext4fs会读取这个文件给匹配的文件打上对应标签。fs_config的格式是system/bin/init 0 0 755 system/bin/sh 0 0 755 system/etc/build.prop 0 0 644每行是相对路径、uid、gid、权限模式。这个文件控制文件所有者和权限位。实际使用时把这两个文件放在工具目录下然后调用./make_ext4fs -l 2048M -s -a system -S file_contexts -C fs_config system_new.img /path/to/system_dir参数说明-S指定 SELinux 上下文文件-C指定权限配置文件。这样打包出来的镜像每个文件的权限和标签都是精确控制的不依赖源目录的当前状态。我自己的习惯是每次修改系统目录后先diff对比原厂file_contexts和fs_config确认新增文件有没有对应的规则。如果没有手动补上再打包。这个步骤多花五分钟能省掉刷机后排查 SELinux 拒绝的大量时间。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Claude Code实战:插件harness报错排查与DeepSeek等第三方模型接入 2026/9/29 17:07:35

Claude Code实战:插件harness报错排查与DeepSeek等第三方模型接入

最近后台私信里问得最多的不是哪个新模型刷榜了,而是围绕claude code这个命令行工具的一连串问题:怎么装、怎么配插件、plugins加载报错怎么解决、怎么接第三方模型。说实话,Claude Code 火起来不奇怪——它把 AI 编程从"网页里复制粘贴…

阅读更多 →
Elasticsearch繁简互通检索:用char_filter实现中文字符归一化索引升级 2026/9/29 17:07:35

Elasticsearch繁简互通检索:用char_filter实现中文字符归一化索引升级

1. 需求背景:为什么普通索引撑不住繁简混合检索我之前遇到一个很典型的咨询:某个做书籍资料检索的搜索服务,线上索引跑得好好的,结果运营反馈“用户搜简体词,命中的繁体标题全部漏掉”。比如用户搜“软件开发”&#x…

阅读更多 →
AI生成代码风格与团队不一致?从原理到实操教你调教出“自己人”代码 2026/9/29 17:07:35

AI生成代码风格与团队不一致?从原理到实操教你调教出“自己人”代码

AI 写的代码一跑就通,但完全不像我们组写的——问题出在哪最近团队里引入了 AI 编程助手,大家新鲜劲儿还没过,就冒出了一个特别别扭的问题:AI 生成的代码,功能上没毛病,测试也能过,但代码风格跟…

阅读更多 →
Java 8核心特性实战:Lambda、Stream、Optional与日期新API 2026/9/29 17:07:35

Java 8核心特性实战:Lambda、Stream、Optional与日期新API

1. 开篇:Java 8 到底改变了什么先说一句可能得罪人的话:很多写了几年 Java 的人,其实还在用 Java 7 的思维写 Java 8 的代码。项目里用的是 JDK 8,但写出来的东西清一色是 for 循环、if 判空、new Thread——这不是你的错&#xf…

阅读更多 →
电赛校内预选赛备赛全攻略:四大题型与实战避坑指南 2026/9/29 17:07:35

电赛校内预选赛备赛全攻略:四大题型与实战避坑指南

1. 一场预选赛,筛选的不只是"会不会玩单片机"1.1 预选赛到底在选什么每年的这个时候,学院公告栏都会贴出电赛校内预选赛的报名通知。今年也不例外——集电资讯刚拿到赛程安排,就赶紧来给你们划重点了。电赛,全称是全国大…

阅读更多 →
ADS1220+STM32实现PT100高精度测温方案详解 2026/9/29 17:07:28

ADS1220+STM32实现PT100高精度测温方案详解

去年做一套工业循环水温度采集,客户验收标准很直接:0~120℃范围内显示偏差不能超过0.2℃。刚开始我用PT100加一片24位ADC,再配一个自制的恒流源,板子画完调了一周,室温下稳定的时候看着还挺准,可温度一上去…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉