Dlaczego dostaję odmowę dostępu do folderu danych podczas korzystania z adb?


181

Połączyłem się z moim urządzeniem na żywo za pomocą adb i następujących poleceń:

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

Byłem zaskoczony, widząc, że odmówiłem dostępu. Dlaczego nie mogę przeglądać katalogów za pomocą takiego wiersza poleceń?

Jak uzyskać dostęp do konta root na moim telefonie?


Proste ... upewnij się, że ekran telefonu jest włączony. Kliknij „Zezwól”, gdy pojawi się pytanie, czy chcesz, aby Nieznany miał dostęp do roota. Gotowe.

postanowiłem stworzyć prosty avd, aby mieć dostęp do bazy danych. Czy ktoś ma jakieś linki do przewodników, bez „niestandardowego” rozszerzenia i grafiki dla programistów? Jak zdobyć zwykłego waniliowego Androida na zakupionym urządzeniu.
bgs

Żaden taki monit nie występuje na moim urządzeniu z Androidem 7.1.1. Ale adb idzie naprzód i wyświetla zawartość katalogu. Problem w tym, że zawartość tak naprawdę nie istnieje. Korzystam z adb-sync, aby dodać zawartość. To dość dziwne.
Tom Russell

Odpowiedzi:


139

Są dwie rzeczy do zapamiętania, jeśli chcesz przeglądać wszystko na swoim urządzeniu.

  1. Musisz mieć telefon z dostępem do konta root, aby przeglądać folder danych na telefonie z Androidem. Oznacza to, że masz urządzenie programistyczne ( ADP1 lub ION z Google I / O) lub znalazłeś sposób na „zrootowanie” telefonu w inny sposób.
  2. Musisz uruchomić ADB w trybie root, zrób to, wykonując: adb root

77
A „adb root” wymaga niestandardowej kompilacji adb, w przeciwnym razie „adbd nie będzie działał jako root w kompilacjach produkcyjnych”
bortzmeyer 31.01.11

16
niestandardowa kompilacja adb? skąd mogę to wziąć?
Gopinath

9
jakaś odpowiedź na pytanie @Gopinath?
Ewoks

2
@Gopinath: Uważam, że musisz zbudować go ze źródła dla urządzenia docelowego, skonfigurowanego tak, aby umożliwić rootowi używanie ndk, a następnie flashowanie go na urządzeniu wraz z obrazem plików binarnych.
Ben Jaguar Marshall,

4
AFAIK, nie ma potrzeby posiadania niestandardowej wersji adb. Konieczne jest, aby obsługa adbd działała jako root, ale ta adbd jest na urządzeniu - więc jakakolwiek modyfikacja, aby urządzenie miało dostęp do roota, wystarczy.
nitzanms

222

Począwszy od poziomu API 8 (Android 2.2), w przypadku aplikacji do debugowania (tej zbudowanej cały czas przez Android Studio, chyba że zażądano kompilacji wersji), możesz użyć run-aspolecenia powłoki, aby uruchomić polecenie lub plik wykonywalny jako określony użytkownik / aplikacja lub po prostu przełącz się na identyfikator UID aplikacji, aby uzyskać dostęp do katalogu danych .

Wyświetl zawartość katalogu swojej aplikacji:

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

Przełącz się na identyfikator UID aplikacji com.yourapp i uruchom wszystkie dalsze polecenia, używając tego identyfikatora użytkownika (aż do wywołania exit):

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

 
Uwaga 1 : znany problem dotyczy niektórych telefonów HTC Desire. Z powodu niestandardowego właściciela / uprawnień do /data/datakatalogu run-aspolecenie nie działa na tych telefonach.

Uwaga 2 : Jak wskazano w komentarzach @Avio: run-asma również problemy z telefonami Samsung Galaxy S z systemem Cyanogenmod w dowolnej wersji (od 7 do 10.1), ponieważ na tej platformie /data/datajest dowiązanie symboliczne /datadata. Jednym ze sposobów rozwiązania tego problemu jest zastąpienie dowiązania symbolicznego właściwym katalogiem (niestety zwykle wymaga to dostępu do konta root).


2
Działa to tak, jak wyjaśniłeś, gdzie jesteś run-as com.mypackage. Problem, na który wpadłem, to sqlite3 /data/data/com.mypackage/databases/mydb„sqlite3: odmowa uprawnień”. Czy sqlite3 może być uruchamiany tylko przez root?
styfle

5
Działa jak urok, jeśli chodzi o wyświetlanie listy plików przechowywanych w pamięci wewnętrznej.
zaplec

5
Musiałem zmienić uprawnienia do pliku, aby móc go przenieść na moją kartę SD, ponieważ nie mogłem go uruchomić jako mojej aplikacji. 1) run-as com.package.example, chmod 777 databasefile.db. 2) zamknij, przejdź do sdcard, cp /data/data/com.package.example/databases/databasefile.db. Krok 3 powinien polegać na
cofnięciu

3
Moja paczka jest nieznana, bez względu na to, jak poprawnie przeliterowałem ją w moim terminalu: (
Costa

3
Powinna to być odpowiedź oznaczona jako poprawna, ponieważ jest to właściwa metoda do zastosowania w przypadku niezrootowanych telefonów.
LNI

49

zanim zaczniemy, czy masz zrootowany telefon? jeśli nie, zdecydowanie sugeruję, że czas wykonać skok. 99% samouczków, które pomogą ci to zrobić, wymaga posiadania zrootowanego telefonu (wiem, że b / c spędziłem około godziny na poszukiwaniu sposobu na zrobienie tego bez posiadania zrootowanego telefonu ... nie mogłem znaleźć żadnego ... ) także, jeśli się nad tym zastanowić, Twój iPhone musi być również zrootowany, aby wykonać to samo zadanie. To jest całkowicie rozsądne. Więcej o rootowaniu na końcu odpowiedzi.

z typu wiersza poleceń:

adb shell

to przeniesie Cię do linii poleceń powłoki Androida (powinieneś zobaczyć coś takiego: shell@android:/ $teraz wpisz:

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

powinno to zabrać Cię bezpośrednio do katalogu danych com.domain.yourapp:

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

jeśli nie (tj. jeśli pojawi się błąd), prawdopodobnie nie masz zrootowanego telefonu lub nie korzystałeś z uprawnień użytkownika root. Aby skorzystać z uprawnień użytkownika root, wpisz suw wierszu polecenia adb i zobacz, co się stanie, jeśli wystąpi błąd, telefon nie jest zrootowany. Jeśli nie, najpierw zrootuj, a następnie kontynuuj te instrukcje.

stamtąd możesz wpisać, lsa zobaczysz wszystkie katalogi, w tym dbs:

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

cache
databases
lib
shared_prefs   

potem możesz użyć narzędzia sqlite3 do przeglądania bazy danych. Jeśli nie masz go zainstalowanego (możesz go znaleźć, pisząc sqlite3, jeśli go otrzymasz command not found, musisz go zainstalować. Aby zainstalować program sqlite, postępuj zgodnie z instrukcjami tutaj .

na temat rootowania: jeśli nigdy wcześniej nie zrootowałeś swojego telefonu i martwisz się, że to zepsuje telefon, mogę z całą pewnością powiedzieć, że nie ma się czym martwić. istnieją tony szybkich i łatwych samouczków rootowania telefonu dla prawie wszystkich nowych i starych modeli, i możesz zrootować swój telefon, nawet jeśli masz komputer Mac (zrootowałem mój s3 na moim Macu).


8
Do pracy nie potrzebujesz zrootowanego telefonu run-as. Właśnie wypróbowałem to na produkcyjnej wersji Galaxy Nexus S.
Ted Hopp,

@TedHopp i tak b / c działa dobrze na produkcyjnej wersji Galaxy Nexus S. .. będzie działać dobrze na wszystkich telefonach z Androidem, prawda?
abbood

Po pierwsze, mój telefon jest kontrprzykładem, który pokazuje, że zrootowany telefon nie jest wymagany . Po drugie, tak, powinien działać na wszystkich nierootowanych urządzeniach, które mają przynajmniej system Android 2.2 (nie dlatego, że działa na moim telefonie, ale dlatego, że tak to powinno działać; zobacz odpowiedź Idolon ).
Ted Hopp

@ TedHopp osobiście nie jestem zbytnio programistą Androida .. więc instrukcje takie build the application as debuggable (either by building it with the Eclipse, or ant debug command)mogą wydawać się trywialne, ale trochę mnie zastraszają. Wydaje mi się, że moja odpowiedź jest bardziej dla ludzi, którzy czują się dobrze w rootowaniu swoich telefonów z Androidem, ale nie są dobrze zaznajomieni ze światem deweloperów Androida. Ale cieszę się, że prowadzimy tę dyskusję. Chcę, aby czytelnicy mojej odpowiedzi byli świadomi innych alternatywnych rozwiązań
root

1
Świetna odpowiedź człowieku. Używam tutaj kilku różnych telefonów (MotoX, nexus4, LG G3, SGIII) i jest to całkiem dobre dla wszystkich.
Chad Bingham

44

$ adb shell

$ cd / data

$ ls

opendir nie powiodło się, odmowa dostępu


Powinieneś to zrobić:

$ adb shell

$ cd /data

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

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

DOBRZE!


To działa! Przed wykonaniem jakichkolwiek poleceń należy wykonać kilka czynności. Po włączeniu opcji programistycznych w telefonie będziemy również musieli włączyć debugowanie USB . Dodatkowo włączyłem też w telefonie coś (HTC M8) o nazwie Wybierz aplikację do debugowania i wybrałem aplikację. Może być standardem we wszystkich telefonach ... powinno być.
srinij

30

Miałem podobny problem podczas próby działania na zrootowanym Samsungu Galaxy S. Wydawanie polecenia z powłoki komputera

> adb root

kończy się niepowodzeniem z komunikatem „nie można uruchomić jako root w kompilacjach produkcyjnych”. Oto prosta metoda, która pozwala na rootowanie.

Zamiast poprzedniego wydawaj następujące dwa polecenia jeden po drugim

> adb shell
$ su

Po pierwszym poleceniu, jeśli monit zmienił się z „>” na „$”, jak pokazano powyżej, oznacza to, że wszedłeś do środowiska powłoki adb. Jeśli następnie monit zmienił się na „#” po wydaniu drugiego polecenia, oznacza to, że jesteś teraz rootem. Teraz, jako root, możesz robić z urządzeniem wszystko, co chcesz.

Aby wrócić do „bezpiecznej” powłoki, wydaj

# exit

Zobaczysz, że ponownie pojawia się monit „$”, co oznacza, że ​​jesteś w powłoce adb jako użytkownik, a nie jako root.


13
su: odmowa zezwolenia
petrnohejl

3
Wielkie dzieki! Aby to zrobić, musisz mieć zrootowany telefon. Możesz także potrzebować SuperSU lub czegoś podobnego? Przynajmniej kiedy próbowałem użyć „su” SuperSU dało mi okno dialogowe na telefonie.
Richard Fung,

16
/ system / bin / sh: su: not found
matt lohkamp

1
Dziękuję :) adb shell + surozwiązane irytujące pozwolenie na zawsze. Miałem problem su: not foundz Androidem 4.3, ale od czasu aktualizacji do 4.4.2 problem zniknął. Wydaje się, że 4.3 ma problemy.

3
su nie jest dla mnie dostępny, Nexus 5 / Android 5.1 - czy istnieje obejście?
CodeManX

19

Miałem też z tym wiele problemów. Nadal nie w pełni rozumiem uprawnienia i uruchomienie roota, ale to zadziałało dla mnie (częściowo jedna z poprzednich odpowiedzi), aby skopiować plik bazy danych z / data / data / [nazwa pakietu] /databases/my_db.db. Uruchamianie powłoki root lub su z powłoki z jakiegoś powodu nie działało, nie kopiowałem pliku db (mogłem jednak przejść do katalogu), ani też sqlite3 .

To zadziałało! W wierszu polecenia 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>

Teraz przejdź do katalogu SDCARD i pobierz plik db_copy.db. Nawet to było ukryte, ale udało mi się to wysłać pocztą e-mail. W systemie Windows mogłem otworzyć plik db za pomocą przeglądarki SQLite Database Browser. :)


Próbowałem -> run-as <nazwa_pakietu_aplikacji> Ale adb nie rozpoznał mojej nazwy_pakietu aplikacji. Użyłem nazwy paczki określonej w pliku AndroidManifest.xml. Czy czegoś brakuje?
ARK

3

Oto dwa kroki, aby uzyskać dostęp do roota:

  1. Twoje urządzenia z Androidem muszą być zrootowane.
  2. W powłoce ADB wpisz su, a urządzenie z Androidem wyświetli monit tak / nie? Ty wybierasz zezwolenie.

wpisz su .. wyświetli monit na urządzeniu mobilnym .. z prośbą o super pozwolenie za pośrednictwem Superuser .. zadziałało
Mahajan344

2

kompilacje produkcyjne nie mogą wejść / danych / aplikacji

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

może potrzebować zmiany odpowiedniego właściciela, aby móc z niego korzystać.


2

Problemem może być to, że musimy specjalnie dać dostęp do katalogu głównego adb w opcjach programistycznych najnowszych CM. Oto co zrobiłem.

abc @ abc-L655: ~ $ sudo adb kill-server
abc @ abc-L655: ~ $ sudo adb root start-server * demon nie działa. uruchamianie teraz na porcie 5037 * * demon uruchomił się pomyślnie * dostęp do katalogu głównego jest wyłączony przez ustawienie systemowe - włącz w ustawieniach -> opcje programowania

po zmianie opcji programistycznych ...

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

jeśli znasz pakiet aplikacji, możesz cdbezpośrednio przejść do tego folderu.

na przykład cd data/data/com.yourapp

spowoduje to przeniesienie Cię do katalogu, w read/writablektórym możesz zmieniać pliki w razie potrzeby. Ponieważ folder jest taki sam emulator, możesz go użyć, aby uzyskać ścieżkę do folderu.


2
Mogę cd bezpośrednio do folderu, ale nadal pojawia się błąd „opendir nie powiodło się, odmowa uprawnień”.
Tyler Collier

Wynika to z faktu, że użytkownik „powłoki” adb ma uprawnienia do wykonywania katalogów, ale nie ma uprawnień do odczytu.
Chris Stratton,

0

Jeśli chcesz tylko zobaczyć swoje DB i tabele, najprostszym sposobem jest użycie Stetho. Całkiem fajne narzędzie dla każdego programisty Androida, który używa SQLitebuit by Facobook developed.

Steps to use the tool

  1. Dodaj poniżej zależności w pliku ocen aplikacji (moduł: aplikacja)

„compile” com.facebook.stetho: stetho: 1.4.2 ”

  1. Dodaj poniższe wiersze kodu do metody Activity onCreate ()
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 }

Teraz skompiluj aplikację. Gdy aplikacja jest uruchomiona, możesz przeglądać bazę danych aplikacji, otwierając chrome w adresie URL:

chrome://inspect/#devices

Zrzuty ekranu tego samego są jak poniżej_

ChromeInspact

ChromeInspact

Twój DB

Twój DB

Mam nadzieję, że to pomoże wszystkim! :)


0

Działa to, jeśli twoje urządzenie z Androidem jest zrootowane w jakikolwiek sposób (nie jestem pewien, czy to działa na nierootowanych).

  1. adb shell - uzyskać dostęp do powłoki
  2. su - zostań superużytkownikiem.

Możesz teraz czytać wszystkie pliki we wszystkich katalogach.


-3

bez rootowania urządzenia możesz uzyskać dostęp do plików, wykonując następujący zrzut ekranu cmd:

  1. uruchom adb za pomocą cmd z folderu platform-tools zgodnie z twoim użytkownikiem

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

    może znajdować się w innym folderze, w zależności od miejsca instalacji.

  2. wyświetlić działające urządzenia.

    adb devices

    na przykład odpowiedzią na to polecenie

    List of devices attached
    0123456789ABCDEF     device
  3. napisz polecenie

        adb -s 0123456789ABCDEF shell "su"

    otworzy się za

        root@theDeviceName:/ #

4.Dostęp do plików, wyświetl listę wszystkich plików

ls

i tak dalej zmień katalog do dowolnego innego miejsca, takiego jak folder danych

cd data/data

1
C: \ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> adb -s emulator-5554 shell "su" / system / bin / sh: su: nie znaleziono
solo

w moim przypadku był to Android 5.0.2 i nie wiem, czy różni się w zależności od wersji @Koen
Mahmoud Ashraf

ścieżka zależy od tego, gdzie zainstalowałeś studio Android i są to zestawy SDK @Solo
Mahmoud Ashraf

1
Problemem nie jest znalezienie gdzie jest adb. Jest w mojej ŚCIEŻCE. Pobieranie listy plików (lub nawet wykonywanie su) nie działa / jest niedozwolone. Testowanie w systemie Android 4.3.
Koen

Nie znaleziono su
Brill Pappin

-5

Gdy jesteś w katalogu powłoki dla urządzenia. Po prostu biegnij

su - root

Następnie powinieneś mieć dostęp do danych / folderu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.