recovery 模式下,使用updater-script 脚本来完成的升级。

系统自带到ota_rom_target_files.py,编译时可以生成updater-script的脚本。

有时我们需要自己定义升级的功能。下面自己写一个升级脚本。完成升级功能。

1 创建目录结构:

data/app

META-INF/com/google/android/update-binary

META-INF/com/google/android/updater-script

system/app

system/xbin/busybox

其中data/app下面的apk会被复制到系统的/data/data/app目录下.

其中system/app下面的内容会被复制到系统的/system/app目录下

其中system/xbin下面的内容会被复制到系统的/system/xbin目录下

如果需要放入到系统相应目录下面,你就建立;没有可以空着。

system/xbin/busybox,是我们需要的。这个可以在busybox网站下载armv6版的。

META-INF/com/google/android/update-binary 这个文件从make 系统的ota升级包中复制同名文件。

META-INF/com/google/android/updater-script 这个文本文件下面我们来写。

updater-script的内容

我们复制/data/app下面的所有apk到/data/app目录下面;我们使用busybox的目的是使用cp命令。因为android系统的toobox 没有cp命令。

        
  1. show_progress(0.500000,0);
  2. ui_print("liuhongchao-Updaterscript..");
  3. ############################
  4. #partioninformationcame from
  5. #0/tmpramdisk(null)(null)0
  6. #1/bootemmc/dev/block/mmcblk0p8(null)0
  7. #2/cacheext4/dev/block/mmcblk0p15(null)0
  8. #3/dataext4/dev/block/mmcblk0p13(null)0
  9. #4/persistext4/dev/block/mmcblk0p14(null)0
  10. #5/recoveryemmc/dev/block/mmcblk0p16(null)0
  11. #6/recovery-bakext4/dev/block/mmcblk0p17(null)0
  12. #7/sdcardvfat/dev/block/mmcblk1p1/dev/block/mmcblk10
  13. #8/systemext4/dev/block/mmcblk0p12(null)0
  14. ############################
  15. #mountpartion
  16. show_progress(0.100000,0);
  17. ui_print("liuhongchao--mountpartion...");
  18. mount("ext4","EMMC","/dev/block/mmcblk0p12","/system");
  19. mount("ext4","EMMC","/dev/block/mmcblk0p13","/data");
  20. ############################
  21. #extract_dir
  22. #show_progress(0.100000,0);
  23. #ui_print("liuhongchao--extract_dir...");
  24. package_extract_dir("system","/system");
  25. #package_extract_dir("system/lib","/system/lib");
  26. ############################
  27. #setsymlinkfile----
  28. #show_progress(0.100000,0);
  29. #ui_print("liuhongchao--symlink...");
  30. #symlink("/data/app/apps.apk","/system/app/apps.apk");
  31. #symlink("/data/etc/hosts","/system/etc/hosts");
  32. ############################
  33. #setpermfile----
  34. #show_progress(0.100000,0);
  35. #ui_print("liuhongchao--setpermfile..");
  36. set_perm(0,0,04755,"/system/xbin/busybox");
  37. #set_perm_recursive(1000,1000,0771,0644,"/data/app");
  38. #set_perm(2000,2000,0771,"/data/etc");
  39. ############################
  40. #copysome_dir
  41. #show_progress(0.100000,0);
  42. #ui_print("liuhongchao--copysome_dir...");
  43. #package_extract_dir("../../sdcard/test","/data/data");
  44. #package_extract_dir("/sdcard/test","/data/data");
  45. ############################
  46. #copyrun_program
  47. show_progress(0.100000,0);
  48. ui_print("liuhongchao--run_program...");
  49. run_program("/system/bin/mkdir","/data/data/cpdirtest");
  50. set_perm(1000,1000,0640,"/data/data/cpdirtest");
  51. #run_program("/system/bin/mv","/mnt/sdcard/test","/data/data/run");
  52. run_program("/system/xbin/busybox","cp","-r","/sdcard/test/*","/data/data/cpdirtest/");
  53. #package_extract_file("data/run.sh","/tmp/run.sh");
  54. #set_perm(0,0,0777,"/tmp/run.sh");
  55. #run_program("/tmp/run.sh");
  56. ############################
  57. #deletesomefile----
  58. #show_progress(0.100000,0);
  59. #ui_print("liuhongchao--deletesomefile...");
  60. #delete_recursive("/data/data/otatest");
  61. #delete_recursive("/system/app/getOTA.apk");
  62. #delete("/system/app/getOTA.apk");
  63. ############################
  64. #writebootimg----
  65. #show_progress(0.100000,0);
  66. #ui_print("liuhongchao--writebootimg..");
  67. #package_extract_file("boot.img","/tmp/boot.img");
  68. #write_raw_image("/tmp/boot.img","boot");
  69. #delete("/tmp/boot.img");
  70. ############################
  71. #setunmount----
  72. show_progress(0.100000,0);
  73. ui_print("liuhongchao--unmount...");
  74. unmount("/data");
  75. unmount("/system");

这是个我写的模板,选择需要用的命令。下面的命令是必须的。

  1. mount("ext4","EMMC","/dev/block/mmcblk0p12","/system");
  2. mount("ext4","EMMC","/dev/block/mmcblk0p13","/data");
  3. package_extract_dir("system","/system");
  4. package_extract_dir("data","/data");
  5. #下面的命令可以复制任何你需要的内容;busybox
  6. set_perm(0,0,04755,"/system/xbin/busybox");
  7. run_program("/system/xbin/busybox","cp","/sdcard/app-private/hello.apk","/data/app-private/");
  8. unmount("/data");
  9. unmount("/system");

下面这个是我这个的Android系统的分区表,不同的硬件平台会不同。为了mount时不出错。这个文件在src/device/qcom/msm8660_surf/recovery.fstab

############################

  1. #partioninformationcame from
  2. #0/tmpramdisk(null)(null)0
  3. #1/bootemmc/dev/block/mmcblk0p8(null)0
  4. #2/cacheext4/dev/block/mmcblk0p15(null)0
  5. #3/dataext4/dev/block/mmcblk0p13(null)0
  6. #4/persistext4/dev/block/mmcblk0p14(null)0
  7. #5/recoveryemmc/dev/block/mmcblk0p16(null)0
  8. #6/recovery-bakext4/dev/block/mmcblk0p17(null)0
  9. #7/sdcardvfat/dev/block/mmcblk1p1/dev/block/mmcblk10
  10. #8/systemext4/dev/block/mmcblk0p12(null)0

updater-script 的局限
updater-script 的局限是,所有内容需要打包在update.zip内。如果要操作其他内容。需要busybox的cp命令。

打包update.zip

将上面的三个目录压缩到一个update.zip文件。然后用下面的命令

            
  1. java-Xmx2048m-jar../signapk.jar-w../testkey.x509.pem../testkey.pk8
  2. ./update.zip./update-sign.zip

其中signapk.jar在src/out/host/linux-x86/framework/下面

../testkey.x509.pem和./testkey.pk8是你系统的签名私钥和公钥文件。系统默认使用testkey。这个文件位置在:

/src/build/target/product/security/

执行升级
update-sign.zip命名为updat.zip 放入/sdcard/ 从系统里面执行setting/security/update-fw

升级日志

升级的log日志文件在/cache/recovery/last_log 这个位置是在/bootable/recovery/recovery.c 写定的。

典型的内容如下:

                
  1. StartingrecoveryonMonNov2102:44:112011
  2. startingrecoverymainfunc.
  3. framebuffer:fd4(1920x1080)
  4. recoveryfilesystemtable
  5. =========================
  6. 0/tmpramdisk(null)(null)0
  7. 1/bootemmc/dev/block/mmcblk0p8(null)0
  8. 2/cacheext4/dev/block/mmcblk0p15(null)0
  9. 3/dataext4/dev/block/mmcblk0p13(null)0
  10. 4/persistext4/dev/block/mmcblk0p14(null)0
  11. 5/miscemmc/dev/block/mmcblk0p17(null)0
  12. 6/recoveryemmc/dev/block/mmcblk0p18(null)0
  13. 7/sdcardvfat/dev/block/mmcblk1p1/dev/block/mmcblk10
  14. 8/systemext4/dev/block/mmcblk0p12(null)0
  15. write_file_with_value:file_name=/sys/module/misc_gpio/parameters/uart2_rx_cfg,value=1
  16. read_value_from_file:file_name=/sys/module/misc_gpio/parameters/tv_busy,value=0
  17. read_value_from_file:file_name=/sys/module/misc_gpio/parameters/uart2_rx_stus,value=0
  18. TV_BUSYandUART_RXathighstate.Enterrecoverying...
  19. write_file_with_value:file_name=/sys/module/misc_gpio/parameters/uart2_tx_cfg,value=0
  20. write_file_with_value:file_name=/sys/module/misc_gpio/parameters/qc_busy,value=1
  21. write_file_with_value:file_name=/sys/module/misc_gpio/parameters/uart2_tx_write,value=1
  22. I:Bootcommand:reset-device-info
  23. beforeupdate_package=/sdcard/update.zip
  24. afterupdate_package=/sdcard/update.zip
  25. Command:"/sbin/recovery""--update_package=/sdcard/update.zip"
  26. ro.secure=0
  27. ro.allow.mock.location=1
  28. ro.debuggable=1
  29. ro.build.fingerprint=qcom/msm8660_surf/msm8660_surf:3.2.1/LE111116/eng.liuhongchao.20111116.162249:eng/test-keys
  30. ro.emmc=1
  31. init.svc.recovery=running
  32. init.svc.adbd=running
  33. Findingupdatepackage...
  34. I:Updatelocation:/sdcard/update.zip
  35. Openingupdatepackage...
  36. I:1key(s)loadedfrom/res/keys
  37. Verifyingupdatepackage...
  38. I:verify_filereturned0
  39. Installingupdate...
  40. /tmp/update_binaryexist,deleteitfirst
  41. liuhongchao--Verifyingcurrentsystem...
  42. liuhongchao--Removingunneededfiles...
  43. liuhongchao--Patchingsystemfiles...
  44. minzip:Extractedfile"/system/app/getOTA.apk"
  45. minzip:Extractedfile"/system/xbin/busybox"
  46. liuhongchao--Unpackingnewfiles...
  47. liuhongchao--umountsystem
  48. scriptresultwas[/system]
  49. afterinstall_packagefunc,installstatus=0.

前半部是分区表。中间的是build.prop文件。系统默认的需要验证ro.build.fingerprint,我们这里忽略。

你可以看到有我们打印的日志

常见错误

看last_log

mount error

注意问题

:updater-script 有些旧版本的命令不支持。具体的命令映射在src/bootable/recovery/roots.c

本文出自 “lhc180” 博客,谢绝转载!

更多相关文章

  1. Android中资源文件夹res/raw和assets的使用
  2. Android开发中用到的命令
  3. android 模拟器命令
  4. [Android Studio / NDK] 如何使用javah生成.h文件
  5. Android图形显示系统——一张图片的显示流程
  6. Android 打开本地文件兼容7.0
  7. [Google Android] 理解NDK(1)-- 编译Android .so文件
  8. Google手机Android操作系统面试题

随机推荐

  1. Android(安卓)内存管理 &Memory Leak & O
  2. Android(安卓)KitKat 4.4 Wifi移植AP模式
  3. Socket Android手机客户端与PC服务端局域
  4. Android(安卓)M 新的运行时权限开发者需
  5. 学习Android的几大主攻方向
  6. Android原生分享到微博、微信等平台的实
  7. 对Android及移动互联网的大局观看法!
  8. Android壁纸机制(Android(安卓)Q与老版本
  9. Android中AsyncTask详解,源码剖析(API 23)
  10. Android进程管理简单介绍