Dentro de pacotes OTA

O sistema cria o binário do atualizador a partir bootable/recovery/updater e o usa em um pacote OTA.

O pacote em si é um arquivo .zip ( ota_update.zip , incremental_ota_update.zip ) que contém o binário executável META-INF/com/google/android/update-binary .

O Updater contém várias funções integradas e um interpretador para uma linguagem de script extensível ( edify ) que suporta comandos para tarefas típicas relacionadas à atualização. O atualizador procura no arquivo .zip do pacote um script no arquivo META-INF/com/google/android/updater-script .

Nota: Usar o script edify e/ou funções integradas não é uma atividade comum, mas pode ser útil se você precisar depurar o arquivo de atualização.

Edificar sintaxe

Um script edify é uma expressão única na qual todos os valores são strings. Strings vazias são falsas em um contexto booleano e todas as outras strings são true . Edify suporta os seguintes operadores (com os significados usuais):

(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

Qualquer sequência de caracteres az, AZ, 0-9, _, :, /, . que não é uma palavra reservada é considerada uma string literal. (As palavras reservadas são if else then endif. ) Literais de string também podem aparecer entre aspas duplas; é assim que se criam valores com espaços em branco e outros caracteres que não estão no conjunto acima. \n, \t, \", e \\ servem como escapes dentro de strings entre aspas, assim como \x ## .

O && e || os operadores estão em curto-circuito; o lado direito não é avaliado se o resultado lógico for determinado pelo lado esquerdo. Os seguintes são equivalentes:

e1 && e2
if e1 then e2 endif

O ; operador é um ponto de sequência; significa avaliar primeiro o lado esquerdo e depois o lado direito. Seu valor é o valor da expressão do lado direito. Um ponto e vírgula também pode aparecer após uma expressão, portanto o efeito simula instruções no estilo C:

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

Funções integradas

A maior parte da funcionalidade de atualização está contida nas funções disponíveis para execução por scripts. (Estritamente falando, estas são macros e não funções no sentido Lisp, uma vez que não precisam avaliar todos os seus argumentos.) Salvo indicação em contrário, as funções retornam verdadeiro em caso de sucesso e falso em caso de erro. Se você quiser que erros abortem a execução do script, use as funções abort() e/ou assert() . O conjunto de funções disponíveis no atualizador também pode ser estendido para fornecer funcionalidades específicas do dispositivo .

abort([ msg ])
Aborta a execução do script imediatamente, com o opcional msg . Se o usuário tiver ativado a exibição de texto, a mensagem aparecerá no log de recuperação e na tela.
assert( expr [, expr , ...])
Avalia cada expr por vez. Se algum for falso, aborta imediatamente a execução com a mensagem "assert failed" e o texto fonte da expressão com falha.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
Aplica um patch binário ao src_file para produzir o tgt_file . Se o destino desejado for igual à origem, passe "-" para tgt_file . tgt_sha1 e tgt_size são o hash SHA1 final esperado e o tamanho do arquivo de destino. Os argumentos restantes devem vir em pares: um hash SHA1 (uma string hexadecimal de 40 caracteres) e um blob. O blob é o patch a ser aplicado quando o conteúdo atual do arquivo de origem tiver o SHA1 fornecido.

A correção é feita de maneira segura, garantindo que o arquivo de destino tenha o hash e o tamanho SHA1 desejados ou esteja intacto – ele não será deixado em um estado intermediário irrecuperável. Se o processo for interrompido durante a correção, o arquivo de destino poderá estar em um estado intermediário; existe uma cópia na partição de cache, portanto, reiniciar a atualização pode atualizar o arquivo com êxito.

A sintaxe especial é suportada para tratar o conteúdo das partições do Memory Technology Device (MTD) como arquivos, permitindo o patch de partições brutas, como boot. Para ler uma partição MTD, você deve saber quantos dados deseja ler, pois a partição não possui uma noção de fim de arquivo. Você pode usar a string "MTD: partição : tamanho_1 : sha1_1 : tamanho_2 : sha1_2 " como um nome de arquivo para ler a partição fornecida. Você deve especificar pelo menos um par (tamanho, sha-1) ; você pode especificar mais de um se houver múltiplas possibilidades para o que você espera ler.

apply_patch_check( filename , sha1 [, sha1 , ...])
Retorna verdadeiro se o conteúdo do nome do arquivo ou a cópia temporária na partição de cache (se presente) tiver uma soma de verificação SHA1 igual a um dos valores sha1 fornecidos. Os valores sha1 são especificados como 40 dígitos hexadecimais. Esta função difere de sha1_check(read_file( filename ), sha1 [, ...]) porque sabe verificar a cópia da partição de cache, portanto apply_patch_check() terá sucesso mesmo se o arquivo tiver sido corrompido por uma interrupção apply_patch() update .
apply_patch_space( bytes )
Retorna verdadeiro se pelo menos bytes de espaço de trabalho estiverem disponíveis para aplicação de patches binários.
concat( expr [, expr , ...])
Avalia cada expressão e as concatena. O operador + é um açúcar sintático para esta função no caso especial de dois argumentos (mas a forma da função pode assumir qualquer número de expressões). As expressões devem ser strings; não pode concatenar blobs.
file_getprop( filename , key )
Lê o nome do arquivo fornecido, interpreta-o como um arquivo de propriedades (por exemplo, /system/build.prop ) e retorna o valor da chave fornecida ou a string vazia se a chave não estiver presente.
format( fs_type , partition_type , location , fs_size , mount_point )
Reformata uma determinada partição. Tipos de partição suportados:
  • fs_type="yaffs2" e partição_type="MTD". Local deve ser o nome da partição MTD; um sistema de arquivos yaffs2 vazio é construído lá. Os argumentos restantes não são utilizados.
  • fs_type="ext4" e partição_type="EMMC". O local deve ser o arquivo do dispositivo da partição. Um sistema de arquivos ext4 vazio é construído lá. Se fs_size for zero, o sistema de arquivos ocupará toda a partição. Se fs_size for um número positivo, o sistema de arquivos ocupa os primeiros bytes fs_size da partição. Se fs_size for um número negativo, o sistema de arquivos leva tudo, exceto o último |fs_size| bytes da partição.
  • fs_type="f2fs" e partição_type="EMMC". O local deve ser o arquivo do dispositivo da partição. fs_size deve ser um número não negativo. Se fs_size for zero, o sistema de arquivos ocupará toda a partição. Se fs_size for um número positivo, o sistema de arquivos ocupa os primeiros bytes fs_size da partição.
  • mount_point deve ser o futuro ponto de montagem do sistema de arquivos.
getprop( key )
Retorna o valor da chave de propriedade do sistema (ou a string vazia, se não estiver definida). Os valores das propriedades do sistema definidos pela partição de recuperação não são necessariamente iguais aos do sistema principal. Esta função retorna o valor em recuperação.
greater_than_int( a , b )
Retorna verdadeiro se e somente se (iff) a (interpretado como um número inteiro) for maior que b (interpretado como um número inteiro).
ifelse( cond , e1 [, e2 ])
Avalia cond , e se for verdadeiro avalia e retorna o valor de e1 , caso contrário avalia e retorna e2 (se presente). A construção "if...else...então...endif" é apenas açúcar sintático para esta função.
is_mounted( mount_point )
Retorna verdadeiro se houver um sistema de arquivos montado em mount_point .
is_substring( needle , haystack )
Retorna verdadeiro se agulha for uma substring de haystack .
less_than_int( a , b )
Retorna verdadeiro se a (interpretado como um número inteiro) for menor que b (interpretado como um número inteiro).
mount( fs_type , partition_type , name , mount_point )
Monta um sistema de arquivos de fs_type em mount_point . tipo_de_partição deve ser um dos seguintes:
  • MTD . Nome é o nome de uma partição MTD (por exemplo, sistema, dados do usuário; consulte /proc/mtd no dispositivo para obter uma lista completa).
  • EMMC.

O Recovery não monta nenhum sistema de arquivos por padrão (exceto o cartão SD se o usuário estiver fazendo uma instalação manual de um pacote do cartão SD); seu script deve montar todas as partições que precisa modificar.

package_extract_dir( package_dir , dest_dir )
Extrai todos os arquivos do pacote abaixo de package_dir e os grava na árvore correspondente abaixo de dest_dir . Todos os arquivos existentes serão substituídos.
package_extract_file( package_file [, dest_file ])
Extrai um único package_file do pacote de atualização e grava-o em dest_file , substituindo os arquivos existentes, se necessário. Sem o argumento dest_file , retorna o conteúdo do arquivo do pacote como um blob binário.
read_file( filename )
o nome do arquivo e retorna seu conteúdo como um blob binário.
run_program( path [, arg , ...])
Executa o binário em path , passando arg s. Retorna o status de saída do programa.
set_progress( frac )
Define a posição do medidor de progresso dentro do bloco definido pela chamada show_progress() mais recente. frac deve estar no intervalo [0,0, 1,0]. O medidor de progresso nunca retrocede; tentativas de fazê-lo são ignoradas.
sha1_check( blob [, sha1 ])
O argumento blob é um blob do tipo retornado por read_file() ou a forma de um argumento de package_extract_file() . Sem argumentos sha1 , esta função retorna o hash SHA1 do blob (como uma string hexadecimal de 40 dígitos). Com um ou mais argumentos sha1 , esta função retorna o hash SHA1 se for igual a um dos argumentos, ou a string vazia se não for igual a nenhum deles.
show_progress( frac , secs )
Avança o medidor de progresso ao longo da próxima fracção do seu comprimento ao longo dos segundos segundos (deve ser um número inteiro). segundos pode ser 0, caso em que o medidor não avança automaticamente, mas pelo uso da função set_progress() definida acima.
sleep( secs )
Dorme por segundos (deve ser um número inteiro).
stdout( expr [, expr , ...])
Avalia cada expressão e transfere seu valor para stdout. Útil para depuração.
tune2fs( device [, arg , …])
Ajusta argumentos de parâmetros ajustáveis ​​no dispositivo .
ui_print([ text , ...])
Concatena todos os argumentos de texto e imprime o resultado na UI (onde ficará visível se o usuário tiver ativado a exibição de texto).
unmount( mount_point )
Desmonta o sistema de arquivos montado em mount_point .
wipe_block_device( block_dev , len )
Limpa os len bytes do dispositivo de bloco fornecido block_dev .
wipe_cache()
Faz com que a partição de cache seja apagada no final de uma instalação bem-sucedida.
write_raw_image( filename_or_blob , partition )
Grava a imagem em filename_or_blob na partição MTD. filename_or_blob pode ser uma string que nomeia um arquivo local ou um argumento com valor de blob contendo os dados a serem gravados. Para copiar um arquivo do pacote OTA para uma partição, use: write_raw_image(package_extract_file("zip_filename"), "partition_name");

Nota: Antes do Android 4.1, apenas nomes de arquivos eram aceitos; portanto, para conseguir isso, os dados primeiro precisavam ser descompactados em um arquivo local temporário.