install-recovery.sh & applypatch

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值