以上镜像可以通过下列表格中的命令进行编译生成:
ldswfun@android:/mnt/ext-disk1/a10-aosp$ file out/target/product/generic_x86_64/*.imgout/target/product/generic_x86_64/cache.img: Linux rev 1.0 ext4 filesystem data, UUID=b39526f5-9f30-4595-89b5-02c27f8bdc47, volume name "cache" (extents) (large files) (huge files)out/target/product/generic_x86_64/encryptionkey.img: dataout/target/product/generic_x86_64/ramdisk.img: gzip compressed data, from Unixout/target/product/generic_x86_64/super.img: dataout/target/product/generic_x86_64/system.img: Linux rev 1.0 ext2 filesystem data, UUID=150757cd-b579-4f77-bda8-e30833daf100 (extents) (large files) (huge files)out/target/product/generic_x86_64/system-qemu.img: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0x189,6,61), startsector 1, 6313983 sectors, extended partition table (last)out/target/product/generic_x86_64/userdata.img: Linux rev 1.0 ext4 filesystem data, UUID=76ae5bcf-1b51-4822-b666-3124b61e4970, volume name "data" (extents) (large files) (huge files)out/target/product/generic_x86_64/userdata-qemu.img:Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)out/target/product/generic_x86_64/vbmeta.img: dataout/target/product/generic_x86_64/vendor.img: Linux rev 1.0 ext2 filesystem data, UUID=443bb3f2-9b8d-42d1-bca1-38cc4b1294af, volume name "vendor" (extents) (large files) (huge files)out/target/product/generic_x86_64/vendor-qemu.img: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0xe,233,27), startsector 1, 239615 sectors, extended partition table (last)
模块 | make 命令 |
boot.img | make bootimage |
system.img | make systemimage 或者make snod(更快的直接生成system.img, 不管out/target/product/xx/system是否有变化) |
ramdisk.img | make ramdisk |
userdata.img | make userdataimage |
super.img | make superimage 或者make supernod(更快的直接生成super.img, 不管文件是否有变化) |
Bootloader | misc | dtbo | vbmeta | Kernel(dtb) | ramdisk | recovery | cache | system | vendor | userdata |
Bootloader | misc | dtbo | vbmeta | boot | recovery | cache | super | userdata |
RK3399的使用镜像:
kernel+ramdisk.img+system+qemu.img(vbmeta+super.img(system+vendor))+cache.img+userdata.img
MiniLoaderAll.bin+parameter.txt+trust.img+uboot.img+misc.img+boot.img+dtbo.img+vbmeta.img+recovery.img+super.img+oem.img
此时直接得到ramdisk.img, 但是类型为ASCII cpio archive (SVR4 with no CRC), 可以通过binwalk ramdisk.img查看里面的内容, 也可以通过cpio进行解压
mkdir rootfs ; cp ramdisk.img rootfs/ ; cd rootfs/ ; mv ramdisk.img ramdisk.img.gz ; gunzip ramdisk.img.gz
最后就得到
mkdir root ; cd root ; cpio -i -F ../ramdisk.img

打包ramdisk方法:1 ,回到rootfs目录, 生成cpio 包:2 压缩cpio包:
cd root; find . | cpio -o -H newc > ../tmp_ramdisk.img
在system-as-root系统中,ramdisk.img 不会作为/目录, 而只是为了兼容升级到10的设备, ramdisk作为虚拟分区来覆盖原来的ramdisk分区。
cd ..gzip -c tmp_ramdisk.img > ramdisk.img
拆包方法:拆包需要一个工具unpack_bootimg, 在源码中通过make unpack_bootimg 即可生成,unpack_bootimg --boot_img boot.img --out boot-out/
+—————–+| boot header | 1 page+—————–+| kernel | n pages+—————–+| ramdisk | m pages+—————–+| second stage | o pages+—————–+n = (kernel_size + page_size – 1) / page_sizem = (ramdisk_size + page_size – 1) / page_sizeo = (second_size + page_size – 1) / page_size0. all entities are page_size aligned in flash1. kernel and ramdisk are required (size != 0)2. second is optional (second_size == 0 -> no sec
boot-out/目录出现如下内容:
boot_magic: ANDROID!kernel_size: 26406920kernel load address: 0x10008000ramdisk size: 803395ramdisk load address: 0x11000000second bootloader size: 367616second bootloader load address: 0x10f00000kernel tags load address: 0x10000100page size: 2048boot image header version: 2os version and patch level: 335544651product name:command line args: console=ttyFIQ0 androidboot.baseband=N/A androidboot.wificountrycode=US androidboot.veritymode=enforcing androidboot.hardware=rk30board androidboot.console=ttyFIQ0 androidboot.verifiedbootstate=orange firmware_class.path=/vendor/etc/firmware init=/init rootwait ro loop.max_part=7 androidboot.selinux=permissiveadditional command line args:recovery dtbo size: 0recovery dtbo offset: 0x0boot header size: 1660dtb size: 0dtb address: 0x11f00000

因为在 Android10.0上的模拟器并没有使用boot.img, 所以上面截图展示的是rk3399的镜像, 其中second是一个自定义的数据,里面包含内核的启动logo相关资源。

发现镜像直接是ext4格式, 此时可以直接用mount命令挂载
system.img: Linux rev 1.0 ext4 filesystem data, UUID=da594c53-9beb-f85c-85c5-cedf76546f7a, volume name "system" (extents) (large files)
在Android10中, file查看system.img类型是如下信息:
mout -o loop system.img /mnt
那么可以通过如下指令进行挂载,只能以只读的方式挂载:
system.img: Linux rev 1.0 ext2 filesystem data, UUID=d5afeddb-7a81-4c6c-bb5f-432134648a83 (extents) (large files) (huge files)
sudo mount -t ext4 -o ro system.img /mnt
fdisk是操作MBR分区的工具,通过fdisk查看镜像的分区信息, Android10 中的system-qemu.img是如下显示:
file system-qemu.imgsystem.img: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0x15,86,17), startsector 1, 4198399 sectors, extended partition table (last)
上面会显示有两个分区,但是分区名字不知道, 此时可以使用sgdisk --print system-qemu.img 查看分区的详细信息:
fdisk -lu system-qemu.imgDisk system-qemu.img: 3 GiB, 3232759808 bytes, 6313984 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: gptDisk identifier: 03F437AC-0563-4205-A497-50E4454EDC28设备 Start 末尾 扇区 Size 类型system-qemu.img1 2048 4095 2048 1M Linux filesystemsystem-qemu.img2 4096 6311935 6307840 3G Linux filesystem
如果要拆包system.img的话, 可以通过以下dd命令进行实现:拆分vbmeta分区命令:
Disk system-qemu.img: 6313984 sectors, 3.0 GiBLogical sector size: 512 bytesDisk identifier (GUID): 03F437AC-0563-4205-A497-50E4454EDC28Partition table holds up to 128 entriesFirst usable sector is 34, last usable sector is 6313950Partitions will be aligned on 2048-sector boundariesTotal free space is 4029 sectors (2.0 MiB)Number Start (sector) End (sector) Size Code Name 1 2048 4095 1024.0 KiB 8300 vbmeta 2 4096 6311935 3.0 GiB 8300 super
拆分super分区命令:
mkdir split/name=vbmeta ; start=2048 ; end=4095dd if=system-qemu.img of=split/${name}.img skip=${start} bs=512 count=$((${end} - ${start} + 1))
拆分之后得到vbmeta.img和super.img(如果是sparse类型就需要转成成raw类型, 如果不是,就直接用lpunpack解压出来, 文章后面会讲到)Android9 中的system-qemu.img是如下显示, 只有一个分区:
name=super ; start=4096 ; end=6311935dd if=system-qemu.img of=split/${name}.img skip=${start} bs=512 count=$((${end} - ${start} + 1))
查看到sector大小和实际镜像的起始位置,得到一个偏移量: 512 * 2048 = 1048576, 如果偏移量位置的数据就是ext4格式, 那么通过如下命令进行尝试挂载:
fdisk -lu system.imgDisk system.img: 2 GiB, 2149580800 bytes, 4198400 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: gptDisk identifier: 2FCBC3C1-F125-460D-8F4C-D692F088359DDevice Start End Sectors Size Typesystem.img1 2048 4196351 4194304 2G Linux filesystem
注意:这种挂载, 只限于一个分区的情况。修改完毕之后直接umount
sudo mount -o loop,offset=1048576 system.img /mnt
umount /mnt
同时也可以通过simg2img工具将sparse image转换成raw ext4, (simg2img源码的位置在system/core/libsparse,编译出来的目标文件在out/host/linux-x86/bin/simg2img)
system/core/libsparse/simg_dump.py -v out/target/product/rk3399_roc_pc_plus/system.img
通过file system_raw.img查看得到:
simg2img system.img system_raw.img
将system_raw.img直接挂载到一个挂载点上,如mp/挂载点
system_raw.img: Linux rev 1.0 ext2 filesystem data, UUID=753c2954-f4f9-4846-afb1-f6eac8e43f24 (extents) (large files)
ls ./mp 查看目录下的文件
sudo mount system_raw.img mp/


可以通过如下命令进行解包:格式转化成raw:
super.img: Android sparse image, version: 1.0, Total of 927744 4096-byte output blocks in 2501 input chunks.
将super数据中各个段进行拆包(在x86_64产品上编译出来的文件不是sparce image, 直接用lpunpack拆包就可以了):
simg2img ./super.img ./super_raw.img
得到如下:
lpunpack super_raw.img

通过file可以查看各个img的类型,发现都是ext2的,那么就可以直接mount查看了
重新打包:
make_ext4fs -l 2018M -s rootfs.sparse ../target/

可以使用android在带的avbtool对vbmeta.img进行解析:avbtool info_image --image vbmeta.img > vbmeta.img.info 
vbmeta官方文档:https://source.android.com/security/verifiedboot我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只