Risposte:
Usa adb . Con adb pull puoi copiare i file dal tuo dispositivo al tuo sistema, quando il dispositivo è collegato con USB.
Naturalmente hai anche bisogno delle giuste autorizzazioni per accedere alla directory in cui si trova il tuo file. In caso contrario, dovrai prima eseguire il root del dispositivo.
Se scopri che molti degli APK sono chiamati "base.apk", puoi anche usare questo comando a una riga per estrarre tutti gli APK da un telefono a cui puoi accedere rinominando qualsiasi nome "base.apk" con il nome del pacchetto. Questo risolve anche il problema relativo alla directory non trovata per i percorsi APK con caratteri apparentemente casuali dopo il nome:
for i in $(adb shell pm list packages | awk -F':' '{print $2}'); do adb pull "$(adb shell pm path $i | awk -F':' '{print $2}')"; mv base.apk $i.apk 2&> /dev/null ;done
Se viene visualizzato "adb: errore: impossibile stat oggetto remoto" che indica che non si dispone delle autorizzazioni necessarie. Ho eseguito questo su una Moto Z2 NON rooted e sono stato in grado di scaricare TUTTI gli APK che non ho disinstallato (vedi sotto) tranne YouTube.
adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver <--- kills presidential alert app!
(per visualizzare gli utenti eseguono gli utenti dell'elenco pm pm adb shell) Questo è un modo per rimuovere / disinstallare (non dal telefono poiché viene ripristinato il ripristino delle impostazioni di fabbrica) quasi QUALSIASI app SENZA root che INCLUDE le app di sistema (suggerisci la fastidiosa app di aggiornamento che aggiorna il tuo telefono linea o no può essere trovato grepping per "ccc")
adb shell pm list packages
, e il suo percorso completo adb shell pm path your.package.name
poi dal tuo PC, puoi semplicementeadb pull /full/path/to/your.apk
Nessuno di questi suggerimenti ha funzionato per me, perché Android stava aggiungendo un numero progressivo al nome del pacchetto per produrre il nome del file APK finale. Nelle versioni più recenti di Android (Oreo e Pie), viene aggiunta una stringa casuale imprevedibile. La seguente sequenza di comandi è ciò che ha funzionato per me su un dispositivo non rootato :
1) Determinare il nome del pacchetto dell'app, ad esempio "com.example.someapp". Salta questo passaggio se conosci già il nome del pacchetto.
adb shell pm list packages
Guarda l'elenco dei nomi dei pacchetti e prova a trovare una corrispondenza tra l'app in questione e il nome del pacchetto. Questo di solito è facile, ma tieni presente che il nome del pacchetto può essere completamente estraneo al nome dell'app. Se non riesci a riconoscere l'app dall'elenco dei nomi dei pacchetti, prova a trovare l'app in Google Play utilizzando un browser. L'URL di un'app in Google Play contiene il nome del pacchetto.
2) Ottieni il nome percorso completo del file APK per il pacchetto desiderato.
adb shell pm path com.example.someapp
L'output sarà simile al
pacchetto: /data/app/com.example.someapp-2.apk
o
pacchetto: /data/app/com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ == / base.apk
3) Utilizzando il nome completo del percorso dal passaggio 2, estrarre il file APK dal dispositivo Android nella casella di sviluppo.
adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
pm list packages
supporta la -f
bandiera, che elenca la posizione del .apk per te, come package:/data/app/com.google.android.apps.maps-1.apk=com.google.android.apps.maps
. La guida integrata di pm è inutile, ma pm può anche filtrare anche i tipi di pacchetti, vedi developer.android.com/studio/command-line/adb.html#pm per maggiori informazioni. EDIT: ho appena notato che la risposta qui sotto dice questo, ma quella risposta non è così votata come questa.
adb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist
. Se sfoglio queste cartelle con un browser di file, le cartelle sono vuote.
adb shell
e poi cp PathToApk /sdcard/
e poi copiando dalla sdcard.
Non è richiesta la radice:
Questo codice otterrà il percorso dei pacchetti di terze parti con il nome in modo da poter identificare facilmente il tuo APK
adb shell pm list packages -f -3
l'uscita sarà
Pacchetto: /data/app/XX.XX.XX.apk=YY.YY.YY
ora tira quel pacchetto usando il codice seguente:
adb pull /data/app/XX.XX.XX.apk
se hai eseguito sopra cmd in C:>\
, troverai quel pacchetto lì.
-f -s
invece di-f -3
Ho visto che molte soluzioni a questo problema o devi eseguire il root del tuo telefono o devi installare un'app. Poi, dopo aver cercato su Google, ho ottenuto questa soluzione per i telefoni non rooted / rooted.
Per elencare quali app hai ottenuto finora.
adb shell pm list packages
Quindi puoi selezionare un'app, ad esempio twitter
adb backup -apk com.twitter.android
Una cosa importante qui è non impostare una password per crittografare il backup
Questo creerà un file chiamato backup.ap, ma non è ancora possibile aprirlo. Per questo devi estrarlo di nuovo ma usando il comando dd.
dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
Dopo tutto ciò che devi fare è estrarre il contenuto di tar ed è fatto.
Spero che funzioni per voi ragazzi
Passaggi per scaricare APK dal dispositivo al desktop
A) Assicurati di correre (emulatore / dispositivo reale). Per controllare usa questo comando
adb devices
B) Seleziona tutto l'elenco dei pacchetti disponibili installato sul tuo dispositivo. Puoi usare il comando grep per selezionare il pacchetto specifico che intendi scaricare.
adb shell pm list packages
adb shell pm list packages -f -3
Output (Elenco dei pacchetti disponibili)
package:/data/app/com.example.mytestapplication-sOzKi5USzfbYLPNDmaaK6g==/base.apk=com.example.mytestapplication
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk=com.example.myapplication
C) Copia il pacchetto (che desideri scaricare) dal link sopra. Dal nostro caso ho scelto questo pacchetto (com.example.myapplication)
Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication
Produzione
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk
D) Infine, per scaricare APK dal tuo (emulatore / dispositivo reale)
Syntax : adb pull /data/app/[your_package_name]-1/base.apk [your_destination_path]
Command: adb pull /data/app/com.example.myapplication-3j4CVk0Tb2gysElgjz5O6A==/base.apk /Users/$(whoami)/Documents/your_apk.apk
Esempio: tentativo di estrarre questo file CertInstaller.apk nel computer locale (Mac)
adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/
E) Conferma nella tua directory locale
ls -la /Users/$(whoami)/Documents/
C:\Users\xyz>adb shell pm list packages -f | findstr whatsapp
package:/data/app/com.whatsapp-1/base.apk=com.whatsapp
C:\Users\xyz>adb pull /data/app/com.whatsapp-1/base.apk Desktop
/data/app/com.whatsapp-1/base.apk: 1 f.... 13.8 MB/s (32803925 bytes in
2.269s)
Una fodera che funziona per tutte le versioni di Android:
adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
Completando la risposta di @Yojimbo, questo è quello che ho fatto (solo Linux / Mac, non funzionerà immediatamente su Windows ... forse nella shell bash di git):
for i in $(adb shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done
Questo è brutto bash, ma funziona :)
EDIT: non funziona più su AndroidM: tutti i file sono denominati "base.apk" sotto un'altra directory. Dovrebbe essere "banale" da risolvere.
Sui sistemi unix, puoi provare questa funzione:
function android_pull_apk() {
if [ -z "$1" ]; then
echo "You must pass a package to this function!"
echo "Ex.: android_pull_apk \"com.android.contacts\""
return 1
fi
if [ -z "$(adb shell pm list packages | grep $1)" ]; then
echo "You are typed a invalid package!"
return 1
fi
apk_path="`adb shell pm path $1 | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`adb shell basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"
destination="$HOME/Documents/Android/APKs"
mkdir -p "$destination"
adb pull ${apk_path} ${destination}
echo -e "\nAPK saved in \"$destination/$apk_name\""
}
android_pull_apk com.android.contacts
adb shell pm list packages
Come detto sopra, puoi ottenere l'apk usando il comando pull in adb.
Da allora, stai parlando delle tue applicazioni installate, vai avanti e cerca nella directory / data / app del tuo filesystem Android. Troverai l'APK lì.
Quindi utilizzare il comando adb - adb pull /data/data/appname.apk
Prova questo comando one liner bash per eseguire il backup di tutte le tue app:
for package in $(adb shell pm list packages -3 | tr -d '\r' | sed 's/package://g'); do apk=$(adb shell pm path $package | tr -d '\r' | sed 's/package://g'); echo "Pulling $apk"; adb pull -p $apk "$package".apk; done
Questo comando deriva dalla sceneggiatura di Firelord . Ho appena rinominato tutti gli apk con i nomi dei loro pacchetti per aver risolto il problema con lo script di elcuco , ovvero lo stesso base.apk
file che veniva sovrascritto su Android 6.0 "Marshmallow" e versioni successive.
Si noti che questo comando esegue il backup solo delle app di terze parti, quindi non vedo il punto di eseguire il backup delle app integrate. Ma se vuoi eseguire anche il backup delle app di sistema, ometti l' -3
opzione.
Se conosci (o se riesci a "indovinare") il percorso del .apk
( sembra essere del formato /data/app/com.example.someapp-{1,2,..}.apk
, allora puoi anche copiarlo /data/app
. Funzionava anche sul mio telefono Android non rootato.
Basta usare un'app Terminal Emulator (come questa ) ed eseguire:
# step 1: confirm path
ls /data/app/com.example.someapp-1.apk
# if it doesn't show up, try -2, -3. Note that globbing (using *) doesn't work here.
# step 2: copy (make sure you adapt the path to match what you discovered above)
cp /data/app/com.example.someapp-1.apk /mnt/sdcard/
Quindi puoi spostarlo dalla scheda SD dove vuoi (o allegarlo a un'email ecc.). L'ultimo bit potrebbe essere tecnicamente facoltativo, ma ti semplifica la vita quando cerchi di fare qualcosa con il .apk
file.
Le procedure descritte qui non funzionano per Android 7 (Nougat) [e possibilmente per Android 6, ma non sono in grado di verificare]. Non è possibile estrarre i file .apk direttamente in Nougat (a meno che non sia in modalità root, ma richiede un telefono con root). Tuttavia, puoi copiare .apk in un percorso alternativo (ad esempio / sdcard / Download) sul telefono usando la shell adb, quindi puoi fare un pull adb dal percorso alternativo.
adb shell
comandi dal commento di @Isa A) ha funzionato bene per me su Android 7.1.1, non rootato.
Ottieni l'app attualmente aperta con:
adb shell dumpsys activity activities | grep mFocusedActivity
Ottieni il percorso per il nome del pacchetto
adb shell pm path <packagename.apk>
4.Copia il percorso che hai ottenuto nella directory sdcard
adb shell cp /data/app/<packagename.apk> /sdcard
5.Tira l'apk
adb pull /sdcard/base.apk
modificare
Se il passaggio n. 2 non funziona, utilizzare questo:
adb shell dumpsys window windows | grep mCurrentFocus
Ecco come lo fai:
Scarica e installa APK Extractor sul tuo dispositivo. È gratuito ed è compatibile in quasi tutti i dispositivi Android. Un altro punto a favore è che non richiede nemmeno root o nulla per funzionare. Dopo averlo installato, avviarlo. Lì vedrai un elenco di app nel tuo dispositivo, che includono le app che hai installato in seguito, insieme alle app di sistema. Premi a lungo qualsiasi app che desideri estrarre (puoi selezionare più o tutte le app contemporaneamente) e fai clic sull'opzione di estrazione che vedi in alto. Avrai anche la possibilità di condividere tramite Bluetooth o messaggistica. Fatto, vedrai le app estratte come AppName_AppPackage_AppVersionName_AppVersionCode.apk, che verranno salvate nel percorso / sdcard / ExtractedApks / per impostazione predefinita.
Per una descrizione dettagliata di come estrarre i file apk in Android , visitare: http://appslova.com/how-to-extract-apk-files-in-android/
Tutte queste risposte richiedono più passaggi per ciascun file apk recuperato dal dispositivo. 1. determinare il nome del pacchetto, 2. trovare il file e 3. scaricarlo. Ho creato un semplice apk_grabber
script Python per farlo per qualsiasi app che corrisponda a una data regex, quindi decompila quegli apk in file jar.
Non ho usato il codice per estrarre il file .apk dal cellulare ma ho usato il software per estrarre il file .apk dal cellulare e il software che ho usato sono sotto con il link di Google Play:
Spero che ti aiuti.
vuoi una soluzione da 1 minuto molto, molto comoda?
solo tu questa app https://play.google.com/store/apps/details?id=com.cvinfo.filemanager (gestore file intelligente da Google Play).
tocca "app", scegline una e tocca "backup". finirà nel tuo file system nella app_backup
cartella;)
Metodo richiesto senza radice e senza strumenti ADB. Installa l' app MyAppSharer dal Play Store.
ho un does not exist error
Ecco come lo faccio funzionare
adb shell pm list packages -f | findstr zalo
package:/data/app/com.zing.zalo-1/base.apk=com.zing.zalo
adb shell
mido:/ $ cp /data/app/com.zing.zalo-1/base.apk /sdcard/zalo.apk
mido:/ $ exit
adb pull /sdcard/zalo.apk Desktop
/sdcard/zalo.apk: 1 file pulled. 7.7 MB/s (41895394 bytes in 5.200s)
Ancora un altro script bash (cioè funzionerà per la maggior parte dei sistemi basati su unix). Basato sulla risposta di Pedro Rodrigues , ma è leggermente più facile da usare.
Miglioramenti rispetto alla versione di Pedro:
adb pull
continuavo a lamentarmi no such file or directory
mentre adb shell
potevo accedere al file. Quindi ho usato un approccio diverso, con file temporaneo.Salvalo in un file eseguibile:
#!/bin/bash
# Obtain APK file for given package from the device connected over ADB
if [ -z "$1" ]; then
echo "Available packages: "
adb shell pm list packages | sed 's/^package://'
echo "You must pass a package to this function!"
echo "Ex.: android_pull_apk \"com.android.contacts\""
exit 1
fi
fullname=$(adb shell pm list packages | sed 's/^package://' | grep $1)
if [ -z "$fullname" ]; then
echo "Could not find package matching $1"
exit 1
fi
if [ $(echo "$fullname" | wc -l) -ne 1 ]; then
echo "Too many packages matched:"
echo "$fullname"
exit 1
fi
echo "Will fetch APK for package $fullname"
apk_path="`adb shell pm path $fullname | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"
destination="${fullname}.apk"
tmp=$(mktemp --dry-run --tmpdir=/sdcard --suffix=.apk)
adb shell cp "${apk_path}" "$tmp"
adb pull "$tmp" "$destination"
adb shell rm "$tmp"
[ $? -eq 0 ] && echo -e "\nAPK saved in \"$destination\""
Mi sono piaciute davvero tutte queste risposte. La maggior parte degli script per esportarli e rinominarli tutti sono stati scritti in Bash. Ho realizzato un piccolo script Perl che fa lo stesso (che dovrebbe funzionare sia in Perl per Windows che Linux, testato solo su Ubuntu).
download-apk.pl
#!/usr/bin/perl -w
# Automatically export all available installed APK's using adb
use strict;
print "Connect your device...\n";
system("adb", "wait-for-device");
open(my $OUT, '-|', 'adb', 'shell', 'pm', 'list', 'package', '-f');
my @list = split(/\s*/, `adb shell pm list packages -f`);
my $count = 0;
while(my $line = <$OUT>) {
$line =~ s/^\s*|\s*$//g;
my ($type, $path, $package) = $line =~ /^(.*?):(.*)=(.*)$/ ? ($1,$2,$3) : die('invalid line: '.$line);
my $category = $path =~ /^\/(.*?)\// ? $1 : 'unknown';
my $baseFile = $path =~ /\/([^\/]*)$/ ? $1 : die('Unknown basefile in path: '.$path);
my $targetFile = "$category-$package.apk";
print "$type $category $path $package $baseFile >> $targetFile\n";
system("adb", "pull", $path);
rename $baseFile, $targetFile;
}
L'output è simile a:
# ./download-apk.pl
Connect your device...
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
package system /system/app/YouTube/YouTube.apk com.google.android.youtube YouTube.apk >> system-com.google.android.youtube.apk
5054 KB/s (11149871 bytes in 2.154s)
package data /data/app/com.ghostsq.commander-1/base.apk com.ghostsq.commander base.apk >> data-com.ghostsq.commander.apk
3834 KB/s (1091570 bytes in 0.278s)
package data /data/app/de.blinkt.openvpn-2/base.apk de.blinkt.openvpn base.apk >> data-de.blinkt.openvpn.apk
5608 KB/s (16739178 bytes in 2.914s)
etc.
Questo sarà di aiuto per chi è alla ricerca di una risposta non tecnica
Questo è un semplice hack
Scarica l'applicazione App Share/Send Pro
dal Google Play Store. Seleziona l'app che desideri inviare e invia l'applicazione metodo.
Di solito uso il Bluetooth per inviare applicazioni al mio PC o ad un altro telefono.