Dentro de los paquetes inalámbricos

El sistema compila el objeto binario del actualizador a partir de bootable/recovery/updater y lo usa en un paquete inalámbrico.

El paquete es un archivo ZIP (ota_update.zip, incremental_ota_update.zip) que contiene el objeto binario ejecutable META-INF/com/google/android/update-binary

El actualizador contiene varias funciones integradas y un intérprete para una secuencia de comandos extensible lenguaje (edify) que admite comandos para tareas típicas relacionadas con la actualización. Aspecto del actualizador en el archivo ZIP del paquete para una secuencia de comandos del archivo META-INF/com/google/android/updater-script

Nota: No es común usar la secuencia de comandos de edify o las funciones integradas. actividad, pero puede ser útil si necesitas depurar el archivo de actualización.

Edificar sintaxis

Una secuencia de comandos edify es una expresión única en la que todos los valores son cadenas. Las cadenas vacías son false en un contexto booleano y todas las demás cadenas son true. Edify admite el los siguientes operadores (con los significados habituales):

(expr )
 expr + expr  # string concatenation, not integer addition
 expr == expr
 expr != expr
 expr && expr
 expr || expr
 ! expr
 if expr then expr endif
 if expr then expr else expr endif
 function_name(expr, expr,...)
 expr; expr

Cualquier cadena de caracteres a-z, A-Z, 0-9, _, :, /, . que no sea una palabra reservada considerado un literal de cadena. (Las palabras reservadas son if else y luego endif). Cadena los literales también pueden aparecer en comillas dobles; Así es como se crean valores con espacios en blanco y con otros caracteres que no se encuentran en el conjunto anterior. \n, \t, \" y \\ se usan como caracteres de escape dentro de comillas. cadenas, al igual que \x##.

El && y || los operadores están haciendo cortocircuitos; el lado derecho no se evalúa si el el resultado lógico está determinado por el lado izquierdo. Los siguientes son equivalentes:

e1 && e2
if e1 then e2 endif

El símbolo ; es un punto de secuencia; significa evaluar primero el lado izquierdo y, luego, el lado derecho. Su valor es el valor de la expresión del lado derecho. También puede aparecer un punto y coma. después de una expresión, por lo que el efecto simula sentencias de estilo C:

prepare();
do_other_thing("argument");
finish_up();

Funciones integradas

La mayor parte de la funcionalidad de actualización está incluida en las funciones disponibles para que las ejecuten secuencias de comandos. (En sentido estricto, estas son macros y no funciones en el sentido de Lisp), ya que no necesitan evaluar todos los argumentos). A menos que se indique lo contrario, las funciones devuelven true si la ejecución es exitosa y false si se produce un error. Si quieres que los errores anulen la ejecución de la secuencia de comandos, usa las funciones abort() o assert(). El conjunto de disponibles en el actualizador se pueden extender para proporcionar funcionalmente específico del dispositivo.

abort([msg])
Anula la ejecución de la secuencia de comandos de inmediato, con el msg opcional. Si el usuario tiene activó la visualización de texto, msg aparece en el registro de recuperación y en pantalla.
assert(expr[, expr, ...])
Evalúa cada expr de a una. Si alguno es falso, anula inmediatamente la ejecución con el mensaje "error de aserción" y el texto de origen de la expresión con errores.
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
Aplica un parche binario al src_file para producir el tgt_file . Si el botón el destino deseado es el mismo que el origen, pasa "-" para tgt_file . tgt_sha1 y tgt_size son el hash SHA1 final esperado y el tamaño del archivo de destino. El resto los argumentos deben presentarse en pares: un hash SHA1 (una cadena hexadecimal de 40 caracteres) y un BLOB. El BLOB es el parche que se aplicará cuando el contenido actual del archivo de origen tenga el SHA1 determinado.

La aplicación de parches se realiza de forma segura, lo que garantiza que el archivo de destino tenga el hash SHA1 y el tamaño deseados, o que no se modifique, no quedará en una intermedio. Si el proceso se interrumpe durante la aplicación de un parche, es posible que el archivo de destino en un estado intermedio; existe una copia en la partición de caché, por lo que reiniciar la actualización puede actualizar el archivo correctamente.

Se admite la sintaxis especial para tratar el contenido del dispositivo de tecnología de memoria (MTD). como archivos, lo que permite aplicar parches a particiones sin procesar, como el arranque. Cómo leer un MTD por partición, debes saber cuántos datos quieres leer, ya que la partición no tiene una noción de fin de archivo. Puedes usar la cadena “MTD:partition:size_1:sha1_1:size_2: sha1_2” como el nombre del archivo para leer la partición en cuestión. Debes especificar al menos uno (size, sha-1) par; puedes especificar más de uno si hay varios más posibilidades de lo que esperas leer.

apply_patch_check(filename, sha1[, sha1, ...])
Muestra true si el contenido de filename o la copia temporal en la partición de caché (si está presente) deben tener una suma de comprobación SHA1 igual a uno de los valores sha1 especificados. Los valores sha1 se especifican como 40 dígitos hexadecimales. Esta función difiere de sha1_check(read_file(filename), sha1 [, ...]), ya que sabe que verifica la copia de la partición en caché, por lo que apply_patch_check() se realizará correctamente incluso si la se dañó el archivo por una apply_patch() update interrumpida.
apply_patch_space(bytes)
Muestra true si al menos bytes de espacio temporal está disponible para aplicar el objeto binario parches de seguridad.
concat(expr[, expr, ...])
Evalúa cada expresión y las concatena. El operador + es el azúcar sintáctico para esto. función en el caso especial de dos argumentos (pero el formato de la función puede tomar cualquier cantidad de con expresiones regulares). Las expresiones deben ser cadenas. no puede concatenar BLOB.
file_getprop(filename, key)
Lee el filename determinado y lo interpreta como un archivo de propiedades (p.ej., /system/build.prop) y muestra el valor de la clave determinada o el string vacía si key no está presente.
format(fs_type, partition_type, location, fs_size, mount_point)
Vuelve a formatear una partición determinada. Tipos de particiones compatibles:
  • fs_type="yaffs2" y particiona_type="MTD". La ubicación debe ser el nombre del MTD partición; allí se construye un sistema de archivos yaffs2 vacío. Los argumentos restantes son sin usar.
  • fs_type="ext4" y particiona_type="EMMC". La ubicación debe ser el archivo del dispositivo para la por cada partición. Allí se construye un sistema de archivos ext4 vacío. Si fs_size es cero, el valor sistema de archivos ocupa toda la partición. Si fs_size es un número positivo, el valor sistema de archivos toma los primeros fs_size bytes de la partición. Si fs_size es una número negativo, el sistema de archivos toma todo excepto los últimos |fs_size| bytes de la por cada partición.
  • fs_type="f2fs" y particiona_type="EMMC". La ubicación debe ser el archivo del dispositivo para la por cada partición. tamaño_fs debe ser un número no negativo. Si fs_size es cero, el valor sistema de archivos ocupa toda la partición. Si fs_size es un número positivo, el valor sistema de archivos toma los primeros fs_size bytes de la partición.
  • mount_point debería ser el punto de activación futuro para el sistema de archivos.
getprop(key)
Muestra el valor de la propiedad del sistema key (o la string vacía, si no está definida). Los valores de propiedad del sistema definidos por la partición de recuperación no son necesariamente los mismos que las del sistema principal. Esta función muestra el valor en la recuperación.
greater_than_int(a, b)
Muestra true si y solo si (si) a (interpretado como un número entero) es mayor que b (se interpreta como un número entero).
ifelse(cond, e1[, e2])
Evalúa cond; si es verdadero, evalúa y muestra el valor de e1. De lo contrario, evalúa y muestra e2 (si está presente). La opción "if ... else ... entonces ... 'de' la construcción es solo azúcar sintáctica para esta función.
is_mounted(mount_point)
Muestra verdadero si hay un sistema de archivos activado en mount_point.
is_substring(needle, haystack)
Muestra verdadero si needle es una subcadena de haystack.
less_than_int(a, b)
Muestra verdadero si a (interpretado como un número entero) es menor que b (interpretado como un número entero).
mount(fs_type, partition_type, name, mount_point)
Activa un sistema de archivos de fs_type en mount_point. partition_type debe ser una de las siguientes opciones:
  • este mes, hasta la fecha. El nombre es el nombre de una partición de MTD (p.ej., sistema, userdata; consulta /proc/mtd en el dispositivo para obtener una lista completa).
  • EMMC.

La recuperación no activa ningún sistema de archivos de forma predeterminada (excepto la tarjeta SD si el usuario realizar una instalación manual de un paquete desde la tarjeta SD); tu secuencia de comandos debe activar particiones que necesita modificar.

package_extract_dir(package_dir, dest_dir)
Extrae todos los archivos del paquete que se encuentran en package_dir y los escribe en el archivo el árbol correspondiente debajo de dest_dir. Se reemplazarán todos los archivos existentes.
package_extract_file(package_file[, dest_file])
Extrae un solo package_file del paquete de actualización y lo escribe en dest_file y reemplaza los archivos existentes si es necesario. Sin el dest_file, muestra el contenido del archivo del paquete como un BLOB binario.
read_file(filename)
Lee filename y muestra su contenido como un BLOB binario.
run_program(path[, arg, ...])
Ejecuta el objeto binario en path y pasa args. Muestra el estado de salida del programa.
set_progress(frac)
Establece la posición del medidor de progreso dentro del fragmento definido por la información más reciente. Llamada de show_progress(). frac debe estar dentro del rango [0.0, 1.0]. El progreso medidor nunca se mueve hacia atrás; intentos de hacerlo se ignoran.
sha1_check(blob[, sha1])
El argumento blob es un BLOB del tipo que muestra read_file() o el formato de un argumento de package_extract_file() . Sin argumentos sha1, esta función muestra el hash SHA1 del BLOB (como una cadena hexadecimal de 40 dígitos). Con uno o más sha1, esta función muestra el hash SHA1 si es igual a uno de los argumentos, o la cadena vacía si no es igual a ninguno de ellos.
show_progress(frac, secs)
Avanza el medidor de progreso a la siguiente frac de su longitud en el secs segundos (debe ser un número entero). secs puede ser 0, en cuyo caso el medidor es no avanzado automáticamente, sino mediante la función set_progress() definida arriba.
sleep(secs)
Se suspende durante s segundos (debe ser un número entero).
stdout(expr[, expr, ...])
Evalúa cada expresión y vuelca su valor en stdout. Es útil para la depuración.
tune2fs(device[, arg, …])
Ajusta los parámetros ajustables args en device.
ui_print([text, ...])
Concatena todos los argumentos text y, luego, imprime el resultado en la IU (donde se encontrará será visible si el usuario activó la visualización de texto).
unmount(mount_point)
Desactiva el sistema de archivos activado en mount_point.
wipe_block_device(block_dev, len)
Limpia los bytes de len del dispositivo de bloques block_dev determinado.
wipe_cache()
Hace que la partición de caché se borre al final de una instalación exitosa.
write_raw_image(filename_or_blob, partition)
Escribe la imagen en filename_or_blob en la partición de MTD. filename_or_blob puede ser una cadena que nombra a un archivo local o un argumento con valor de BLOB que contiene los datos que se escribirán. Para copiar un archivo del paquete inalámbrico a una partición, usa lo siguiente: write_raw_image(package_extract_file("zip_filename"), "partition_name");

Nota: Antes de Android 4.1, solo se aceptaban nombres de archivo, por lo que Primero, tuvimos que descomprimir los datos en un archivo local temporal.