Introdução

Os blobs proprietários podem ser extraídos de um dispositivo que já esteja executando o /e/OS ou de um zip instalável do /e/OS. Neste guia, descreveremos as etapas necessárias para extrair arquivos proprietários de zips instaláveis.

Antes de começar, é necessário conhecer a diferença entre os tipos de OTAs:

  • OTA baseado em blocos: o conteúdo da partição do sistema é armazenado dentro de um arquivo .dat/.dat.br como dados binários.

  • OTA baseado em arquivo: o conteúdo da partição do sistema está disponível dentro de uma pasta do zip chamada system.

  • OTA baseado em carga útil: o conteúdo da partição do sistema é armazenado como um arquivo .img dentro de payload.bin.

Se o seu zip não tiver uma pasta system ou estiver quase vazio e existir um arquivo chamado system.transfer.list no nível raiz, então o que você tem é um OTA baseado em blocos. Nesse caso, vá para Extraindo blobs proprietários de OTAs baseados em blocos.

Se você tiver todo o conteúdo da partição do sistema dentro da pasta system e não tiver o arquivo system.transfer.list, então o que você tem é um OTA baseado em arquivo. Consulte Extraindo blobs proprietários de OTAs baseados em arquivo.

Você também pode ter um OTA baseado em carga útil, que é o que seu dispositivo usará se ele usar o sistema de particionamento A/B. Se for esse o seu caso, vá para Extraindo blobs proprietários de OTAs baseados em carga útil.

Extraindo blobs proprietários de OTAs baseadas em blocos

Algumas OTAs baseadas em blocos são divididas em vários arquivos, para a partição do sistema e outras partições, como fornecedor, produto, OEM, ODM e outras. Você pode verificar se a sua está dividida procurando os arquivos *.transfer.list correspondentes para cada uma na raiz do zip instalável do /e/OS.

Se você tiver um arquivo OTA dividido em blocos, será necessário extrair, descompactar e converter cada um deles de maneira semelhante ao sistema e ao fornecedor, conforme descrito abaixo.

Se você não tiver um arquivo OTA dividido, pode pular qualquer etapa que faça referência a vendor.transfer.list e vendor.new.dat.br ou vendor.new.dat.

Crie um diretório temporário e mova-se para ele:

mkdir ~/android/system_dump/
cd ~/android/system_dump/

Extraia system.transfer.list e system.new.dat.br ou system.new.dat do zip instalável /e/OS:

unzip path/to/e-*.zip system.transfer.list system.new.dat*

onde path/to/ é o caminho para o zip instalável.

Se a sua OTA incluir vendor.transfer.list e vendor.new.dat.br ou vendor.new.dat (entre outros), extraia-os também do arquivo ZIP instalável do /e/OS:

unzip caminho/para/e-*.zip vendor.transfer.list vendor.new.dat*

onde caminho/para/ é o caminho para o arquivo ZIP instalável.

Caso existam os arquivos system.new.dat.br / vendor.new.dat.br / etc. (um arquivo brotli), você precisará primeiro descompactá-los usando o utilitário brotli:

sudo apt-get install brotli
brotli --decompress --output=system.new.dat system.new.dat.br

E se você tiver um arquivo vendor.dat.new.br (ou outros):

brotli --decompress --output=vendor.new.dat vendor.new.dat.br

Agora você precisa obter uma cópia do sdat2img. Esse script permite converter o conteúdo de OTAs baseadas em blocos em dumps que podem ser montados. O sdat2img está disponível no seguinte repositório Git, que você pode clonar usando:

git clone https://github.com/xpirt/sdat2img

Depois de obter o sdat2img, use-o para extrair a imagem do sistema:

python sdat2img/sdat2img.py system.transfer.list system.new.dat system.img

E se você tiver um arquivo vendor.dat.new (ou outros):

python sdat2img/sdat2img.py vendor.transfer.list vendor.new.dat vendor.img

Agora você deve ter um arquivo chamado system.img que pode ser montado da seguinte maneira:

mkdir system/
sudo mount system.img system/

Se você também tiver um arquivo chamado vendor.img, poderá montá-lo da seguinte maneira:

sudo rm system/vendor
sudo mkdir system/vendor
sudo mount vendor.img system/vendor/

Você também deve montar agora quaisquer outros arquivos de imagem que você tenha em seus respectivos diretórios.

Depois de montar a(s) imagem(ns), vá para o diretório raiz das fontes do seu dispositivo e execute extract-files.sh da seguinte maneira:

./extract-files.sh ~/android/system_dump/

Isso fará com que o extract-files.sh obtenha os arquivos a partir do dump do sistema montado, em vez de um dispositivo conectado.

Depois de extrair todos os arquivos proprietários, desmonte o dump do fornecedor, caso você o tenha montado anteriormente:

sudo umount ~/android/system_dump/system/vendor

Em seguida, desmonte o dump do sistema:

sudo umount ~/android/system_dump/system

Por fim, desmonte todas as outras imagens antes de excluir os arquivos que não são mais necessários:

rm -rf ~/android/system_dump/

Extraindo blobs proprietários de OTAs baseadas em arquivos

Crie um diretório temporário para extrair o conteúdo do zip e mova para lá:

mkdir ~/android/system_dump/
cd ~/android/system_dump/

Extraia a pasta system do arquivo ZIP:

unzip caminho/para/e-*.zip system/*

onde caminho/para/ é o caminho para o arquivo ZIP instalável.

Depois de extrair a pasta system, vá para o diretório raiz das fontes do seu dispositivo e execute o arquivo extract-files.sh da seguinte maneira:

./extract-files.sh ~/android/system_dump/

Isso fará com que o extract-files.sh obtenha os arquivos a partir do dump do sistema extraído, em vez de um dispositivo conectado.

Depois de extrair todos os arquivos proprietários, você pode excluir os arquivos que foram extraídos do arquivo ZIP:

rm -rf ~/android/system_dump/

Extração de blobs proprietários de atualizações OTA baseadas em payload

Crie um diretório temporário para extrair o conteúdo do zip e mova para lá:

mkdir ~/android/system_dump/
cd ~/android/system_dump/

Extraia o arquivo payload.bin do arquivo ZIP de instalação do /e/OS:

unzip /caminho/para/e-*.zip payload.bin

onde /caminho/para/ é o caminho para o arquivo ZIP instalável.

Agora você precisará usar uma ferramenta chamada update-payload-extractor.

Para usar a ferramenta, você precisará do python-protobuf, caso ainda não o tenha:

sudo apt-get install python-protobuf

Agora você pode extrair os arquivos .img da payload:

  • Se você já tiver feito o check-out de uma árvore de compilação do /e/OS, basta executar o script para extrair o conteúdo:
    python /caminho/para/e-tree/e/scripts/update-payload-extractor/extract.py payload.bin --output_dir ./
    
  • Se você não tiver uma árvore de compilação do /e/OS baixada, pode clonar nosso repositório de scripts e, em seguida, executar o script para extrair o conteúdo:
    git clone https://github.com/LineageOS/scripts
    python /caminho/para/scripts/update-payload-extractor/extract.py payload.bin --output_dir ./
    

Isso vai demorar alguns instantes. Quando terminar, precisaremos montar o arquivo system.img, bem como os arquivos vendor.img e product.img, caso existam, para obter o conjunto completo de blobs proprietários:

mkdir system/
sudo mount system.img system/
sudo mount vendor.img system/vendor/
sudo mount product.img system/product/

Vá para o diretório raiz das fontes do seu dispositivo e execute extract-files.sh da seguinte maneira:

./extract-files.sh ~/android/system_dump/

Isso fará com que o extract-files.sh extraia os blobs proprietários do dump do sistema montado, em vez de um dispositivo conectado.

Quando terminar, desmonte o dump do sistema e remova os arquivos que já não são necessários:

sudo umount -R ~/android/system_dump/system/
rm -rf ~/android/system_dump/