install-recovery.sh & applypatch

来源:互联网 发布:以太网端口 编辑:程序博客网 时间:2024/05/16 18:11

install-recovery.sh & applypatch

 (2014-05-25 21:35:55)
转载
 分类: Android
2012-12-21 11:32

install-recovery.sh & applypatch

1. android/system/core/rootdir/init.rc:       

1
2
3
service flash_recovery /system/etc/install-recovery.sh
    class main
    oneshot



2. out/target/product/xxx/root/init.rc:

1
2
3
service flash_recovery /system/etc/install-recovery.sh
    class main
    oneshot



3. android\bootable\recovery\applypatch


4. android\build\tools\releasetools\ota_from_target_files

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def MakeRecoveryPatch(output_zip, recovery_img, boot_img):
  """Generate binary patch that creates the recovery image starting
  with the boot image.  (Most of the space in these images is just the
  kernel, which is identical for the two, so the resulting patch
  should be efficient.)  Add it to the output zip, along with shell
  script that is run from init.rc on first boot to actually do the
  patching and install the new recovery image.
     
  recovery_img and boot_img should be File objects for the
  corresponding images.  info should be the dictionary returned by
  common.LoadInfoDict() on the input target_files.
     
  Returns an Item for the shell script, which must be made
  executable.
  """
     
  = common.Difference(recovery_img, boot_img)
  _, _, patch = d.ComputePatch()
  common.ZipWriteStr(output_zip, "recovery/recovery-from-boot.p"patch)
  Item.Get("system/recovery-from-boot.p"dir=False)
     
  boot_type, boot_device = common.GetTypeAndDevice("/boot"OPTIONS.info_dict)
  recovery_type, recovery_device = common.GetTypeAndDevice("/recovery"OPTIONS.info_dict)
     
  sh = """#!/system/bin/sh
if applypatch -c %(recovery_type)s:%(recovery_device)s:%(recovery_size)d:%(recovery_sha1)s; then
  log -t recovery "Installing new recovery image"
  applypatch %(boot_type)s:%(boot_device)s:%(boot_size)d:%(boot_sha1)s %(recovery_type)s:%(recovery_device)s %(recovery_sha1)s %(recovery_size)d %(boot_sha1)s:/system/recovery-from-boot.p
else
  log -t recovery "Recovery image already installed"
fi
""" % 'boot_size'boot_img.size,
        'boot_sha1'boot_img.sha1,
        'recovery_size'recovery_img.size,
        'recovery_sha1'recovery_img.sha1,
        'boot_type'boot_type,
        'boot_device'boot_device,
        'recovery_type'recovery_type,
        'recovery_device'recovery_device,
        }
  common.ZipWriteStr(output_zip, "recovery/etc/install-recovery.sh"sh)
  return Item.Get("system/etc/install-recovery.sh"dir=False)



5. ota.zip\recovery\etc\install-recovery.sh:

1
2
3
4
5
6
7
#!/system/bin/sh
if applypatch -MTD:recovery:3586808:a1bdc75a0eaa8faf855807c3b60c43dbcfb1400a; then
  log -recovery "Installing new recovery image"
  applypatch MTD:boot:3776935:6cbe8dfacd08ba5cfa39b97e16de0d1f8176c0ed MTD:recovery a1bdc75a0eaa8faf855807c3b60c43dbcfb1400a 3586808 6cbe8dfacd08ba5cfa39b97e16de0d1f8176c0ed:/system/recovery-from-boot.p
else
  log -recovery "Recovery image already installed"
fi



Recovery will never overwrite itself, instead it will install /system/etc/install-recovery.sh script to update recovery on the next bootup; this ensures that the system is always capable of booting into recovery even if the normal bootup fails. The install-recovery.sh script works by combining boot with patch and writing the result to the recovery partition.

0 0
原创粉丝点击