system.img格式打包学习
★★★ 個人博客導讀首頁—點擊此處 ★★★
一、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
總結
以上是生活随笔為你收集整理的system.img格式打包学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android编译32或64位程序
- 下一篇: python:将32位的16进制数据以二