Última actualização: 2020-11-01

O que é o adb?

adb significa Android Debug Bridge e é uma ferramenta que te permite comunicar facilmente com o teu telemóvel. Tens vários comandos que podes utilizar e que vão desde:

Configurar o adb

Antes de te ligares via Wi-Fi é preciso teres primeiro o adb correctamente configurado. Para confirmar, introduz o comando:

adb

Na linha de comandos verifica se o programa foi encontrado. Deves ver uma mensagem semelhante a esta:

Android Debug Bridge version 1.0.41
Version 30.0.4-6686687
Installed as /Users/carlosmota/Library/Android/sdk/platform-tools/adb

global options:
 -a         listen on all network interfaces, not just localhost
 -d         use USB device (error if multiple devices connected)
 -e         use TCP/IP device (error if multiple TCP/IP devices available)
 -s SERIAL  use device with given serial (overrides $ANDROID_SERIAL)
 -t ID      use device with given transport id
 -H         name of adb server host [default=localhost]
 -P         port of adb server [default=5037]
 -L SOCKET  listen on given socket for adb server 
...

Caso contrário, podes ver como configurar a partir deste Codelab:

Existem um conjunto de comandos que podes utilizar para acederes e interagires com o teu telemóvel. Por exemplo, para mandares texto a partir do computador e escreveres mensagens muito mais rápido, para gravares o teu ecrã, etc.

adb [install|uninstall] [flag] [apk]

Num exemplo real seria algo como:

adb install pt.o.nome.do.teu.projecto
adb install -g pt.o.nome.do.teu.projecto
adb [push|pull] [source] [destination]

Se quiseres enviar um ficheiro para o teu telemóvel só tens de escrever:

adb push /path/to/filename /storage/emulated/0/

Onde /storage/emulated/0 corresponde ao espaço partilhado no teu Android. Pode ser qualquer outra directoria que queiras, desde que tenhas permissões de escrita para o fazer.

Se não sabes qual o package name desse .apk, podes:

1. Procurar entre todas as aplicações que tens instaladas a partir do comando:

adb shell pm list packages

E depois de a encontrares, ver em que directoria se encontra:

adb shell pm path [package]

2. Se não tiveres a certeza de qual é o package name, mas tens uma ideia que deverá contar um nome em específico (por exemplo, o nome da aplicação), podes filtrar por todas as aplicações que contenham essa palavra:

adb shell pm list packages | grep ‘word'

E de forma a teres o caminho para o .apk, podes simplesmente adicionar a flag -f e escrever:

adb shell pm list packages -f | grep "word"

Existe outras flags que podes usar com este comando:

Para te devolver o caminho para o ficheiro associado

Filtra por todas as aplicações que foram desactivadas

Filtra por todas as aplicações que se encontrem ativas

Filtra por todas as aplicações de sistema

Filtra apenas por aplicações de terceiros

Depois de saberes onde é que o .apk se encontra podes decarregá-lo através do comando pull:

adb pull [source] [destination]

O que podemos traduzir para:

adb pull /data/app/com.your.app.apk your/destination/path

Para apagar a cache assim como todos os dados de uma aplicação:

adb shell pm clear [package]

Estás a fazer um teste que envolve escrever vários caracteres e símbolos? Bem, podes sempre enviar esta mensagem do teu computador directamente para o telemóvel via:

adb shell input text "Hello world!"
adb shell dumpsys package [package]

A partir deste comando consegues saber que permissões é que uma determinada aplicação precisa e quais é que foram dadas e quais não foram:

adb shell pm [grant|revoke] [package] [permission]

Por exemplo, correndo o comando dumpsys, consegues saber que a aplicação precisa de aceder à câmara e que esta permissão foi dada.

User 0: 
 gids=[3002, 3003]
 runtime permissions:
 android.permission.CAMERA: granted=true

Para remover uma permissão:

adb shell pm revoke com.your.app android.permission.CAMERA

Dependendo se uma determinada aplicação pediu a permissão individualmente ou em grupo, pode ser preciso remover cada uma das permissões individualmente. Por outras palavras, se por exemplo, foi pedida a permissão de contatos - android.permission-group.CONTACTS - então as seguintes permissões foram dadas automaticamente:

Portanto para removeres esta permissão por completo, vais ter de executar os seguintes comandos:

adb shell pm revoke com.your.app android.permission.READ_CONTACTS
adb shell pm revoke com.your.app android.permission.WRITE_CONTACTS
adb shell pm revoke com.your.app android.permission.GET_ACCOUNTS

Ou então remover directamente a permissão de grupo:

adb shell pm reset-permissions [package]

Podes encontrar mais informações sobre as permissões de grupo e quais cada grupo contém a partir deste link.

Podes interagir com diferentes aplicações a partir da utilização de broadcasts com diferentes acções associadas. Por exemplo, para fazer uma chamada podes executar:

adb shell am start -a android.intent.action.CALL -d tel:[number]

Que vai ser traduzido no envio de um intent com a ação CALL (chamada) para o número (number):

  Starting: Intent { act=android.intent.action.CALL dat=tel:xxxxxxxx }

Se em vez de CALL, utliizares a ação DIAL:

adb shell am start -a android.intent.action.DIAL -d tel:[number]

Irá ser traduzido para:

Starting: Intent { act=android.intent.action.DIAL dat=tel:xxxxxxxx }

Que irá abrir a aplicação de chamadas que tens pré-definida com o número que enviaste.

Em alternativa, podes sempre enviar uma acção customizada por ti:

adb shell am broadcast -a ["action"]

Podes enviar um evento do teu computador para simular um toque no ecrã - só tens de definir as coordenadas onde queres que isso vá acontecer:

adb shell input tap [x coordinate] [y coordinate]

Ou podes sempre enviar o equivalente ao utilizador carregar numa das teclas virtuais:

adb shell input keyevent 3   // Home button

Neste caso específico, o equivalente ao utilizador ter carregado no botão HOME. Em alternativa, podes sempre enviar também um intent:

adb shell am start -W -c android.intent.category.HOME -a android.intent.action.MAIN

Mais alguns exemplos:

adb shell input keyevent 4   // Back button
adb shell input keyevent 5   // Open default call app
adb shell input keyevent 6   // End call
adb shell input keyevent 26  // Turn the screen on/ off
adb shell input keyevent 64  // Open browser
adb shell input keyevent 207 // Open contacts

Podes aceder ao logcat e monitorizar todos os logs do teu telemóvel a partir do comando:

adb logcat

Contudo, isto vai dar-te os logs de todas as aplicações que tens instaladas, assim como os do sistema. O que pode ser difícil de analisar para procurar uma mensagem específica. Por isso, tens a possibilidade de os filtrar de acordo com a prioridade com que foram definidos.

Vamos assumir que apenas criaste os logs que estavam na gama de avisos e erros. Para isso corres o comando:

adb logcat *:W

Onde W corresponde à prioridade das mensagens e contém todas aquelas que lhe estão acima.

Podes seleccionar qualquer um dos filtros a partir desta lista (ordenada do menos prioritário para o mais prioritário):

Mostra todos os logs

A opção que escolheres desta lista vai-te mostrar todas as mensagens com essa prioridade e todas as que se encontrem por baixo da categoria escolhida.

E podes ainda filtrar de acordo com o package name de uma aplicação:

adb logcat — pid=$(adb shell pidof -s [package])

Ou pelo nome que definiste para a TAG utilizada quando chamaste o logger:

Log.d(TAG, "Text")

Desta forma:

adb logcat -s TAG 

Para ser mais fácil distinguir entre diferentes prioridades de mensagens podes utilizar a flag -v com uma cor específica:

adb logcat -v color

Há vários comandos que podem ser utilizados para alterar o estado de uma definição nativa ou apenas para saber o estado dela. Por exemplo,

Para alterar o estado do bluetooth para ativo:

adb shell am start -a android.bluetooth.adapter.action.REQUEST_ENABLE

Ou REQUEST_DISABLED para desligar.

Para teres mais informações sobre o estado da tua ligação WiFi:

adb shell am start -n com.android.settings/.wifi.WifiStatusTest

Podes facilmente capturar o ecrã do teu telemóvel a partir do comando:

adb shell screencap [device/path/filename.png]

Ou gravá-lo se utilizares antes:

adb shell screenrecord [device/path/filename.mp4]

A gravação termina quando:

Depois de gravares, podes descarregar o ficheiro para o teu computador a partir do comando:

adb pull [device/path/filename.png] [computer/path]

Para acederes à lista de todos os telemóveis que tens ligados ao computador:

adb devices

Para instalares uma aplicação num telemóvel específico:

adb -s [device id] install [apk]

Onde device id corresponde ao id do telemóvel onde queres instalar e que te é dado no comando anterior.

Para instalares em todos os telemóveis:

adb devices | tail -n +2 | cut -sf 1 | xargs -IX adb -s X install -r [apk]

Se tudo correr bem, irás ver a mensagem Success múltiplas vezes - uma por cada um dos telemóveis que se encontrem ligados.

Ou se tens apenas um telemóvel ligado e um emulador podes utilizar estas flags:

Para distinguir onde é que o .apk deverá ser instalado. Por exemplo, para o emulador:

adb -e install [apk]

Enviar um comando para um dispositivo especifico:

adb -s [device id] shell [command]

E por último, vamos enviar um evento do teclado para o device id "emulator-5554":

adb -s emulator-5554 shell input keyevent 5

A maior parte destas funcionalidades já se encontram disponíveis na última versão do Android Studio e são bastante simples de utilizar. Para aquelas que estão em falta, existem um conjunto de plugins que podem utilizar:

Tem algumas das funcionalidades descritas neste Codelab como - desinstalar, terminar, reiniciar uma aplicação, etc.)

Permite-te enviar instruções via adb para o teu telemóvel sem o teres ligado via USB. Na realidade acaba por ser equivalente ao que fizemos no Codelab: Ligar via WiFi.

Se utilizas um outro comando que achas interessante, não hesites em partilhar connosco! Abre uma sugestão no GitHub que depois atualizamos.