Come posso ottenere l'APK di un'app installata senza accesso root?


196

Sto cercando di estrarre il file APK di un'app Android installata SENZA autorizzazioni di root.

Ho pensato che fosse impossibile, perché tutti i file APK per le app non di sistema si trovano in / data / app e l'accesso a questa cartella richiede l'autorizzazione di root. Poi ho scoperto che ci sono numerose app nel Google Play Store che sembrano avere accesso ai file APK anche su dispositivi non rootati.

Qualcuno può dirmi come è possibile? Non ci sono app di backup che eseguono il backup dei file APK senza root?


2
Penso che questa domanda abbia già una risposta. Dai un'occhiata a stackoverflow.com/a/12197924/1016544
Wahib Ul Haq




3
La mia lettura di questo è che @pinas stava chiedendo come codificare questo a livello di codice - facendo riferimento alle app che lo fanno come per dire "Queste app lo fanno, ma come?". Il motivo "in sospeso" qui è sbagliato secondo me a causa di ciò.
Richard Le Mesurier,

Risposte:


380

L'accesso / dati / app è possibile senza il permesso di root; le autorizzazioni su quella directory sono rwxrwx - x. Esegui l'autorizzazione su una directory significa che puoi accedervi, tuttavia la mancanza dell'autorizzazione di lettura significa che non puoi ottenere un elenco dei suoi contenuti, quindi per accedervi devi conoscere il nome del file a cui accederai. Il gestore pacchetti di Android ti dirà il nome dell'apk memorizzato per un determinato pacchetto.

Per fare ciò dalla riga di comando, utilizzare adb shell pm list packagesper ottenere l'elenco dei pacchetti installati e trovare il pacchetto desiderato.

Con il nome del pacchetto, possiamo ottenere il nome file effettivo e la posizione dell'APK usando adb shell pm path your-package-name.

E conoscendo la directory completa, possiamo finalmente estrarre l'adb usando adb pull full/directory/of/the.apk

Ringraziamo @tarn per aver sottolineato che sotto Lollipop, sarà il percorso apk /data/app/your-package-name-1/base.apk


33
Per fare ciò dalla riga di comando, utilizzare adb shell pm list packagesper ottenere l'elenco dei pacchetti installati, selezionare il pacchetto desiderato, aggiungerlo -1.apkad esso ed estrarlo /data/app. Esempio: se il nome del pacchetto è org.mozilla.firefox, utilizzare adb pull /data/app/org.mozilla.firefox-1.apk.
sschuberth,

11
Per ottenere il nome file effettivo dell'APK, utilizzare adb shell pm path your-package-name. Vedi questa domanda per una risposta più dettagliata stackoverflow.com/questions/4032960/…
Yojimbo,

2
per lecca-lecca il percorso apk sarà /data/app/your-package-name-1/base.apk
tarn,

Questo non funziona per me. Ottengo il seguente errore:adb: error: remote object '/data/app/com.Slack-1/base.apk' does not exist
0xcaff l'

1
@ 0xcaff Android è cambiato parecchio nei 5 anni da quando è stata fornita questa risposta; forse questo percorso è uno di quei cambiamenti. Dovresti essere in grado di accedere e individuare il file manualmente per trovare il percorso appropriato per la tua versione del sistema operativo.
Mah,

55

Android aggiunge un numero progressivo al nome del pacchetto per produrre il nome del file APK finale (è possibile che ciò vari con la versione del sistema operativo Android). La seguente sequenza di comandi funziona su un dispositivo non rootato :

  1. Ottieni il nome percorso completo del file APK per il pacchetto desiderato.

    adb shell pm path com.example.someapp

    Questo dà l'uscita come: package:/data/app/com.example.someapp-2.apk.

  2. Estrarre il file APK dal dispositivo Android nella casella di sviluppo.

    adb pull /data/app/com.example.someapp-2.apk

La posizione dell'APK dopo aver tirato con successo sarà su ../sdk/platform-tools/base.apk sul tuo PC / laptop.


4
Può confermare che questa soluzione ha funzionato su un dispositivo non rootato, anche se richiede la conoscenza del nome del pacchetto prima del primo comando! Usa 'adb shell pm list pacchetti' per ottenere un elenco di tutti i pacchetti sul telefono nel caso in cui non sei sicuro del nome del pacchetto dell'app desiderata
AndroidNoob,

In quale cartella si trova l'apk sul computer locale del puller? EDIT: nvm, qualunque sia la directory in cui ti trovavi quando facevi il pull adb ...
Adam Johns

@IgorGanapolsky prova a utilizzare adb pull /data/app/com.example.someapp-2/base.apk
Chris - Jr

@zelanix dopo aver fatto pull adb, dove posso c il file .apk. Grazie
Vijaya Varma Lanke,

21

Non hai bisogno delle autorizzazioni ROOT per ottenere l'elenco delle app installate.

Puoi farlo con Android PackageManager.

Di seguito è riportato un piccolo frammento di codice.

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages =  pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Apk file path:" + packageInfo.sourceDir);
}

7
  1. controlla l'elenco degli apk installati (il seguente comando elenca anche il percorso in cui è installato e il nome del pacchetto). adb shell pm lista pacchetti -f
  2. usa adb pull / package_path / nome_pacchetto / path_in_pc (percorso del pacchetto e nome del pacchetto si può ottenere dal comando 1. sopra)

6

Quando hai installato Eclipse per sviluppo Android:

  • Usa il tuo dispositivo come dispositivo di debug. Sul telefono: Impostazioni> Applicazioni> Sviluppo e abilita debug USB, vedere http://developer.android.com/tools/device.html
  • In Eclipse, apri la finestra DDMS: Finestra> Apri prospettiva> Altro ...> DDMS, vedi http://developer.android.com/tools/debugging/ddms.html
  • Se non riesci a vedere il tuo dispositivo prova a (ri) installare il driver USB per il tuo dispositivo
  • Nel riquadro centrale selezionare la scheda "Esplora file" e andare su sistema> app
  • Ora puoi selezionare uno o più file e quindi fare clic sull'icona "Estrai un file dal dispositivo" in alto (a destra nelle schede)
  • Seleziona la cartella di destinazione - tada!

Ci sono solo app di sistema (ovvero app preinstallate) in / system / app.
arne.jans,

6

Su Nougat (7.0) Versione Android eseguita adb shell pm list packagesper elencare i pacchetti installati sul dispositivo. Quindi corri adb shell pm path your-package-nameper mostrare il percorso dell'apk. Dopo aver usato adb per copiare il pacchetto in Download adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download. Quindi esegui l'apk da Download sul tuo computer eseguendo adb pull /storage/emulated/0/Download/base.apk.


2

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

Elenco PackageManager.getInstalledApplications () fornisce un elenco delle applicazioni installate e ApplicationInfo.sourceDir è il percorso del file .apk.

// in oncreate
   PackageManager pm = getPackageManager(); 
   for (ApplicationInfo app : pm.getInstalledApplications(0)) {
 Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
 }

//output is something like
D/PackageList(5010): package: com.example.xmlparse, sourceDir: /data/app   /com.example.xmlparse-2.apk
D/PackageList(5010): package: com.examples.android.calendar, sourceDir: /data/app/com.examples.android.calendar-2.apk
D/PackageList(5010): package: com.facebook.katana, sourceDir: /data/app/com.facebook.katana-1.apk
D/PackageList(5010): package: com.facebook.samples.profilepicture, sourceDir: /data/app/com.facebook.samples.profilepicture-1.apk
D/PackageList(5010): package: com.facebook.samples.sessionlogin, sourceDir: /data/app/com.facebook.samples.sessionlogin-1.apk
D/PackageList(5010): package: com.fitworld, sourceDir: /data/app/com.fitworld-2.apk
D/PackageList(5010): package: com.flipkart.android, sourceDir: /data/app/com.flipkart.android-1.apk
D/PackageList(5010): package: com.fmm.dm, sourceDir: /system/app/FmmDM.apk
D/PackageList(5010): package: com.fmm.ds, sourceDir: /system/app/FmmDS.apk

0

Ho trovato un modo per ottenere il nome del pacchetto dell'APK in un dispositivo non root. non è così elegante, ma funziona sempre.

Passaggio 1 : sul dispositivo, apri l'APK di destinazione

Passaggio 2 : nella finestra cmd del PC, digitare questi comandi:

 adb shell dumpsys activity a > dump.txt

poiché l'output di questo comando è numeroso, si consiglia di reindirizzare a un file.

Passaggio 3 : apri questo file dump.txt con qualsiasi editor.

per dispositivo prima di Android 4.4:
l'inizio del file sarebbe simile al seguente:

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
  Main stack:  
  * TaskRecord{41aa9ed0 #4 A com.tencent.mm U 0}  
    numActivities=1 rootWasReset=true userId=0  
    affinity=com.tencent.mm  
    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.tencent.mm/.ui.LauncherUI}  
    realActivity=com.tencent.mm/.ui.LauncherUI  
    askedCompatMode=false  
    lastThumbnail=null lastDescription=null  
    lastActiveTime=19915965 (inactive for 10s)  
    * Hist #9: ActivityRecord{41ba1a30 u0 com.tencent.mm/.ui.LauncherUI}  
        packageName=com.tencent.mm processName=com.tencent.mm 

il nome del pacchetto è nella terza riga, com.tencent.mm per questo esempio.

per Android 4.4 e
versioni successive: l'output di dumpsys è leggermente cambiato. prova a cercare "Stack # 1", il nome del pacchetto sarebbe molto vicino sotto di esso.

Inoltre, cerca "baseDir", troverai il percorso completo del file apk!


-1

Apri ES explorer -> premi il pulsante Menu nell'angolo in alto a sinistra (tre strisce orizzontali) -> nella sezione Librerie scegli APP.

Quindi, ottieni l'elenco di tutte le app utente. Trova la tua app e selezionala con una lunga pressione su di essa. Quindi premere "Altro" nell'angolo in basso a destra e scegliere "Invia". Quindi puoi utilizzare diverse opzioni, ad esempio puoi scegliere "ES Salva in" per salvare il file .apk nella tua home directory o in qualsiasi altro luogo.


-2

Oppure puoi ottenere "Bluetooth File Transfer" da Google Play e impostare la cartella home su /system/. Quindi puoi persino andare a /.

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.