Actualización mediante ficheros update.zip en Android
Contents
Introducción
Para realizar una actualización masiva de ficheros dentro de Android, por ejemplo instalar una ROM nueva, la mejor forma de hacerlo es utilizando fichero "update.zip" que serán instalados utilizando los procedimientos ya existentes en android.
Ejemplo de Cyanogen
Si estudiamos el fichero de actualización para instalar una nueva versión de Cyanogen:
ls -l update-cm-6.0.0-N1-RC1-signed.zip
-rw-r--r-- 1 acs acs 67748622 jul 22 18:04 update-cm-6.0.0-N1-RC1-signed.zip
mkdir update
cd update
unzip ../update-cm-6.0.0-N1-RC1-signed.zip
tree -L 2
.
|-- META-INF
| |-- CERT.RSA
| |-- CERT.SF
| |-- MANIFEST.MF
| `-- com
|-- boot.img
`-- system
|-- app
|-- bin
|-- build.prop
|-- etc
|-- fonts
|-- framework
|-- lib
|-- media
|-- usr
`-- xbinTenemos el fichero de inicio del sistema, boot.img, con el núcleo y el ramdisk. Por otro lado tenemos el directorio "system" con todo lo que queremos que pase a ser los contenidos del directorio "/system" del sistema Android y finalmente, tenemos el directorio "META-INF" con la firma del paquete de actualización, el fichero "MANIFEST.MF", creada con Android SignApk, con información de todos los ficheros.
Por último tenemos el programa de actualización con los pasos a dar para llevar a cabo la actualización:
tree META-INF/com/
META-INF/com/
|-- android
| `-- metadata
`-- google
`-- android
|-- update-binary
`-- updater-scriptcon información general sobre los contenidos:
cat META-INF/com/android/metadata modver=CyanogenMod-6.0.0-N1-RC1 post-build=google/passion/passion/mahimahi:2.2/FRF91/43546:user/release-keys post-timestamp=1278820447 pre-bootloader=0.33.2012|0.33.0012 pre-device=passion
y la descripción del proceso de actualización en:
head -20 META-INF/com/google/android/updater-script
ui_print("Welcome to CyanogenMod-6.0.0-N1-RC1!");
assert(getprop("ro.product.device") == "passion" || getprop("ro.build.product") == "passion" || getprop("ro.product.board") == "passion");
assert(getprop("ro.bootloader") == "0.33.2012" ||
getprop("ro.bootloader") == "0.33.0012");
package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
set_perm(0, 0, 0777, "/tmp/backuptool.sh");
run_program("/tmp/backuptool.sh", "backup");
show_progress(0.500000, 0);
format("MTD", "system");
mount("MTD", "system", "/system");
show_progress(0.500000, 40);
package_extract_dir("recovery", "/system");
package_extract_dir("system", "/system");
symlink("../xbin/su", "/system/bin/su");
symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
"/system/xbin/arp", "/system/xbin/ash", "/system/xbin/awk",
...que es interpretada por el binario "META-INF/com/google/android/update-binary" para llevar a cabo el proceso.
Pasemos a estudiar este proceso de actualización.
El programa de actualización
El programa "update-binary" que interpreta y ejecuta "updater-script" lo podemos encontrar en código fuente dentro del código fuente de android:
tree ./bootable/recovery/updater/ ./bootable/recovery/updater/ |-- Android.mk |-- install.c |-- install.h |-- updater.c `-- updater.h .... ./out/target/product/passion/utilities/update-binary
El proceso de firma