O sistema cria o binário do atualizador a partir bootable/recovery/updater
e o usa em um pacote OTA.
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, portantoapply_patch_check()
terá sucesso mesmo se o arquivo tiver sido corrompido por uma interrupçãoapply_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.
- MTD . Nome é o nome de uma partição MTD (por exemplo, sistema, dados do usuário; consulte
-
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 )
- Lê 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 depackage_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.