Perché ottengo l'accesso negato alla cartella dei dati quando utilizzo adb?


181

Mi sono connesso al mio dispositivo live usando l'adb e i seguenti comandi:

C:\>adb -s HT829GZ52000 shell
$ ls
ls
sqlite_stmt_journals
cache
sdcard
etc
system
sys
sbin
proc
logo.rle
init.trout.rc
init.rc
init.goldfish.rc
init
default.prop
data
root
dev
$ cd data
cd data
$ ls
ls
opendir failed, Permission denied

Sono stato sorpreso di vedere che ho negato l'accesso. Come mai non riesco a sfogliare le directory usando la riga di comando in questo modo?

Come posso ottenere l'accesso come root sul mio telefono?


Semplice ... assicurati che lo schermo del tuo telefono sia acceso. Fai clic su "Consenti" quando ti viene chiesto se desideri che Unknown abbia accesso al root. Fatto.

deciso di creare un semplice avd per avere accesso al database. Qualcuno ha collegamenti a guide, senza bagliori e grafica "personalizzati" per gli sviluppatori? Proprio come ottenere un semplice Android vaniglia su un dispositivo acquistato.
bg,

Nessuna richiesta simile si verifica sul mio dispositivo Android 7.1.1. Ma adb va avanti ed elenca i contenuti della directory. Il problema è che i contenuti in realtà non esistono. Sto usando adb-sync per aggiungere contenuti. È abbastanza strano.
Tom Russell,

Risposte:


139

Ci sono due cose da ricordare se vuoi sfogliare tutto sul tuo dispositivo.

  1. È necessario disporre di un telefono con accesso root per poter navigare nella cartella dei dati su un telefono Android. Ciò significa che hai un dispositivo sviluppatore ( ADP1 o uno ION di Google I / O) o hai trovato un modo per "rootare" il tuo telefono in qualche altro modo.
  2. Devi eseguire ADB in modalità root, eseguilo eseguendo: adb root

77
E "adb root" richiede una build personalizzata di adb, altrimenti "adbd non può essere eseguito come root nelle build di produzione"
bortzmeyer,

16
build personalizzata di adb? da dove posso ottenerlo?
Gopinath,

9
qualche risposta alla domanda @Gopinath?
Ewoks,

2
@Gopinath: credo che tu debba costruirlo dal sorgente per il dispositivo di destinazione, configurato per consentire il root usando l'ndk e poi farlo flash sul dispositivo insieme a un'immagine dei file binari.
Ben Jaguar Marshall,

4
AFAIK, non è necessario avere una build personalizzata di adb. È necessario disporre del supporto per adbd in esecuzione come root, ma questo adbd è sul dispositivo, quindi è sufficiente qualsiasi modifica apportata per rendere il dispositivo con accesso root.
nitzanms,

222

A partire dal livello API 8 (Android 2.2), per l'applicazione di debug (quella creata da Android Studio tutte le volte a meno che non sia stata richiesta la build di rilascio), è possibile utilizzare il run-ascomando shell per eseguire un comando o un eseguibile come utente / applicazione specifici o passa semplicemente all'UID della tua applicazione in modo da poter accedere alla sua directory di dati .

Elenca il contenuto della directory di yourapp:

run-as com.yourapp ls -l /data/data/com.yourapp

Passa all'UID di com.yourapp ed esegui tutti gli altri comandi utilizzando quell'uid (fino a quando non chiami exit):

run-as com.yourapp
cd /data/data/com.yourapp
ls -l
exit

 
Nota 1 : esiste un problema noto con alcuni telefoni HTC Desire. A causa di un proprietario / autorizzazioni non standard della /data/datadirectory, il run-ascomando non può essere eseguito su quei telefoni.

Nota 2 : Come sottolineato nei commenti di @Avio: run-asha problemi anche con i telefoni Samsung Galaxy S che eseguono Cyanogenmod in qualsiasi versione (dalla 7 alla 10.1) perché su questa piattaforma /data/dataè presente un link simbolico a /datadata. Un modo per risolvere il problema è sostituire il collegamento simbolico con la directory effettiva (sfortunatamente ciò richiede in genere l'accesso root).


2
Funziona come hai spiegato dove ti trovi run-as com.mypackage. Il problema che ho sqlite3 /data/data/com.mypackage/databases/mydbriscontrato è "sqlite3: permesso negato". Sqlite3 può essere eseguito solo da root?
Styfle

5
Funziona in modo affascinante quando si tratta di elencare i file memorizzati nella memoria interna.
zaplec,

5
Ho dovuto modificare i permessi sul file per poterlo spostare sulla mia sdcard, perché non potevo farlo funzionare come la mia applicazione. Quindi, 1) run-as com.package.example, chmod 777 databasefile.db. 2) esci, vai su sdcard, cp /data/data/com.package.example/database/databasefile.db. E il passaggio 3 dovrebbe ripristinare le autorizzazioni 777
Maragues,

3
Il mio pacco è sconosciuto, non importa quanto lo scrivo correttamente nel mio terminale: (
Costa

3
Questa dovrebbe essere la risposta contrassegnata come corretta poiché questo è il metodo giusto da usare per i telefoni non rootati.
LNI,

49

prima di iniziare, hai un telefono rootato ? in caso contrario, consiglio vivamente che è ora di fare il salto. Il 99% dei tutorial che ti aiutano a fare questo richiede che tu abbia un telefono rootato (lo so b / c ho trascorso circa un'ora a cercare un modo per farlo senza avere un telefono rootato .. non riuscivo a trovare .. ) anche se ci pensi, anche il tuo iPhone deve essere rootato per fare lo stesso compito. Quindi è assolutamente ragionevole. Ulteriori informazioni sul rooting alla fine della risposta.

dal tuo tipo di riga di comando:

adb shell

questo ti porta alla tua riga di comando della shell android (dovresti vedere qualcosa del genere: shell@android:/ $ora digita:

shell@android:/ $run-as com.domain.yourapp

questo dovrebbe portarti direttamente alla directory dei dati di com.domain.yourapp:

shell@android:/data/data/com.domain.yourapp $ 

in caso contrario (ad esempio se si verifica un errore), probabilmente non si dispone di un telefono rootato o non si sono utilizzati i privilegi dell'utente root. Per usare i tuoi privilegi di utente root, digita sunella riga di comando adb e vedi cosa succede, se ricevi un errore, allora il tuo telefono non è rootato. In caso contrario, eseguirne il root prima di continuare quindi queste istruzioni.

da lì puoi digitare lse vedrai tutte le directory incluso il dbs:

shell@android:/data/data/com.domain.yourapp $ ls

cache
databases
lib
shared_prefs   

dopodiché puoi usare sqlite3 per sfogliare il dbase .. se non lo hai installato (puoi scoprirlo digitando sqlite3, se lo ottieni command not foundallora dovrai installarlo. Per installare sqlite, segui le istruzioni qui .

sul rooting: se non hai mai effettuato il root del tuo telefono prima, e sei preoccupato per averlo fregato, posso dirti con piena fiducia che non c'è nulla di cui preoccuparsi. ci sono tonnellate di tutorial di rooting del telefono facili e veloci per praticamente tutti i modelli vecchi e nuovi là fuori, e puoi eseguire il root del tuo telefono anche se hai un Mac (ho rootato il mio s3 con il mio Mac).


8
Non hai bisogno di un telefono rootato per run-asfunzionare. L'ho appena provato su un Galaxy Nexus S. costruito in produzione
Ted Hopp il

@TedHopp e così b / c funziona perfettamente sul tuo Galaxy Nexus S di produzione .. funzionerà perfettamente su tutti i telefoni Android giusto?
circa

Innanzitutto, il mio telefono è un controesempio che mostra che non è necessario un telefono con root . In secondo luogo, sì, dovrebbe funzionare su tutti i dispositivi non rootati che sono almeno Android 2.2 (non perché funziona sul mio telefono, ma perché è così che dovrebbe funzionare; vedi la risposta di Idolon ).
Ted Hopp,

@TedHopp personalmente non sono uno sviluppatore Android .. e quindi istruzioni come build the application as debuggable (either by building it with the Eclipse, or ant debug command)queste potrebbero sembrare banali per te, ma mi intimidiscono. Immagino che la mia risposta sia più per le persone che si sentono a proprio agio con il rooting dei loro telefoni Android, ma che non sono esperti nel mondo degli sviluppatori Android. Ma sono contento di avere questa discussione .. Voglio che i lettori della mia risposta siano consapevoli delle altre alternative non
radicali

1
Grande risposta amico. Sto usando alcuni telefoni diversi qui (MotoX, nexus4, LG G3, SGIII) e questo è abbastanza buono per tutti.
Chad Bingham,

45

$ adb shell

$ cd / dati

$ ls

apertura fallita, autorizzazione negata


Dovresti fare questo:

$ adb shell

$ cd /data

shell@android:/data $ run-as com.your.package 

shell@android:/data/data/com.your.package $ ls

OK!


Questo funziona! Un paio di cose da fare prima di eseguire qualsiasi comando. Una volta abilitate le opzioni dello sviluppatore sul telefono, dovremmo anche abilitare il debug USB . Ho anche abilitato qualcosa sul mio telefono (HTC M8) chiamato Seleziona app di debug e ho scelto la mia app. Potrebbe essere standard su tutti i telefoni ... dovrebbe essere.
srinij,

30

Ho avuto un problema simile durante il tentativo di operare su un Samsung Galaxy S. con root Eseguendo un comando dalla shell del computer

> adb root

non riesce con un messaggio "impossibile eseguire come root nelle build di produzione". Ecco un metodo semplice che consente di diventare root.

Invece del precedente, emetti i seguenti due comandi uno dopo l'altro

> adb shell
$ su

Dopo il primo comando, se il prompt è cambiato da '>' a '$' come mostrato sopra, significa che è stato inserito l'ambiente della shell adb. Se successivamente il prompt è cambiato in '#' dopo aver emesso il secondo comando, significa che ora sei root. Ora, come root, puoi fare tutto ciò che vuoi con il tuo dispositivo.

Per tornare alla shell "sicura", rilasciare

# exit

Vedrai che riappare il prompt '$', il che significa che sei nella shell adb come utente e non come root.


13
su: permesso negato
petrnohejl,

3
Fantastico grazie! A proposito, devi avere un telefono rootato per farlo. Potresti anche aver bisogno di SuperSU o qualcosa di simile? Almeno quando ho provato a usare "su" SuperSU mi ha dato una finestra di dialogo sul mio telefono.
Richard Fung,

16
/ system / bin / sh: su: non trovato
matt lohkamp

1
Grazie :) il adb shell + surisolto fastidioso permesso per sempre. Ho avuto un problema su: not foundsu Android 4.3 ma da quando sono passato al 4.4.2 il problema è scomparso. 4.3 sembra avere problemi.

3
su non è disponibile per me, Nexus 5 / Android 5.1 - esiste una soluzione alternativa?
CodeManX

19

Ho avuto molti problemi anche con questo. Continuo a non comprendere appieno l'autorizzazione e l'esecuzione root, ma questo ha funzionato per me (una delle risposte precedenti in parte) per copiare il file di database da / data / data / [nome pacchetto] /database/my_db.db. L'esecuzione di shell root o su in shell per qualche motivo non ha funzionato, né ha copiato il file db (potrei navigare nella directory però), né sqlite3 .

Quindi ha funzionato! Nel prompt dei comandi DOS:

C:\Program Files\Android\android-sdk\platform-tools>adb shell
1|shell@android:/ $ run-as de.vogella.android.locationapi.maps
run-as de.vogella.android.locationapi.maps
1|shell@android:/data/data/de.vogella.android.locationapi.maps $ cd /data
cd /data
shell@android:/data $ cd data
cd data
shell@android:/data/data $ cd de.vogella.android.locationapi.maps
cd de.vogella.android.locationapi.maps
shell@android:/data/data/de.vogella.android.locationapi.maps $ cd databases
cd databases
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ ls
ls
bus_timetable_lines.db
bus_timetable_lines.db-journal
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ cat bus
_timetable_lines.db > /sdcard/db_copy.db
 bus_timetable_lines.db > /sdcard/db_copy.db                                   <
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $exit   ^
exit
shell@android:/ $ exit
exit

C:\Program Files\Android\android-sdk\platform-tools>

Ora vai alla directory SDCARD e ottieni il tuo file db_copy.db. Anche quello era nascosto, ma sono riuscito a inviarlo via email. Di nuovo in Windows, sono stato in grado di aprire il file db con SQLite Database Browser. :)


Ho provato -> run-as <app_package_name> Ma l'adb non ha riconosciuto il mio app_package_name. Ho usato il nome_pacchetto che ho specificato nel mio AndroidManifest.xml. C'è qualcosa che mi manca?
ARK,

3

Di seguito sono riportati i due passaggi per ottenere l'accesso come root:

  1. I tuoi dispositivi Android devono essere rootati.
  2. Nella shell ADB, digitare su e il dispositivo Android richiederà y / n? Scegliete consenti.

digitare su .. darà un prompt sul dispositivo mobile .. chiedendo l'autorizzazione super tramite Superuser .. ha funzionato
Mahajan344

2

le build di produzione non possono inserire / data / app

drwxrwx--- system   cache             1970-01-01 08:00 cache
drwxrwxr-x root     system            1970-01-01 08:00 mnt 
drwxrwx--x system   system            1970-01-01 08:15 data

potrebbe essere necessario cambiare il proprietario giusto per gestirlo.


2

Il problema potrebbe essere che dobbiamo fornire specificamente l'accesso root adb nelle opzioni di sviluppo degli ultimi CM. Ecco cosa ho fatto.

abc @ abc-L655: ~ $ sudo adb kill-server
abc @ abc-L655: ~ $ sudo adb root start-server * daemon non in esecuzione. avviandolo ora sulla porta 5037 * * demone avviato correttamente * l'accesso root è disabilitato dall'impostazione del sistema - abilita nelle impostazioni -> opzioni di sviluppo

dopo aver modificato le opzioni di sviluppo ...

abc@abc-L655:~$ sudo adb kill-server
abc@abc-L655:~$ sudo adb root start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
restarting adbd as root
abc@abc-L655:~$ adb shell
root@android:/ # ls /data/ .... good to go.. 

1

se conosci il pacchetto dell'applicazione puoi cddirettamente in quella cartella ..

per esempio cd data/data/com.yourapp

questo ti farà cadere in una directory che è read/writablecosì puoi cambiare i file secondo necessità. Poiché la cartella è la stessa sul emulator, è possibile utilizzarla per ottenere il percorso della cartella.


2
Posso eseguire il cd direttamente nella cartella, ma visualizzo ancora l'errore "Impossibile aprire, autorizzazione negata".
Tyler Collier,

Questo perché l'utente "shell" di adb ha i permessi di esecuzione sulle directory, ma non i permessi di lettura.
Chris Stratton,

0

Se vuoi solo vedere il tuo DB e le tue tabelle, il modo più semplice è usare Stetho. Strumento abbastanza interessante per ogni sviluppatore Android che utilizza SQLitebuit by Facobook developed.

Steps to use the tool

  1. Aggiungi sotto dependeccy nel file gradle della tua applicazione (Modulo: app)

'compile' com.facebook.stetho: stetho: 1.4.2 '

  1. Aggiungi sotto le righe di codice nel tuo metodo Activity onCreate ()
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 }

Ora, crea la tua applicazione e quando l'app è in esecuzione, puoi sfogliare il database dell'app, aprendo chrome nell'URL:

chrome://inspect/#devices

Schermate delle stesse sono come sotto_

ChromeInspact

ChromeInspact

Il tuo DB

Il tuo DB

Spero che questo possa aiutare a tutti! :)


0

Funziona se il tuo dispositivo Android è rootato con qualsiasi mezzo (non sono sicuro che funzioni per non root).

  1. adb shell - accedere alla shell
  2. su - diventa il superutente.

Ora puoi leggere tutti i file in tutte le directory.


-3

senza eseguire il root del dispositivo è possibile accedere ai file tramite il seguente screenshot di cmd:

  1. avvia l'adb usando cmd dalla cartella platform-tools in base al tuo utente

    cd C:\Users\YourUserName\AppData\Local\Android\sdk\platform-tools

    può trovarsi in un'altra cartella a seconda di dove è stato installato.

  2. visualizzare i dispositivi funzionanti.

    adb devices

    per esempio la risposta del comando è

    List of devices attached
    0123456789ABCDEF     device
  3. scrivi il comando

        adb -s 0123456789ABCDEF shell "su"

    si aprirà

        root@theDeviceName:/ #

4. Accesso ai file, elencare tutti i file

ls

e così via cambia directory in qualsiasi altro posto come la cartella dati

cd data/data

1
C: \ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> adb -s emulator-5554 shell "su" / system / bin / sh: su: non trovato
Solo il

nel mio caso era Android 5.0.2 non so se differisce da una versione all'altra @Koen
Mahmoud Ashraf

il percorso dipende da dove hai installato Android Studio e dai suoi SDK @Solo
Mahmoud Ashraf,

1
Il problema non è trovare dove si trova adb. È nel mio PERCORSO. Ottenere l'elenco dei file (o persino eseguirli su) non funziona / non è permesso. Test con Android 4.3.
Koen,

su non è stato trovato
Brill Pappin,

-5

Quando ci si trova nella directory della shell per il dispositivo. Corri

su - root

Quindi dovresti essere in grado di accedere ai dati / alla cartella.

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.