Android SDK e ADB
Gli ambienti di sviluppo Android possono essere scaricati come unico pacchetto con Android Studio oppure singolarmente con gli strumenti a linea di comando Android.

Installazione Android SDK - CLI Tools
Supponiamo di voler installare gli SDK Android nella cartella $HOME/Sviluppo/AndroidSDK.
mkdir -p "$HOME/Sviluppo/AndroidSDK/cmdline-tools/latest"
Al momento lo script di installazione richiede che gli strumenti a linea di comando siano posizionati nella cartella cmdline-tools/latest quindi procediamo nel crearle.
mkdir -p "$HOME/Sviluppo/AndroidSDK/cmdline-tools/latest"
Scaricato il pacchetto dal sito ufficiale, è necessario estrarlo e spostare tutti i file estratti nella cartella latest.
Dalla cartella cmdline-tools/latest/bin è possibile eseguire il comando per visualizzare i pacchetti da installare:
./sdkmanager --list
Questo comando da in output la seguente tabella:
Available Packages:
  Path                 | Version    | Description
  build-tools;30.0.3   | 30.0.3     | Android SDK Build-Tools 30.0.3
  platforms;android-30 | 2          | Android SDK Platform 30
  platform-tools       | 34.0.0     | Android SDK Platform-Tools
  emulator             | 32.1.11    | Android Emulator
I pacchetti da installare sono i seguenti:
- Il software di emulazione emulator
- Le immagini di sistema system-imagesda eseguire negli emulatori; si differenziano per varianti comesystem-images;android-32;google_apis;x86_64che supporta le API di Google esystem-images;android-32;google_apis;aosp_atd;x86_64del progetto Android Open Source Project (AOSP);
- Gli strumenti di compilazione build-toolsnecessari a creare un file APK;
- Gli strumenti platform-toolsper gestire la piattaforma Android (indipendente dalla versione Android e dalla versione API utilizzata);
- Le API e le implementazioni platforms;android-32specifiche per la versione Android;
Per la scelta della versione dei pacchetti da installare si deve seguire la corrispondenza in tabella:
| versione | SDK e API level | Build Tools | 
|---|---|---|
| Android 11 | SDK Platform 30 | 30.x | 
| Android 12 | SDK Platform 31 | 31.x | 
| Android 12L | SDK Platform 32 | 32.x | 
| Android 13 | SDK Platform 33 | 33.x | 
| Android 14 | SDK Platform 34 | 34.x | 
Dalla cartella latest/bin è possibile lanciare i seguenti comandi per installare i componenti scelti:
./sdkmanager "platform-tools"
./sdkmanager "platforms;android-33"
./sdkmanager "build-tools;33.0.0"
./sdkmanager "emulator"
./sdkmanager "system-images;android-33;aosp_atd;x86_64"
E’ possibile verificare i pacchetti istallati con il comando:
./sdkmanager --list_installed
L’output indica i pacchetti installati ed il relativo percorso:
| Path | Version | Description | Location | 
|---|---|---|---|
| build-tools;30.0.3 | 30.0.3 | SDK Build-Tools 30.0.3 | build-tools/30.0.3 | 
| emulator | 32.1.11 | Android Emulator | emulator | 
| patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4 | 
| platform-tools | 34.0.0 | Android SDK Platform-Tools | platform-tools | 
| platforms;android-30 | 2 | Android SDK Platform 30 | platforms/android-30 | 
Installati i pacchetti desiderati, si procede a salvare nel file .bashrc i percorsi appena creati:
export ANDROID_HOME="$HOME/Sviluppo/AndroidSDK"
export ANDROID_SDK_ROOT="$HOME/Sviluppo/AndroidSDK"
export PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin
export PATH=$PATH:$ANDROID_SDK_ROOT/emulator
export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools
export PATH=$PATH:$ANDROID_SDK_ROOT/build-tools
Creazione dispositivo virtuale Android (adv)
Per creare un dispositivo virtuale Android (avd), assicurarsi di aver installato una system-images con la stessa versione del pacchetto platforms;android installato.
Per visualizzare le specifiche hardware dei dispositivi disponibili, si usa il comando:
avdmanager list device
Per visualizzare i dispositivi virtuali creati:
avdmanager list avd
Si può creare un nuovo dispositivo virtuale myTablet basato sull’immagine system-images installata, specificando opzionalmente:
- la cartella in cui salvare lo stato e la configurazione con il parametro --path FOLDER;
- il dispositivo di riferimento (scelto tra quelli disponibili) con il parametro --device NAME.
Il comando completo è il seguente:
avdmanager create avd --name myTablet --package "system-images;android-35;aosp_atd;x86_64" --path "$HOME/Sviluppo/AndroidSDK/avd/myTablet" --device "medium_tablet"
Per avviare un dispositivo virtuale:
emulator -avd "Pixel2"
In caso di errore “ERROR | Unable to connect to adb daemon on port: 5037”, stoppare e riavviare il server e verificare la porta:
adb kill-server
adb start-server
netstat -aon | grep 5037
Per accelerazione grafica simulata:
emulator -avd "Pixel2" -gpu swiftshader_indirect
Per cancellare un dispositivo virtuale:
avdmanager delete avd --name myTablet
Comandi adb
Adb ha una shell che si può utilizzare per inviare comandi al telefono.
adb shell
daemon not running; starting now at tcp:5037
daemon started successfully
Dalla shell si può utilizzare il seguente comando che permette di gestire tante caratteristiche del sistema:
cmd package
Si può anche lanciare un comanda nella shell in maniera non interattiva:
adb shell 'cmd package'
Per visualizzare gli utenti: pm list users
Users:
UserInfo{0::c13} running
UserInfo{97:dual:1010} running
In questo caso si vede l’utente con ID 0 e l’utente con ID 97 per le app installate il “dual mode”.
Per installare un app per un utente: il comando:
adb install  --user 97  app.apk
Per trovare il path di un file APK:
adb shell
cmd package path com.android.chrome
Per copiare e incollare da e verso il dispositivo:
adb pull path_from_android path_to_local
adb push path_to_android path_from_local
Per rimuovere un app per un utente: il comando:
cmd package clear --user 97 com.android.chrome
cmd package uninstall  --user 97  com.android.chrome
Esempio di rimozione di una app:
adb shell 'cmd package path com.google.android.apps.subscriptions.red'
adb pull system/priv-app/GoogleOne/GoogleOne.apk /home/io/SyncV3/Varie/apk/
adb shell 'cmd package clear --user 97 com.google.android.apps.subscriptions.red'
adb shell 'cmd package clear --user 0 com.google.android.apps.subscriptions.red'
adb shell 'cmd package uninstall  --user 97  com.google.android.apps.subscriptions.red'
adb shell 'cmd package uninstall  --user 0  com.google.android.apps.subscriptions.red'