====== Backup App Android da riga di comando ======
Lo script Python **[[https://github.com/RigacciOrg/android-my-scripts/blob/master/adb-pakage-get-apk/adb-pakage-get-apk|adb-pakage-get-apk]]** consente di fare **il backup sul proprio PC delle app** installate su un dispositivo **Android**. La copia consiste nel **file apk** (o i file, se sono più di uno) che può essere utilizzato per installare nuovamente la app sullo stesso device o su di un altro.
===== Perché fare il backup di una app =====
Un dispositivo Android generalmente installa le applicazioni accedendo al **Play Store di Google** oppure a store alternativi, come l'ottimo **F-Droid** dedicato al software libero ed //open source//. In genere si pensa che lo store sia sempre disponibile e che sarà sempre possibile installare o reinstallare le app a piacimento. Ciò ovviamente non è vero: in ogni momento una app potrebbe essere **rimossa dallo store** per i motivi più disparati.
Inoltre la app associata allo store gestisce anche gli **aggiornamenti** in modo più o meno automatico. Questo significa che normalmente una app viene aggiornata **disinstallando automaticamente la vecchia versione** per sostituirla con quella nuova.
Ci sono molti motivi per cui è possibile pentirsi di un aggiornamento, ad esempio:
* La nuova versione introduce qualche **nuovo bug** e gli sviluppatori non sono rapidi nel risolverlo.
* Aumentano le **richieste hardware** della app, per cui risulta preferibile eseguire la vecchia versione se il nostro device non è abbastanza performante.
* Lo sviluppatore ha introdotto delle **anti feature** che prima non erano presenti, ad esempio ha aggiunto i **banner pubblicitari** ad una app che ne era priva.
Purtroppo gli store non garantiscono la disponibilità delle vecchie versioni delle app (fortunatamente F-Droid è una eccezione), quindi è consigliabile fare un backup prima di un aggiornamento. Android offre il vantaggio di poter trovare sul filesystem del dispositivo uno o più file **apk** che contiene tutto il necessario per reinstallare l'app.
La parte complicata è scoprire **il percorso del file apk** e il **nome** dell'archivio e la **versione** del programma.
===== Le app di backup =====
Esistono molte app, gratuite e non, che promettono di fare il backup delle app installate in modo più o meno automatico, ma in generale hanno dei difetti, tra cui:
* Le app gratuite sono spesso infestate da **banner pubblicitari**.
* Le app di backup in genere hanno decine di altre **funzioni non necessarie** e non volute.
* Non è possibile collegare la procedura di backup con altre azioni, cioè realizzare **script utente** con procedure di backup.
===== Backup da riga di comando =====
Viste le premesse, ho cercato una soluzione semplice e da **riga di comando**, che abbia come **unico requisito l'accesso ADB** (Android Debug Bridge). Lo script presentato qui è stato provato su un PC GNU/Linux con installato il **[[https://packages.debian.org/search?keywords=adb|pacchetto Debian adb]]**.
Vedi e scarica lo script Python: **[[https://github.com/RigacciOrg/android-my-scripts/blob/master/adb-pakage-get-apk/adb-pakage-get-apk|adb-pakage-get-apk]]**.
La procedura (richiede **Python 3**) si basa in realtà su alcuni comandi eseguibili in una **sessione terminale Android**. Per stabilire la connessione con il dispositivo Android si deve collegare il cavetto USB, abilitare l'opzione **Debug USB** e quindi eseguire sul PC il comando **adb shell**.
Per ottenere la lista delle **app installate**:
cmd package list packages -f
in alternativa, se non è presente il comando **cmd**, si può utilizzare **pm**:
pm list packages
Per sapere la **versione** di un pacchetto installato (ad esempio //com.android.chrome//) si utilizza **dumpsys**:
dumpsys package com.android.chrome
Per scoprire **i file apk** installati da una app (potrebbero essere più di uno) si utilizza **pm path**:
pm path com.android.chrome
Infine per **scaricare il file** dal dispositivo Android verso il PC si esegue (sul PC) il comando **adb pull**:
adb pull /system/app/Chrome/Chrome.apk
In generale **non sono richiesti i privilegi di root**. Tuttavia alcune app mettono i file apk in directory non accessibili all'utente non privilegiato, in questo è necessario disporre dei privilegi di root (avere cioè il comando **su** funzionante) e copiare il file apk nello storage (directory **/sdcard/**) prima di scaricarlo con **adb pull**.
===== Web References =====
* **[[https://stackoverflow.com/questions/4032960/how-do-i-get-an-apk-file-from-an-android-device|How do I get an apk file from an Android device?]]**.