分析区块的命令
1.hdparm --fibmap filename :该命令可以用来查看逻辑区块地址LBA,也就是扇区地址,每个扇区一般大小为512bytes或1024bytes。
如:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 3870638080 3870654463 16384
8388608 3871445992 3871448575 2584
区块地址(由文件系统划分)和LBA之间的转换:
LBA = begins at LBA + 区块地址*(blocksize/sector size)
无法升级recovery分区:
在recovery模式中进行升级的时候,是无法升级recovery分区的,为了升级recovery分区,需要在制作升级包的时候指定-2参数。这样就会生成升级recovery分区的升级包。
指定-2参数后,整个升级的过程会被分为三步。
1.将recovery-two-step.img(如果该文件不存在则使用recovery.img)提取到boot分区中,从boot分区中进行重启
2.将recovery.img提取到recovery分区。(进行了升级)
3.启动到recovery模式,开始进行vendor,system等分区的校验升级。
install-recovery.sh这个也是用来更新recovery的,但是目前不清楚和上面方式的联系在哪里。
在Android重启进入到正常系统到会启动flash_recovery服务,由这个服务执行install-recovery.sh,进行recovery的更新。
flash_recovery服务定义在init.rc(system/core/rootdir)中:
service flash_recovery /system/bin/install-recovery.sh class main oneshot
脚本内容是由Python脚本build/tools/releasetools/common.py在生成OTA更新包时生成的
if ! applypatch -c EMMC:/dev/block/bootdevice/by-name/recovery:63456556:d48dab0d03d49d0289cfc5f681e548102fe353be; then
applypatch -b /system/etc/recovery-resource.dat EMMC:/dev/block/bootdevice/by-name/boot:59049256:85a672bff089fb7be098c6c1d90a0910d4e19712
EMMC:/dev/block/bootdevice/by-name/recovery d48dab0d03d49d0289cfc5f681e548102fe353be 63456556 85a672bff089fb7be098c6c1d90a0910d4e19712:
/system/recovery-from-boot.p && log -t recovery "Installing new recovery image: succeeded" ||
log -t recovery "Installing new recovery image: failed"
else
log -t recovery "Recovery image already installed"
fi
想使用flash_recovery这个服务往往需要一些selinux权限
在/system/sepolicy/private/file_contexts中添加
#recovery update /dev/block/rknand_boot u:object_r:boot_block_device:s0 /dev/block/rknand_recovery u:object_r:recovery_block_device:s0 /dev/block/bootdevice/by-name/boot u:object_r:boot_block_device:s0 /dev/block/bootdevice/by-name/recovery u:object_r:recovery_block_device:s0
如果还缺少其他权限可根据avc: denied提示进行添加。
如果因为recovery升级失败往往会提示
recovery: Installing new recovery image: failed。
在连续更新时也会提示因build fingerprint不同导致升级失败。
修改或添加升级脚本的断言语句
在/build/tools/releasetools/edify_generator.py中可进行修改,例如去除fingerprint的比较
def AssertSomeFingerprint(self, *fp):
"""Assert that the current recovery build fingerprint is one of *fp."""
if not fp:
raise ValueError("must specify some fingerprints")
cmd = (' ||\n '.join([('getprop("ro.build.fingerprint") == "%s"') % i
for i in fp]) +
' ||\n abort("E%d: Package expects build fingerprint of %s; '
'this device has " + getprop("ro.build.fingerprint") + ".");') % (
common.ErrorCode.FINGERPRINT_MISMATCH, " or ".join(fp))
#self.script.append(cmd)
在recovery模式下升级除system和vendor,boot等其他分区,例如bootloader
将要升级的镜像添加到/device/qcom/d820/radio中,名字和filesmap保持一致便可。
编译ota
制作升级包
为recovery添加data分区的权限
system/sepolicy/recovery.te
allow recovery system_app_data_file:dir r_dir_perms;
allow recovery system_app_data_file:file r_file_perms;
浙公网安备 33010602011771号