博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

recovery升级所遇问题

Posted on 2019-07-19 15:36  不上班行不行  阅读(1796)  评论(0)    收藏  举报

分析区块的命令

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;