system.img格式打包学习

2023-05-16

★★★ 个人博客导读首页—点击此处 ★★★

一、OTA中是如何编译system.img和system.map的
在制作OTA包时(make otapackage)会重新编译system.img,并生成system.map文件,系统编译system的流程如下:
(1)OutputFile是将system.map参数写入到了block_list参数中,后续在打包system.img时会根据block_list来确定是否需要制作system.map.
在这里插入图片描述

(2)、调用了BuildImage来准备制作images所需的具体参数

在这里插入图片描述

(3)调用了mkuserimg_mke2fs.sh脚本,开始制作system.img

在这里插入图片描述

(4)、mke2fs打包了system.img,e2fsdroid生成了system.map
在这里插入图片描述

mke2fs对应的源码:external/e2fsprogs/misc/mke2fs.c
e2fsdroid对应的源码 : external/e2fsprogs/contrib/android/e2fsdroid.c

二、正常的android编译是如何打包制作system.img的
当敲击make命令时,会找到第一个目标droid,droid依赖droid_targets,droid_targets依赖droidcore和dist_files,droidcore的依赖关系如下:
.PHONY: droidcore
droidcore: files
systemimage
$(INSTALLED_BOOTIMAGE_TARGET)
$(INSTALLED_RECOVERYIMAGE_TARGET)
$(INSTALLED_VBMETAIMAGE_TARGET)
$(INSTALLED_USERDATAIMAGE_TARGET)
$(INSTALLED_CACHEIMAGE_TARGET)
$(INSTALLED_BPTIMAGE_TARGET)
$(INSTALLED_VENDORIMAGE_TARGET)
$(INSTALLED_PRODUCTIMAGE_TARGET)
$(INSTALLED_SYSTEMOTHERIMAGE_TARGET)
$(INSTALLED_FILES_FILE)
$(INSTALLED_FILES_FILE_VENDOR)
$(INSTALLED_FILES_FILE_PRODUCT)
$(INSTALLED_FILES_FILE_SYSTEMOTHER)
soong_docs

当敲击make systemimage时,systemimage依赖INSTALLED_SYSTEMIMAGE,INSTALLED_SYSTEMIMAGE依赖BUILT_SYSTEMIMAGE(=system.img), BUILT_SYSTEMIMAGE的命令行中,调用了build_image.py来打包制作system.img.

systemimage: $(INSTALLED_SYSTEMIMAGE)
在这里插入图片描述
BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img
在这里插入图片描述
在这里插入图片描述

继续分析,同上一节中OTA中是如何编译system.img的方法一致。

三、总结
有上述分析可以,make otapackage会重新编译system.img,这和make systemimage编译的方法基本一致,除了在准备参数时略有不同,如在make otapackage时,准备了block_list参数,所以make otapackage会生成system.map,而make systemimage就不会生成。
打包制作system.img的核心就是:mke2fs、e2fsdroid 两个android的工具。

四、相关常用工具
1、simg2img system.img system_raw.img //将压缩形式system.img解压
2、sudo mount -t ext4 system_raw.img /mnt/systemtest //将解压后的system_raw.img进行mount。
mount后,就可以看到system.img中的文件了,这和进入到手机adb shell中看到的文件一致,也和out目录下system目录下的文件一致。
3、二进制读取system_raw.img中的数据,其中count=1表示读取1个块(4k),skip=25016表示从25016块处开始读取。
dd if=./system_raw.img of=test01.dd bs=4K count=1 skip=25016 conv=sync
4、显示二进制文件
hexdump test01.dd | more

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

system.img格式打包学习 的相关文章

  • Java Manifest.mf 类路径问题

    我一直在尝试运行一个 jar 文件 我们称之为 test jar 它在 Unix 系统上使用 Sybase jconn3 jar 我创建了一个 MANIFEST MF 文件 其中包含以下内容 Class Path SYBASE jConne
  • 打印或死亡:如何检查 GPFS 网络安装的文件是否可用

    我有一个 Perl 脚本 用于写入位于 GPFS 网络安装存储点上的文件 有一个标准检查open FILE or die 文件系统宕机了 但是脚本并没有退出 它一直在努力写作 文件系统恢复后 Perl 脚本完成 如何检查文件系统是否可以写入
  • 使用 sys/mount.h 挂载 ISO

    我正在尝试在 Linux 中的 C 程序中挂载 ISO 文件 我知道 linux 命令可以实现此目的 即 mount o Loop Test iso mnt myISO 但是 mount 2 手册页声明了以下安装原型 int mount c
  • IPC、域袜子、命名管道

    IPC 和 Unix 域套接字和命名管道有什么区别 我从各种书籍中得到了模糊的定义 但无法弄清楚应该在哪里使用哪个定义 两个进程相互通信的任何方式都可以被视为 IPC 的一种形式 例如 未命名管道 cat file txt grep foo
  • 文件系统树形视图

    我正在使用文件系统 并且我有一个文件对象的 List 这些文件对象将文件路径作为属性 基本上 我需要在 NET 中创建一个树视图 但我很难想出执行此操作的最佳方法 因为我需要从如下列表创建树结构 C WINDOWS Temp ErrorLo
  • system()的返回码 = 256

    我使用 system 在 Swift 中执行 shell 命令 正如文档中所述 如果成功 返回值应为 0 如果失败 则返回值应为 1 但我得到 256 并且执行似乎成功了 还有一些其他与魔法值 256 相关的问题 但语言不同 没有解决方案
  • 看完这篇 教你玩转镜像转换神器qumu实现虚拟机做题自由!

    前言 最近有小伙伴说比赛没设备 问有没有不需要设备也能实现做题自由的方法 今天这里分享一期 看完这篇你将学会 使用 qumu 转换镜像格式 一般我们做题都是 img 格式的环境 需要导入设备 有些小伙伴没有设备 就可以使用这种方法 把 im
  • 获取所有系统壁纸

    有没有办法以编程方式获取所有android系统壁纸 我知道如何通过WallpaperManager 然后将其保存到磁盘 但我想知道是否有一种方法可以访问操作系统中包含的所有用作系统壁纸的图片 所有壁纸都位于启动器应用程序中 由于启动器的名称
  • 使用以 SYSTEM 身份运行的 vb.net 应用程序,如何为每个登录用户启动一个分离的进程?

    经过几周对这个主题的研究 我终于决定开始自己的主题 希望有经验的人可以提供帮助 我在互联网上进行了搜索 试图了解各种编码示例 但在尝试将可行的解决方案组合在一起时却遇到了困难 让我从一些背景开始 背景 我有一个 vb net 应用程序 正在
  • 在 C++ 中查看 system() 调用的输出

    如何查看系统命令的输出 前任 int tmain int argc TCHAR argv system set PATH PATH C Program Files x86 myFolder bin system cd C thisfolde
  • 在 Perl 中启动非等待后台进程

    我有一个 Perl 脚本 需要在后台启动另一个进程并退出 而不等待其他脚本完成 StackOverflow 上有很多线程介绍如何在 Perl 中等待或如何不等待其他编程语言 但我似乎找不到 Perl 的正确答案 我已经阅读了相当多的内容 并
  • 如何在 Qt 中获取输出 system() 命令?

    我在 Qt 中使用 system 命令 我想获得输出并将其显示给用户 我的命令是 system echo rootPass toAscii su root c yum y install packageName toAscii 当我在 QP
  • 如何检查命令是否可用或存在?

    我正在 Linux 上用 C 语言开发一个控制台应用程序 现在 它的可选部分 不是必需的 取决于可用的命令 二进制文件 如果我检查system 我越来越sh command not found作为不需要的输出 并将其检测为存在 那么我该如何
  • 如何在perl系统函数中同时使用管道并防止shell扩展?

    如果将多个参数传递给 perl 的系统函数 则 shell 扩展将不起作用 COMMAND perl e my s system echo s RESULT 如果该命令作为一个参数传递 则扩展将起作用 COMMAND perl e my s
  • 如何在 OS X C 代码中创建异步计时器?

    所以这个问题实际上是 为什么 time h 在 OS X 和 Linux 上不一样 但是 我已经接受了这些分歧 为了在 Unix 系统上创建计时器 我遵循了本教程http www helsinki fi atk unix dec manua
  • 在 system() 函数中使用变量 C++

    string line ifstream myfile aaa txt getline myfile line system curl exe b cookie txt d test line http example com http e
  • 使用Intent打开系统应用程序

    我正在尝试制作一个简单的应用程序 当用户从主屏幕或应用程序抽屉单击时 该应用程序会将用户发送到特定的 系统安装的 应用程序 系统设置 日历 浏览器等 例如 我目前尝试在启动应用程序时打开系统设置 就像设置快捷方式一样 可以按照我想要的方式实
  • 获取进程段的开始和结束 C/C++

    我需要获取以下进程段的开始和结束地址 代码 数据 堆栈 环境 我了解它如何位于内存中 但不知道如何使用 api 调用或其他方式获取它 我找到了如何使用此代码开始某些片段 include
  • C#,System.Timers.Timer,每 15 分钟运行一次,与系统时钟同步

    如何让 System Timers Timer 每 15 分钟触发一次与系统时钟同步的事件 换句话说 我希望它恰好在 xx 00 xx 15 xx 30 xx 45 触发 其中 xx 表示任何小时 您可以让它每秒流逝一次 并检查当前时间是否
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试

随机推荐