Actualización mediante ficheros update.zip en Android

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
    `-- xbin

Tenemos 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-script

con 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

Referencias

AndroidUpdate (last edited 2010-08-09 09:36:21 by AlvaroDelCastillo)