4 en PT
4 en PT
4 en PT
com
na propriedade:ro.build.tags=test-keys
iniciar htc_ebdlogd
na propriedade:ro.build.tags=release-keys
iniciar htc_ebdlogd_rel
- Iniciando serviços ou daemons que devem ser iniciados na inicialização, por meio do
serviçodiretiva
- Especificando o usuário e o grupo em que o serviço deve ser executado, de acordo com os
argumentos recuados abaixo de cada entrada de serviço
- Definir propriedades de todo o sistema e opções de configuração que são expostas por meio
do Serviço de propriedade
O Serviço de Propriedade
definidor de propriedades
propriedade_espaço de trabalho
...
[dhcp.wlan0.dns1]: [192.168.1.1]
[dhcp.wlan0.dns2]: []
[dhcp.wlan0.dns3]: []
[dhcp.wlan0.dns4]: []
[dhcp.wlan0.gateway]: [192.168.1.1]
[dhcp.wlan0.ipaddress]: [192.168.1.125]
[dhcp.wlan0.leasetime]: [7200]
...
[ro.htc.appupdate.exmsg.url]:
[http://apu-msg.htc.com/extra-msg/rws/and-app/msg]
[ro.htc.appupdate.exmsg.url_CN]:
[http://apu-msg.htccomm.com.cn/extra-msg/rws/and-app/msg]
[ro.htc.appupdate.url]:
[http://apu-chin.htc.com/check-in/rws/and-app/update]
...
[service.brcm.bt.activation]: [0]
[service.brcm.bt.avrcp_pass_thru]: [0]
Algumas propriedades, que são definidas como “somente leitura”, não podem ser alteradas,
mesmo pelo root (embora haja algumas exceções específicas do dispositivo). Estes são designados
peloroprefixo:
[ro.seguro]: [0]
[ro.serialno]: [HT26MTV01493]
[ro.setupwizard.enterprise_mode]: [1]
[ro.setupwizard.mode]: [DISABLED]
[ro.sf.lcd_density]: [240]
[ro.telephony.default_network]: [0] [ro.use_data_netmgrd]: [true]
[ro.vendor.extension_library]: [/system/lib/libqc-opt.so]
mensagens de texto ou acessar a Internet sem Wi-Fi. Como tal, será encontrado em execução
em qualquer dispositivo Android com dados de celular ou capacidade de telefonia.
depurado
O principal recurso de relatório de falhas do Android gira em torno de um daemon chamado
depurado. Quando o daemon do depurador é inicializado, ele abre uma conexão com o recurso
de log do Android e começa a ouvir clientes em um soquete de namespace abstrato. Quando
cada programa é iniciado, o vinculador instala manipuladores de sinal para lidar com
determinados sinais.
Quando um dos sinais capturados ocorre, o kernel executa a função de manipulador de
sinal,debugger_signal_handler.Esta função de manipulador se conecta ao soquete
mencionado acima, conforme definido porDEBUGGER_SOCKET_NAME.Depois de conectado, o
vinculador notifica a outra extremidade do soquete (depurado)que o processo de destino
falhou. Isso serve para avisardepuradoque ele deve invocar seu processamento e, assim,
criar um relatório de falha.
ADB
A ponte de depuração do Android, ouADB, é composto por algumas peças, incluindo o
adbddaemon no dispositivo Android, oadbservidor na estação de trabalho host e o
correspondenteadbcliente de linha de comando. O servidor gerencia a conectividade entre
o cliente e o daemon executado no dispositivo alvo, facilitando tarefas como executar um
shell; aplicativos de depuração (através do Java Debug Wire Protocol); encaminhamento de
soquetes e portas; transferência de arquivo; e instalar/desinstalar pacotes de aplicativos.
Como um breve exemplo, você pode executar odispositivos adbcomando para listar seus
dispositivos conectados. Como o ADB ainda não está rodando em nosso host, ele é inicializado,
escutando em 5037/tcp para conexões de clientes. Em seguida, você pode especificar um
dispositivo de destino por seu número de série e executarshell adb,dando-lhe um shell de
comando no dispositivo:
% dispositivos adb
* não corra, Daemon. iniciando agora na porta 5037 *
* daemon iniciado com sucesso * Lista de
dispositivos conectados
D025A0A024441MGK dispositivo
HT26MTV01493 dispositivo
O ADB é fundamental para o desenvolvimento com dispositivos e emuladores Android. Como tal,
vamos usá-lo fortemente ao longo do livro. Você pode encontrar informações detalhadas
ção sobre o uso doadbcomando emhttp://developer.android.com/tools/help/
adb.html.
Volume Daemon
O Volume Daemon, ouvold, é responsável por montar e desmontar vários
sistemas de arquivos no Android. Por exemplo, quando um cartão SD é inserido,
voldprocessa esse evento verificando se há erros no sistema de arquivos do cartão SD
(como ao iniciarfsck)e montando o cartão no caminho apropriado (ou seja, /mnt/
sdcard).Quando o cartão é puxado ou ejetado (manualmente pelo usuário)
volddesmonta o volume de destino.
O Volume Daemon também lida com a montagem e desmontagem de arquivos do Android Secure
Container (ASEC). Eles são usados para criptografar pacotes de aplicativos quando armazenados em
sistemas de arquivos inseguros, como FAT. Eles são montados por meio de dispositivos de loopback no
tempo de carregamento do aplicativo, normalmente em /mnt/asseg.
Opaque Binary Blobs (OBBs) também são montados e desmontados pelo Volume Daemon.
Esses arquivos são empacotados com um aplicativo para armazenar dados criptografados com
um segredo compartilhado. Ao contrário dos contêineres ASEC, no entanto, as chamadas para
montar e desmontar OBBs são realizadas pelos próprios aplicativos, e não pelo sistema. O
trecho de código a seguir demonstra a criação de um OBB com
SuperSecretKeycomo a chave compartilhada:
obbFile = "caminho/para/algum/obbfile";
storageRef = (StorageManager) getSystemService(STORAGE_SERVICE);
storageRef.mountObb(obbFile, "SuperSecretKey", obbListener); obbContent =
storageRef.getMountedObbPath(obbFile);
Dado que o Volume Daemon é executado como root, ele é um alvo atraente tanto em sua
funcionalidade quanto em sua potencial vulnerabilidade. Você pode encontrar detalhes sobre ataques
de escalonamento de privilégios contravolde outros serviços semelhantes no Capítulo 3.
Outros serviços
Existem vários outros serviços que são executados em muitos dispositivos Android,
fornecendo funcionalidades adicionais, embora não necessariamente críticas
(dependendo do dispositivo e do serviço). A Tabela 2-2 destaca alguns desses serviços,
suas finalidades e seus níveis de privilégio no sistema (UID, GID e quaisquer grupos
suplementares para esse usuário, que podem ser especificados noinit.rcarquivos).
48 Capítulo 2-Design e arquitetura de segurança do Android
ID, GID,
SUPLEMENTAR
SERVIÇO DESCRIÇÃO GRUPOS
líquido Presente no Android 2.2+, usado pelo Network UID: 0 / raiz
Management Service para configurar interfaces de
GID: 0 / raiz
rede, executar o daemon PPP (pppd), tethering e
outras tarefas semelhantes.
servidor de mídia Responsável por iniciar serviços relacionados à UID: 1013 / mídia
mídia, incluindo Audio Flinger, Media Player
GID: 1005 / áudio
Service, Camera Service e Audio Policy Service.
Grupos: 1006 /
Câmera
1026 / drmpc
3001 / net_bt_admin
3002 / net_bt
3003 / inet
3007 / net_bw_acct
dbus- Gerencia o IPC/passagem de mensagens específico do D-Bus UID: 1002/bluetooth
demônio (principalmente para componentes não específicos do Android).
GID: 1002 / bluetooth
Grupos: 3001 /
net_bt_admin
instalado Gerencia a instalação de pacotes de aplicativos nos UID: 1012 / instalar
dispositivos (em nome do Package Manager),
GID: 1012 / instalar
incluindo a otimização inicial do bytecode Dalvik
Executable (DEX) em pacotes de aplicativos (APKs). Em dispositivos pré-4.2:
UID: 0 /raiz
GID: 0 /raiz
armazenamento de chaves Responsável pelo armazenamento seguro de pares chave- UID: 1017 / armazenamento de chaves
ID, GID,
SUPLEMENTAR
SERVIÇO DESCRIÇÃO GRUPOS
militar- Atua como árbitro para registro/cancelamento de registro de UID: 1000 / sistema
velho serviços de aplicativos com terminais IPC do Binder.
GID: 1000 / sistema
Ueventd Presente no Android 2.2+, daemon de espaço do usuário para UID: 0 / raiz
manipular eventos de sistema e dispositivo e realizar ações
GID: 0 /raiz
correspondentes, como carregar módulos de kernel
apropriados.
Como dito anteriormente, esta não é de forma alguma uma lista exaustiva. Comparando a lista de
processos,init.rc,e sistema de arquivos de vários dispositivos ao de um dispositivo Nexus, muitas vezes
revela uma infinidade de serviços fora do padrão. Eles são particularmente interessantes porque seu
código pode não ter a mesma qualidade dos serviços principais presentes em todos os dispositivos
Android.
O Kernel
Embora a base do Android, o kernel Linux, seja bastante bem documentada e
compreendida, existem algumas diferenças notáveis entre o kernel Linux vanilla e o
que é usado pelo Android. Esta seção explica algumas dessas mudanças,
especialmente aquelas que são pertinentes à segurança do Android.
A bifurcação do Android
No início, o Google criou um fork centrado no Android do kernel Linux, pois muitas
modificações e adições não eram compatíveis com a árvore principal do kernel Linux. No
geral, isso inclui aproximadamente 250 patches, desde suporte ao sistema de arquivos e
ajustes de rede até recursos de gerenciamento de processo e memória. De acordo com
um engenheiro do kernel, a maioria desses patches “representa uma limitação que os
desenvolvedores do Android encontraram no kernel do Linux”. Em março de 2012, os
mantenedores do kernel do Linux mesclaram as modificações do kernel específicas do
Android na árvore principal. A Tabela 2-3 destaca algumas das adições/alterações no
kernel da linha principal. Discutiremos vários deles com mais detalhes posteriormente
nesta seção.
50 Capítulo 2-Design e arquitetura de segurança do Android
pmem Alocador de Memória de Processo; usado para gerenciar grandes regiões contíguas
de memória compartilhada
RAM_CONSOLE Armazena mensagens de log do kernel na RAM para visualização após um kernel panic
modificações "oom" O assassino “Sem memória” mata os processos quando a memória fica baixa; no
fork do Android, o OOM mata os processos mais cedo que o kernel vanilla, pois a
memória está sendo esgotada
wakelocks Recurso de gerenciamento de energia para evitar que um dispositivo entre no estado
de baixo consumo de energia e permaneça responsivo
saída temporizada / gpio Permite que programas de espaço do usuário alterem e restaurem registros GPIO após
um período de tempo
Encadernador
Talvez uma das adições mais importantes ao kernel Linux do Android tenha sido um driver conhecido
comoEncadernador. O Binder é um mecanismo IPC baseado em uma versão modificada do
OpenBinder, originalmente desenvolvido pela Be, Inc., e posteriormente pela Palm, Inc. O Binder do
Android é relativamente pequeno (aproximadamente 4.000 linhas de código-fonte em dois arquivos),
mas é fundamental Funcionalidade do Android.
Em poucas palavras, o driver do kernel do Binder facilita a arquitetura geral do Binder.
O Binder – como uma arquitetura – opera em um modelo cliente-servidor. Ele permite que
um processo invoque métodos em processos “remotos” de forma síncrona. A arquitetura
do Binder abstrai os detalhes subjacentes, fazendo com que essas chamadas de método
pareçam ser chamadas de funções locais. A Figura 2-3 mostra o fluxo de comunicação do
Binder.
Capítulo 2-Design e arquitetura de segurança do Android 51
O Binder também usa informações de ID de processo (PID) e UID como meio de identificar o
processo de chamada, permitindo que o chamador tome decisões sobre o controle de acesso.
Isso normalmente ocorre por meio de chamadas para métodos comoEncadernador
. getCallingUideBinder.getCallingPid,ou através de verificações de nível superior,
comocheckCallingPermission.
Um exemplo disso na prática seria aACCESS_SURFACE_FLINGERpermissão. Essa
permissão geralmente é concedida apenas aográficosusuário do sistema e permite o
acesso à interface IPC do Binder do serviço de gráficos Surface Flinger. Além disso, a
associação ao grupo do chamador - e o subsequente porte da permissão necessária -
é verificada por meio de uma série de chamadas para as funções mencionadas
acima, conforme ilustrado pelo seguinte trecho de código:
Em um nível mais alto, os métodos IPC expostos, como os fornecidos por serviços vinculados,
normalmente são destilados em uma interface abstrata por meio da linguagem de definição de
interface Android (AIDL). AIDL permite que dois aplicativos usem interfaces “acordadas” ou
padrão para enviar e receber dados, mantendo a interface separada da implementação. AIDL é
semelhante a outros arquivos de linguagem de definição de interface ou, de certa forma,
arquivos de cabeçalho C/C++. Considere o seguinte snippet AIDL de amostra:
52 Capítulo 2-Design e arquitetura de segurança do Android
// IRemoteService.aidl
pacote com.example.android;
/** Demonstra alguns tipos básicos que você pode usar como parâmetros
* e retorna valores em AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean,
flutuar aFlotar,
double aDouble, String aString);
}
ashmem
Memória compartilhada anônima, ouashmempara resumir, foi outra adição ao fork do kernel
Android Linux. O driver ashmem basicamente fornece uma interface de memória compartilhada
baseada em arquivo e contada por referência. Seu uso é predominante em muitos dos
principais componentes do Android, como Surface Flinger, Audio Flinger, System Server e
DalvikVM. Como o ashmem foi projetado para reduzir automaticamente os caches de memória
e recuperar regiões de memória quando a memória disponível em todo o sistema estiver baixa,
ele é adequado para ambientes com pouca memória.
Em um nível baixo, usar ashmem é tão simples quanto chamarashmem_create_region, e
usandommapno descritor de arquivo retornado:
pmem
Outro driver personalizado específico do Android épmem, que gerencia memória grande
e fisicamente contígua variando entre 1 megabyte (MB) e 16 MB (ou mais, dependendo da
implementação). Essas regiões são especiais, pois são compartilhadas entre processos de
espaço do usuário e outros drivers de kernel (como drivers de GPU). Ao contrário do
ashmem, o driver pmem requer que o processo de alocação mantenha um descritor de
arquivo para o heap de memória pmem até que todas as outras referências sejam
fechadas.
Registrador
Alvo
programa Java
System.out
/System.err
com.android.internal.os
Programa nativo android.util.Log Hospedeiro
Android Printstream
ADT no Eclipse
padrão
logcat
padrão liblog
/stderr adbd adbserver
Do utilizador
a Principal64 KB rádio
registrador 64 KB
/dev/log/main /dev/log/main
/dev/log/radio evento sistema /dev/log/radio
256 KB
/dev/log/evento 64 KB /dev/log/evento
/dev/log/sistema /dev/log/sistema
$ adb -d logcat
- - - - - - - - - início de /dev/log/system D/MobileDataStateTracker( 1600): null: Transmissão
recebida: ACTION_ANY_DATA_CONNECTION_STATE_CHANGEDmApnType=null != recebido
apnType=internet
Rede paranóica
O kernel do Android restringe as operações de rede com base na associação de grupo
suplementar do processo de chamada - uma modificação do kernel conhecida comoRede
paranóica. Em um nível alto, isso envolve o mapeamento de um AID e, posteriormente,
um GID, para uma declaração ou solicitação de permissão no nível do aplicativo. Por
exemplo, a permissão de manifestoandroid.permission.INTERNETefetivamente mapeia para o
AID_INETAID—ou GID 3003. Esses grupos, IDs e seus respectivos recursos são
definidos eminclude/linux/android_aid.hna árvore de origem do kernel e são
descritos na Tabela 2-4.
Você pode encontrar IDs de grupo adicionais específicos do Android na fonte AOSP
repositório emsystem/core/include/private/android_filesystem_config.h.
Depois de examinar mais de perto o design e a arquitetura do Android, fica claro que os
desenvolvedores do sistema operacional Android criaram um sistema muito complexo. Seu
design permite que eles sigam o princípio de privilégio mínimo, que afirma que qualquer
componente em particular deve ter acesso apenas às coisas que ele absolutamente requer. Ao
longo deste livro, você verá evidências substanciais do uso desse princípio. Embora sirva para
melhorar a segurança, também aumenta a complexidade.
56 Capítulo 2-Design e arquitetura de segurança do Android
Resumo
CH 3
57
58 Capítulo 3-Enraizando seu dispositivo
AVISO Fazer root no seu dispositivo, se você não sabe o que está fazendo, pode
fazer com que seu telefone pare de funcionar corretamente. Isso é especialmente verdadeiro se você modificar
qualquer arquivo do sistema. Felizmente, a maioria dos dispositivos Android pode retornar ao estado original de
fábrica, se necessário.
31 0 1024 mtdblock0
179 0 15388672 mmcblk0
179 1 128 mmcblk0p1
179 2 3584 mmcblk0p2
179 3 20480 mmcblk0p3
179 4 8192 mmcblk0p4
179 5 4096 mmcblk0p5
179 6 4096 mmcblk0p6
179 7 8192 mmcblk0p7
259 0 12224 mmcblk0p8
259 1 16384 mmcblk0p9
259 2 669696 mmcblk0p10
259 3 442368 mmcblk0p11
259 4 14198767 mmcblk0p12
259 5 64 mmcblk0p13
179 16 512 mmcblk0boot1
179 8 512 mmcblk0boot0
raiz lrwxrwxrwx raiz 2013-01-30 20:43 rádio -> /dev/block/mmcblk0p9 2013-01-30 20:43
raiz lrwxrwxrwx raiz recovery -> /dev/block/mmcblk0p8 2013-01-30 20:43 sbl -> /dev/
raiz lrwxrwxrwx raiz block/ mmcblk0p2 2013-01-30 20:43 system -> /dev/block/
raiz lrwxrwxrwx raiz mmcblk0p10 2013-01-30 20:43 userdata -> /dev/block/mmcblk0p12
raiz lrwxrwxrwx raiz 2013-01-30 20:43 xloader -> /dev/block /mmcblk0p1
raiz lrwxrwxrwx raiz
Além disso, existem outros lugares onde você pode obter informações sobre o
layout da partição. O /etc/vold.fstabarquivo, o log de recuperação (/cache/recuperação/
last_log),e os logs do kernel (viadmesgou /proc/kmsg)são conhecidos por conter
informações de layout de partição em alguns casos. Se tudo mais falhar, você pode
encontrar algumas informações sobre partições usando omontarcomando ou exame
ing /proc/montagens.
grupo rádio cache inet misc áudio sdcard_rw qcom_oncrpc diag [...]
NOTAFastboot é o protocolo padrão do Android para flashear imagens de disco completo para
partições específicas via USB. O utilitário cliente fastboot é uma ferramenta de linha de
comando que você pode obter no Android Software Development Kit (SDK) disponível emhttps://
developer.android.com/sdk/ou o repositório AOSP.
o dispositivo s Ônibus
(USB). Figu
De um modo geral, os carregadores de inicialização bloqueados impedem que o usuário final execute
modificações no firmware do dispositivo implementando restrições no nível do carregador de
inicialização. Essas restrições podem variar, dependendo da decisão do fabricante, mas geralmente há
uma verificação de assinatura criptográfica que impede a inicialização e/ou a exibição de código não
assinado no dispositivo. Alguns dispositivos, como dispositivos Android chineses baratos, não incluem
nenhuma restrição de carregador de inicialização.
Nos dispositivos Google Nexus, o carregador de inicialização é bloqueado por padrão. No entanto,
existe um mecanismo oficial que permite que os proprietários o desbloqueiem. Se o usuário final
decidir executar um kernel personalizado, imagem de recuperação ou sistema operacional
Capítulo 3-Enraizando seu dispositivo 63
imagem, o carregador de inicialização precisa ser desbloqueado primeiro. Para esses dispositivos,
desbloquear o carregador de inicialização é tão simples quanto colocar o dispositivo no modo fastboot
e executar o comandodesbloqueio oem fastboot. Isso requer o utilitário cliente fastboot de linha de
comando, que está disponível no Android SDK ou no repositório AOSP.
Alguns fabricantes também oferecem suporte ao desbloqueio dos carregadores de inicialização em
seus dispositivos, por dispositivo. Em alguns casos, o processo usa o procedimento de desbloqueio
padrão do fabricante de equipamento original (OEM) por meio do fastboot. No entanto, alguns casos
giram em torno de algum mecanismo proprietário, como um site ou desbloquear portal. Esses portais
geralmente exigem que o proprietário registre seu dispositivo e perca sua garantia para poder
desbloquear seu carregador de inicialização. Até o momento, HTC, Motorola e Sony suportam o
desbloqueio de pelo menos alguns de seus dispositivos.
Desbloquear o carregador de inicialização traz sérias implicações de segurança. Se o dispositivo for
perdido ou roubado, todos os dados nele contidos poderão ser recuperados por um invasor simplesmente
carregando uma imagem de inicialização personalizada do Android ou exibindo uma imagem de recuperação
personalizada. Após fazer isso, o invasor tem acesso total aos dados contidos nas partições do dispositivo.
Isso inclui contas do Google, documentos, contatos, senhas armazenadas, dados de aplicativos, fotos da
câmera e muito mais. Por causa disso, uma redefinição de dados de fábrica é realizada no telefone ao
desbloquear um carregador de inicialização bloqueado. Isso garante que todos os dados do usuário final
sejam apagados e que o invasor não possa acessá-los.
todos os dados foram apagados, é possível recuperar de forma forense os dados apagados em alguns
dispositivos.
$descompacte 625f5f7c6524.signed-occam-JOP40D-from-JOP40C.625f5f7c.zip
Arquivo: 625f5f7c6524.signed-occam-JOP40D-from-JOP40C.625f5f7c.zip SignApk
assinado por
inflando: META-INF/com/android/metadata inflando: META-INF/com/google/
android/update-binary inflando: META-INF/com/google/android/updater-script
inflando: patch/system/app/ApplicationsProvider .apk.p inflando: patch/system/
app/ApplicationsProvider.odex.p inflando: patch/system/app/
BackupRestoreConfirmation.apk.p inflando: patch/system/app/
BackupRestoreConfirmation.odex.p [...]
inflando: patch/system/lib/libwebcore.so.p
inflando: patch/system/lib/libwebrtc_audio_preprocessing.so.p inflando: recovery/
etc/install-recovery.sh
inflando: recovery/recovery-from-boot.p inflando:
META-INF/com/android/otacert inflando: META-INF/
MANIFEST.MF
inflando: META-INF/CERT.SF inflando:
META-INF/CERT.RSA
- Permitir pacotes de atualização não assinados ou permitir pacotes assinados com chaves
personalizadas
- Forneça acesso completo ao ADB, com o daemon do ADB sendo executado como root
removido, ou o acesso ADB completo exposto, em seu dispositivo Android também deixa uma porta aberta para
NOTAA versão mais recente do Chainfire SuperSU pode ser baixada como um
pacote de atualização de recuperação emhttp://download.chainfire.eu/supersuou
como um aplicativo independente do Google Play emhttps://play.google.com/store/
apps/details?id=eu.chainfire.supersu.
O pacote ClockworkMod SuperUser pode ser obtido no Google Play em
https://play.google.com/store/apps/details?id=com
. koushikdutta.superuser.O código fonte está disponível emhttps://github
. com/koush/Superusuário.
bootloader.
O portal de desbloqueio do carregador de inicialização para SonyEricsson está
disponível emhttp://unlockbootloader.sonymobile.com/.
mkdir systemdir
simg2img system.img system.raw
mount -t ext4 -o loop system.raw systemdir cp su
systemdir/xbin/su
chown 0:0 systemdir/xbin/su chmod
6755 systemdir/xbin/su
make_ext4fs -s -l 512M -a system custom-system.img systemdir umount
systemdir
Capítulo 3-Enraizando seu dispositivo 67
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo \
- o ~/bin/repo
chmod a+x ~/bin/repo
repo init -u https://android.googlesource.com/platform/manifest repo sync
NOTAAo usar esse método, você está inicializando a imagem de recuperação personalizada sem
flashar, portanto, você a usa apenas para fazer flash de umsubinário na partição do sistema sem
modificar a partição de recuperação.
Para fazer isso, baixe uma imagem de recuperação personalizada esupacote de atualização. A
imagem de recuperação personalizada pode ser de sua escolha, desde que seja compatível com seu
dispositivo. Da mesma forma, osupacote de atualização pode ser SuperSU, SuperUser ou outro de sua
escolha.
Além disso, os dispositivos que usam o Android 4.1 ou posterior contêm um novo recurso chamado
carregamento lateral. Esse recurso permite aplicar um zip de atualização sobre o ADB sem copiá-lo
para o dispositivo antes. Para fazer sideload de uma atualização, execute o comandosideload adbsu-
pacote.fecho eclair, Ondesu-pacote.fecho eclairé o nome do arquivo do pacote de atualização no disco
rígido do seu computador.