[Jogos][Slideshow]

Como fazer um updater-script

No processo de desenvolvimento de sua própria rom, você precisa fazer seu script de instalação

Aprenda como fazer um script esse post





Descrição:
O update-script é um conjunto de comandos à executar no recovery do android

Dentro da zip de uma rom, você encontrará o diretório:
META-INF\com\google\android
dentro da pasta 'android' você vai encontrar dois arquivos:

update-binary
O update-binary é o arquivo que vai converter essas informações que estão no updater-script para código de maquina, algo como um compilador.

updater-script
Updater-script contém um conjunto de informações que serão interpretadas pelo recovery

A única linguagem reconhecida pelo update-binary é a Edify, então, nesse post, vou ensinar vocês como fazer um script em Edify.

Nesses arquivos estão as informações de instalação da rom. Se o script for escrito de forma incorreta, a rom pode não instalar, ou instalar com diversos erros/bugs.

Veja abaixo cada um dos comandos com a explicação de cada função.
__________________________________________

getprop

Exemplo do comando:
assert(getprop("ro.product.device") == "ST15i" || getprop("ro.build.product") == "ST15i" ||
getprop("ro.product.device") == "ST15a" || getprop("ro.build.product") == "ST15a" ||
getprop("ro.product.device") == "smultron" || getprop("ro.build.product") == "smultron");

Essas linhas geralmente estão no topo do seu arquivo updater-script. Mas o que elas fazem?

assert(getprop("ro.product.device") == "GT-S5300" || getprop("ro.build.product") == "GT-S5300" ||
getprop("ro.product.device") == "GT-S5300B" || getprop("ro.build.product") == "GT-S5300B" ||
getprop("ro.product.device") == "GT-S5300L" || getprop("ro.build.product") == "GT-S5300L" ||
getprop("ro.product.device") == "cori" || getprop("ro.build.product") == "cori");

Elas procuram o nome do dispositivo nas propriedades do aparelho , para evitar que pessoas consigam flashear esse arquivo em outros aparelhos e brickar o celular.

E porque tantos nomes se é o mesmo aparelho?
R: Muitos aparelhos são exatamente iguais mas lançam com diferentes nomes no mundo todo, o que é o caso do Galaxy pocket, celular do exemplo acima.

Você consegue essa confirmação também por arquivo com o comando "file_getprop"


package_extract_dir & package_extract_file

O comando "package_extract_file" extrai arquivos e o "package_extract_file" extrai pastas

Exemplo do comando:
package_extract_dir("system", "/system");
package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");


run_program

Execução de programas.

Exemplo do comando:
run_program("/tmp/backuptool.sh", "backup");

*Só executa Shell Scripts


show_progress

Exemplo do comando:
show_progress(0,0);

Essa é sem dúvida a função mais inútil do recovery, kkkkkk
Ela é a velocidade da barra de carregamento da barra do recovery
Quando você instala uma rom, você tem uma barra que nem sempre funciona bem, como deveria, é justamente por causa dessa linha.

show_progress(10, 1);
Vai de 0 até 10% da barra

Eu gosto de usar esse comando:

show_progress(1.34,10);
Com ele, a barra vai progressivamente do 0 ao 100%


format & mount

Servem para formatar e montar a partição
*Juntei os dois em um pois contém a mesma estrutura

Exemplo do comando FORMAT:
format("ext4", "emmc", "system");
comando("Sistema de arquivos", "Tipo de partição", "Diretório")

Exemplo do comando MOUNT:
mount("yaffs2", "MTD", "system");
comando("Sistema de arquivos", " Tipo de partição", "Diretório")


Clique nos links para saber mais sobre os assuntos

Sistema de arquivos
Partição
Diretórios

Sistemas de arquivos/Partição listados acima
yaffs2 = Sistemas de arquivos, acompanha partição MTD
Yet Another Flash File System + Memory Technology Device
ext4 = Sistemas de arquivos, acompanha partição + EMMC
Extended filesystem 4 + Embedded MultiMediaCard

*Que fique bem claro, cada celular tem seu modo de partição, pode ser igual, como pode não ser, exemplo:

Comando Galaxy 5
mount("ext4", "EMMC", "/dev/block/stl12", "/system");

Comando Galaxy Pocket
mount("rfs", "EMMC", "/dev/block/stl9", "/system");

Comando x10 Mini Pro
mount("yaffs2", "MTD", "system", "/system");

/dev/block Eu farei um post sobre partições e criação de kernel, nele explicarei esse diretório com mais detalhes.

em resumo, o caso do dev block é o seguinte
mount("ext4", "EMMC", "/dev/block/mmcblk0p9", "/system");
mount("ext4", "EMMC", "/dev/block/mmcblk0p10", "/data");

comando("Sistema de arquivos", "Tipo de Partição" "local da partição", "Diretório")
veja que o bloco mmcblk0p9 é a partição 'system' e o bloco mmcblk0p10 é o 'data'

Se o kernel não suportar o sistema de arquivos ou a partição que você colocou, o sistema pode não rodar, ou rodar de forma estranha.


ui_print

É uma palavra ou frase que você quer que apareça na instalação.
Eu usava essa no final do script

Exemplo do comando:
ui_print("-> Instalacao Completa!");
ui_print(" ");
ui_print("Use o Factory Reset,");
ui_print("para mais perfomance do sistema.");
ui_print("Obrigado por Escolher a Digdin Rom");

ui_print(" "); É um espaço vazio na tela. Usado para pular linha.


symlink

Exemplo do comando:
symlink("toolbox", "/system/bin/nome_do_arquivo");
symlink("busybox", "/system/xbin/nome_do_arquivo");

Como em qualquer sistema operacional baseado em Unix/Linux, o Android usa links simbólicos (symlinks). Uma ligação simbólica é um tipo especial de arquivo que contém uma referência a outro arquivo ou diretório sob a forma de um caminho absoluto ou relativo, o que afeta a resolução caminho. No Android, eles são usados principalmente na /bin e pasta /xbin, onde todos os binários de execução estão. No Android, os links são feitos da busybox (xbin) ou da toolbox (bin)



delete & delete_recursive

O comando "delete" apaga arquivos e o delete_recursive deleta pastas

Exemplos do comandos:
delete("/system/build.prop"));
delete_recursive("/system");


set_perm & set_perm_recursive

O comando "set_perm" muda a permissão de arquivos e o set_perm_recursive muda a permissão de pastas

Exemplos do comandos:
set_perm(0, 0, 06755, "/system/xbin/su");
set_perm_recursive(0, 2000, 0755, 0750, "/system/etc/init.d");

set_perm_recursive(UID, GID, dirmode, filemode, dirx)
UID = user id
GID = group id
dirmode = Permissão para definir a diretórios contidos no diretório especificado
filemode = permissão para definir a arquivos contidos no diretório especificado
dirX = diretório para definir a permissão

*Permissão de arquivos/pastas não tem nenhuma conexão com permissão de aplicativos, caso queira saber mais sobre, clique aqui


unmount

Desmonta a partição.

Exemplos do comandos:
Exemplos do comandos:
unmount("/system");


*Depois que tudo foi instalado, é recomendável que você desmonte a partição.


write_raw_image/img

Exemplos do comandos:
package_extract_file("boot.img", "/tmp/boot.img")
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));

Embora o comando package_extract_file esteja lá em cima, resolvi repostar com o aviso.

*IMGs geralmente são ligados ao kernel ou recovery, se você flashear de forma incorreta, você pode brickar seu celular PARA SEMPRE, sem chance de retorno.

Já peguei um Galaxy 5 nessas condições. Um amigo tentou colocar o sistema do Galaxy S3 nele. a rom não veio com o getprop, então ela instalou direto, o kernel foi substituído, junto com o bootloader, recovery e sistema. Depois de flasheado, o sistema não ligava de forma nenhuma, devido à incompatibilidade com tudo. Não dava para instalar com o ODIN, pois o odin não reconhecia mais o celular como Galaxy 5.


Exemplo de updater-script

Atenção: foram retiradas várias bins e xbins para caber no post NÃO COPIE ESSE SCRIPT, é só para EXEMPLO


ui_print(" ");
ui_print("Iniciando Instalacao...");
show_progress(1, 50);
ui_print("-> Limpando system, cache e dalvik");
format("yaffs2", "MTD", "system");
mount("yaffs2", "MTD", "system", "/system");
format("yaffs2", "MTD", "cache");
mount("yaffs2", "MTD", "userdata", "/data");
delete_recursive("/data/dalvik-cache");
ui_print("Terminado...");
ui_print("-> Copiando Arquivos...");
ui_print("/system");
package_extract_dir("system", "/system");
ui_print("Terminado...");
ui_print("-> Adicionando Toolbox...");
symlink("toolbox", "/system/bin/dd");
symlink("toolbox", "/system/bin/hd");
symlink("toolbox", "/system/bin/id");
symlink("toolbox", "/system/bin/ps");
symlink("toolbox", "/system/bin/cat");
symlink("toolbox", "/system/bin/cmp");
symlink("toolbox", "/system/bin/log");
symlink("toolbox", "/system/bin/smd");
symlink("toolbox", "/system/bin/top");
symlink("toolbox", "/system/bin/nandread");
symlink("toolbox", "/system/bin/date");
symlink("toolbox", "/system/bin/kill");
symlink("toolbox", "/system/bin/stop");
symlink("toolbox", "/system/bin/sync");
symlink("toolbox", "/system/bin/wipe");
symlink("toolbox", "/system/bin/dmesg");
symlink("toolbox", "/system/bin/setconsole");
symlink("toolbox", "/system/bin/iftop");
symlink("toolbox", "/system/bin/ioctl");
symlink("toolbox", "/system/bin/lsmod");
symlink("toolbox", "/system/bin/rmdir");
symlink("toolbox", "/system/bin/rmmod");
symlink("toolbox", "/system/bin/route");
symlink("toolbox", "/system/bin/sleep");
symlink("toolbox", "/system/bin/start");
symlink("toolbox", "/system/bin/setprop");
symlink("toolbox", "/system/bin/schedtop");
symlink("toolbox", "/system/bin/sendevent");
symlink("toolbox", "/system/bin/getevent");
symlink("toolbox", "/system/bin/getprop");
symlink("toolbox", "/system/bin/netstat");
symlink("toolbox", "/system/bin/insmod");
symlink("toolbox", "/system/bin/ionice");
symlink("toolbox", "/system/bin/notify");
symlink("toolbox", "/system/bin/ifconfig");
symlink("toolbox", "/system/bin/reboot");
symlink("toolbox", "/system/bin/renice");
symlink("toolbox", "/system/bin/uptime");
ui_print("-> Adicionando Busybox...");
symlink("busybox", "/system/xbin/[");
symlink("busybox", "/system/xbin/[[");
symlink("busybox", "/system/xbin/dc");
symlink("busybox", "/system/xbin/dd");
symlink("busybox", "/system/xbin/cp");
symlink("busybox", "/system/xbin/df");
symlink("busybox", "/system/xbin/ed");
symlink("busybox", "/system/xbin/du");
symlink("busybox", "/system/xbin/id");
symlink("busybox", "/system/xbin/ip");
symlink("busybox", "/system/xbin/ln");
symlink("busybox", "/system/xbin/ls");
symlink("busybox", "/system/xbin/mv");
symlink("busybox", "/system/xbin/od");
symlink("busybox", "/system/xbin/ps");
symlink("busybox", "/system/xbin/rm");
symlink("busybox", "/system/xbin/tr");
symlink("busybox", "/system/xbin/vi");
symlink("busybox", "/system/xbin/wc");
symlink("busybox", "/system/xbin/arp");
symlink("busybox", "/system/xbin/ash");
symlink("busybox", "/system/xbin/awk");
symlink("busybox", "/system/xbin/cal");
symlink("busybox", "/system/xbin/cat");
symlink("busybox", "/system/xbin/cmp");
symlink("busybox", "/system/xbin/cut");
symlink("busybox", "/system/xbin/chmod");
symlink("busybox", "/system/xbin/env");
symlink("busybox", "/system/xbin/pwd");
symlink("busybox", "/system/xbin/sed");
symlink("busybox", "/system/xbin/seq");
symlink("busybox", "/system/xbin/tac");
symlink("busybox", "/system/xbin/tar");
symlink("busybox", "/system/xbin/tee");
symlink("busybox", "/system/xbin/top");
symlink("busybox", "/system/xbin/tty");
symlink("busybox", "/system/xbin/yes");
ui_print("Terminado...");
ui_print("-> Consertando Permissoes...");
set_perm_recursive(0, 0, 0755, 0644, "/system/app");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 3003, 02750, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
set_perm(0, 2000, 06750, "/system/bin/run-as");
set_perm_recursive(0, 0, 0755, 0644, "/system/etc");
set_perm(0, 0, 0755, "/system/etc/bluetooth");
set_perm(0, 0, 0755, "/system/etc/init.d");
set_perm(0, 0, 02755, "/system/bin/wlservice");
set_perm_recursive(1002, 1002, 0755, 0444, "/system/etc/bluetooth");
set_perm_recursive(0, 2000, 0755, 0750, "/system/etc/init.d");
set_perm_recursive(1000, 1000, 0755, 0644, "/system/sd");
set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
set_perm_recursive(0, 0, 0755, 0644, "/system/fonts");
set_perm_recursive(0, 0, 0755, 0644, "/system/framework");
set_perm_recursive(0, 0, 0755, 0644, "/system/lib");
set_perm_recursive(0, 0, 0755, 0644, "/system/media");
set_perm_recursive(0, 0, 0755, 0644, "/system/usr");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm_recursive(0, 2000, 0755, 0755, "/system/etc/init.d");
set_perm(0, 0, 04755, "/system/xbin/bash");
set_perm(0, 0, 04755, "/system/xbin/nano");
set_perm(0, 0, 06755, "/system/xbin/su");
ui_print("Terminado...");
ui_print("-> Rooteando e criando superuser...");
symlink("/system/xbin/su", "/system/bin/su");
unmount("/data");
unmount("/system");
ui_print("-> Instalacao Completa!");
ui_print("Use o Factory Reset,");
ui_print("para mais perfomance do sistema.");
ui_print("Obrigado por Escolher a Digdin Rom");



Dicas
1) Para escrever o script, você vai precisar de outro programa que não seja o bloco de notas ou word.

*Um updater-script feito no bloco de notas não vai funcionar. Use Notepad++ 

Caso queira saber o porque, leia o artigo "Nunca use o bloco de notas"

2) Não esqueça de colocar ponto e virgula (;) no final cada ação do seu script

3) Deixe a ultima linha do script em branco (ou seja, pule uma linha)

Para finalizar
Essa é a base para programar um updater-script bom e funcional. Farei mais posts explicando como programar para o AROMA e como fazer comandos mais complexos para sua rom/sistema. Fique atento!




Nenhum comentário:

Todos os comentários são monitorados. Comentários ofensivos serão removidos e os respectivos usuários banidos.