Come posso ottenere un file apk da un dispositivo Android?


484

Come posso ottenere il file apk da un dispositivo Android? O come trasferisco il file apk dal dispositivo al sistema?

Risposte:


119

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")


1
Grazie Maurits Rijk. Per favore, aiutatemi. Voglio copiare il file iTwips.apk dal dispositivo al sistema. Sto usando il seguente comando. è corretto ? Ho ricevuto l'errore "Android2.2Froyo / sdcard / iTwips.apk" non esce ... / Users / bbb / Android / android-sdk-mac_86 / tools / adb pull Android2.2Froyo / sdcard / iTwips.apk / Users / bbb Grazie è anticipo .......
Finder

Sul mio dispositivo (Android 2.1) il comando sarebbe "adb pull /sdcard/test.jpg" per copiare test.jpg dalla mia scheda SD nella directory corrente. Individua innanzitutto il tuo file iTwips.apk utilizzando "adb shell". Questo avvia una shell sul tuo dispositivo e puoi usare i comandi Unix standard come ls e cd per sfogliare le tue directory.
Maurits Rijk,

Ciao, In realtà iTwips.apk è memorizzato nella memoria interna del dispositivo. come posso usare la shell per questo? Sto usando il seguente comando adp -d <devicenumber> shell .. Ma non funziona .. per favore aiutatemi .. Grazie in anticipo.
Finder

Ciao, grazie mille. Ora posso ottenere le immagini da sdcard. ma voglio estrarre il file apk dal dispositivo (cartella managementApplication). L'apk iTwips è memorizzato nella cartella dell'applicazione. Per favore, aiutatemi.
Finder

16
@Finder @Maurits Rijk In realtà, non è necessario eseguire il root del dispositivo solo per estrarre l'apk. Finché conosci il percorso completo di quell'apk. Se l'apk è installato, trova il percorso completo guardando prima il nome del pacchetto adb shell pm list packages, e il suo percorso completo adb shell pm path your.package.namepoi dal tuo PC, puoi semplicementeadb pull /full/path/to/your.apk
Isa A

1550

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

65
Questa è la risposta migliore, non è necessario eseguire il rrot del dispositivo !! grazie mille
Muhannad A.Alhariri,

14
Questo ha funzionato su tutti i miei dispositivi Android e dovrebbe essere la risposta accettata.
bcewan

8
pm list packagessupporta la -fbandiera, 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.
Hitechcomputergeek,

9
Non funziona per me. Ottengo il seguente errore: 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.
Bevor

8
Ho avuto un problema simile a @Bevor, quando ho tirato ho ricevuto l'errore che l'apk "non esiste". L'ho risolto usando adb shelle poi cp PathToApk /sdcard/e poi copiando dalla sdcard.
colin,

124

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ì.


1
Questa è una risposta fantastica! Grazie mille :)
Trascina0

1
Per qualche motivo non riesco a trovare gli APK nella mia directory / data / app / . C'è sempre una sottodirectory lì.
IgorGanapolsky,

per le app di sistema usa -f -sinvece di-f -3
palindrom il

57

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


7
Da blog.shvetsov.com/2013/02/… , se openssl non ha zlib, potrebbe funzionare: dd if = backup.ab bs = 1 skip = 24 | python -c "import zlib, sys; sys.stdout.write (zlib.decompress (sys.stdin.read ()))" | tar -xvf -
kodi

1
Questo è ciò che ha funzionato per me, non la procedura nella risposta accettata. E mi ha davvero aiutato oggi quando avevo bisogno dell'APK di una delle mie vecchie app ma non era disponibile per me se non dal mio telefono.
Zeeshan,

1
Ecco ulteriori informazioni se il tuo openssl non ha il supporto zlib: stackoverflow.com/questions/29830981/…
Nico Wiedemann,

19

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/

L'obiettivo è estrarre un singolo apk, ma nel passaggio 4 si estraggono due file aggiuntivi senza spiegazione o riferimento precedente.
Carles Alcolea,

Ho modificato questo post chiarendo ogni passaggio. Spero che questa modifica sia utile e di facile comprensione.
Farid Haq,

18
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)

Questo è il modo più semplice secondo me. Grazie!
Cartuccia 8 bit

1
i ragazzi che usano Linux o Mac invece di findstr usano grep
Jeeva il

10

Una fodera che funziona per tutte le versioni di Android:

adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk

1
@AlexP. cosa volevi dire dal link qui sopra?
Vitaly Dyatlov,

7

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.


7

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\""
}
  • Esempio :android_pull_apk com.android.contacts
  • Nota : per identificare il pacchetto:adb shell pm list packages

6

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


6

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.apkfile 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' -3opzione.


5

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 .apkfile.


5

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.


3
La risposta accettata (compresi i adb shellcomandi dal commento di @Isa A) ha funzionato bene per me su Android 7.1.1, non rootato.
Jonathan Cottrill,

4
  1. Apri l'app da cui desideri estrarre l'apk dal tuo telefono.
  2. Ottieni l'app attualmente aperta con:

    adb shell dumpsys activity activities | grep mFocusedActivity
  3. 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

3

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/


3

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_grabberscript Python per farlo per qualsiasi app che corrisponda a una data regex, quindi decompila quegli apk in file jar.


1

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:

  1. File Manager ES File Explorer
  2. ASTRO Cloud & File Manager 3. Cavo dati software

Spero che ti aiuti.


2
Ho usato ES File Explorer. Non sono radicato. Sono appena andato su Strumenti -> Gestione app e ho premuto a lungo l'app per cui volevo l'APK. Questo ha selezionato l'app (e mi ha permesso di selezionarne altri). Penso che abbia premuto il pulsante Condividi ed è stato in grado di inviare l'APK a me stesso (usando Push Bullet, ma ciò che mai funziona per te).
schultzter,

Se non sei marcio, puoi provare il backup dell'app e ripristinare play.google.com/store/apps/details?id=mobi.infolife.appbackup
surhidamatya



1

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)

0

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:

  1. L'approccio originale non ha funzionato per me su Android 7: adb pullcontinuavo a lamentarmi no such file or directorymentre adb shellpotevo accedere al file. Quindi ho usato un approccio diverso, con file temporaneo.
  2. Quando lanciato senza argomenti, il mio script elencherà solo tutti i pacchetti disponibili. Quando viene fornito il nome parziale del pacchetto, tenterà di indovinare il nome completo del pacchetto. Si lamenterà se ci sono diverse possibili espansioni.
  3. Non codifico il percorso di destinazione; invece gli APK vengono salvati nella directory di lavoro corrente.

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\""

0

La più semplice è: installare l'app "ShareIt" sul telefono. Ora installa l'app shareIt su PC o altro telefono. Ora dal telefono, dove è installata l'app, apri ShareIt e invia. Su un altro telefono o PC, apri ShareIt e ricevi.


0

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;
}
  1. Assicurati che adb (.exe) sia nel tuo percorso o nella stessa directory
  2. Collega il tuo telefono
  3. Esegui download-apk.pl

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.

-1

Questo sarà di aiuto per chi è alla ricerca di una risposta non tecnica

Questo è un semplice hack

Scarica l'applicazione App Share/Send Prodal 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.


Non è facile da usare
APEXBoi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.