Чому мені під час використання adb мені заборонено доступ до папки даних?


181

Я підключився до свого живого пристрою за допомогою команди adb та наступних команд:

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

Я був здивований, побачивши, що в мені заборонено доступ. Чому я не можу переглядати каталоги, використовуючи такий командний рядок?

Як отримати кореневий доступ до телефону?


Просте ... переконайтесь, що екран вашого телефону увімкнено. Натисніть "Дозволити", коли запитаєте, чи хочете Ви невідомо мати доступ до root. Зроблено.

вирішили створити простий avd, щоб мати доступ до бази даних. Хтось має посилання на посібники, без "користувацьких" спалахів та графіки для розробників? Про те, як отримати звичайний ванільний андроїд на придбаному пристрої.
bgs

На моєму пристрої Android 7.1.1 такого запиту не відбувається. Але adb йде вперед і перераховує вміст каталогу. Проблема в тому, що вміст насправді не існує. Я використовую adb-sync для додавання вмісту. Це досить дивно.
Том Расселл

Відповіді:


139

Якщо ви хочете переглянути все на своєму пристрої, слід пам’ятати дві речі.

  1. Щоб переглядати папку даних на телефоні Android, потрібно мати телефон з кореневим доступом. Це означає, що або у вас є пристрій розробника ( ADP1, або ION від Google I / O), або ви знайшли спосіб «викорінити» телефон іншим способом.
  2. Вам потрібно запустити ADB в кореневому режимі, зробіть це, виконавши: adb root

77
І для "кореня adb" потрібна спеціальна збірка adb, інакше "adbd не може працювати як root у виробництві"
bortzmeyer

16
спеціальна збірка adb? звідки я можу його взяти?
Гопінат

9
будь-яка відповідь на питання @Gopinath?
Ewoks

2
@Gopinath: Я вважаю, що ви повинні створити його з джерела для цільового пристрою, налаштованого на те, щоб дозволити root використовувати ndk, а потім пропустити його на пристрій разом із зображенням бінарних файлів.
Бен Ягуар Маршалл

4
AFAIK, не потрібно мати власну збірку adb. Потрібно мати підтримку adbd як root, але цей adbd є на пристрої - тому будь-яких модифікацій, щоб зробити пристрій мати доступ до кореня, достатньо.
nitzanms

222

Починаючи з рівня 8 API (Android 2.2), для програми, що налагоджується (тієї, яку будував Android Studio весь час, крім випадків, коли вимагали створення версії), ви можете використовувати команду shell run-asдля запуску команди або виконуваного файлу як конкретного користувача / програми або просто переключитися на UID програми, щоб ви мали доступ до каталогу даних .

Список вмісту каталогу yourapp:

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

Перейти на UID- код com.yourapp і запустіть усі подальші команди, використовуючи цей uid (поки ви не зателефонуєте exit):

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

 
Примітка 1 : є відома проблема з деякими телефонами HTC Desire. Через нестандартного власника / дозволів /data/dataкаталогу, run-asкоманда не запускається на цих телефонах.

Примітка 2 : Як зазначається у коментарях @Avio: також run-asє проблеми з телефонами Samsung Galaxy S, які працюють із Cyanogenmod у будь-якій версії (від 7 до 10.1), оскільки на цій платформі /data/dataє посилання на /datadata. Один із способів вирішити проблему - замінити символьне посилання фактичним каталогом (на жаль, для цього зазвичай потрібен кореневий доступ).


2
Це працює так, як ви пояснили, де ви run-as com.mypackage. Проблема, з якою я зіткнувся, sqlite3 /data/data/com.mypackage/databases/mydbговорить "sqlite3: у дозволі відмовлено". Чи може sqlite3 запускатися тільки під коренем?
стайф

5
Діє як шарм, коли йдеться про перелік файлів, що зберігаються у внутрішній пам’яті.
zaplec

5
Мені довелося змінити дозволи на файл, щоб мати змогу перемістити його на свою sdcard, тому що я не зміг його застосувати як свою програму. Отже, 1) run-as com.package.example, chmod 777 databasefile.db. 2) вихід, перейдіть на sdcard, cp /data/data/com.package.example/databases/databasefile.db. І крок 3 повинен повернути 777 дозволів
Мараг

3
Мій пакунок невідомий незалежно від того, наскільки правильно я його написав у своєму терміналі: (
Коста,

3
Це має бути відповідь, позначена правильною, оскільки це правильний метод використання для не вкорінених телефонів.
LNI

49

перш ніж ми почнемо, чи є у вас корінний телефон? якщо ні, я настійно пропоную, що пора здійснити стрибок. 99% навчальних посібників, які допоможуть вам зробити це, вимагають, щоб у вас був вкорінений телефон (я знаю, б / с я витратив близько години на пошуки способу зробити це, не маючи вкоріненого телефону .. не вдалося знайти жодного .. ) також якщо ви думаєте про це, ваш iPhone також повинен бути вкорінений, щоб виконати це ж завдання. Тож це цілком розумно. Більше про вкорінення в кінці відповіді.

від типу вашого командного рядка:

adb shell

це приведе вас до рядка команд для андроїдних оболонок (ви повинні побачити щось подібне: shell@android:/ $тепер введіть:

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

це має перенести вас безпосередньо до каталогу даних com.domain.yourapp:

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

якщо це не відбувається (тобто, якщо ви отримаєте помилку), то, ймовірно, у вас немає вкоріненого телефону або ви не користувалися своїми привілеями root. Щоб використовувати ваші права користування root, введіть suу командному рядку adb і подивіться, що трапиться, якщо ви отримаєте помилку, то телефон не вкорінюється. Якщо це не так, спершу виконайте його, тоді продовжуйте ці інструкції.

звідти ви можете ввести, lsі ви побачите всі каталоги, включаючи dbs:

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

cache
databases
lib
shared_prefs   

після цього ви можете використовувати sqlite3 для перегляду бази даних .. якщо у вас її не встановлено (ви можете дізнатися це, ввівши sqlite3, якщо ви отримаєте, command not foundтоді вам доведеться встановити її. Щоб встановити sqlite, дотримуйтесь інструкцій тут .

з приводу вкорінення: якщо ви ніколи раніше не вкорінювали телефон, і ви переживаєте, як він накрутить ваш телефон, я можу з повною впевненістю сказати, що турбуватися нема про що. Є тонни швидких та простих підручників із вкоріненням телефону майже для всіх нових та старих моделей там, і ви можете отримати корінь на своєму телефоні, навіть якщо у вас є mac (я вкоренив свій s3 зі своїм mac).


8
Для роботи вам не потрібен вкорінений телефон run-as. Я щойно спробував це на виробництві Galaxy Nexus S.
Тед Хопп

@ TedHopp і т. Д., Він працює чудово на вашому виробництві - створити Galaxy Nexus S .. він буде працювати чудово на всіх андроїд телефонах, правда?
abbood

По-перше, мій телефон - це контрприклад, який показує, що вкорінений телефон не потрібен . По-друге, так, він повинен працювати на всіх не вкорінених пристроях, які мають принаймні Android 2.2 (не тому, що він працює на моєму телефоні, а тому, що саме так він повинен працювати; див . Відповідь Idolon ).
Тед Хопп

@ TedHopp особисто я не дуже андроїд-розробник .. і тому такі інструкції build the application as debuggable (either by building it with the Eclipse, or ant debug command)можуть здатися вам тривіальними, але вони мене ніби залякують. Я здогадуюсь, моя відповідь більше стосується людей, яким зручно вкорінювати свої андроїд-телефони, але не дуже добре розбираються в світі розробників для android. Але я радий, що ми обговорили це питання. Я хочу, щоб читачі моєї відповіді були в курсі інших альтернатив,
котрі

1
Чудова відповідь людина. Тут я використовую кілька різних телефонів (MotoX, nexus4, LG G3, SGIII), і це дуже добре для всіх.
Чад Бінгем

44

$ adb shell

$ cd / дані

$ ls

opendir не вдався, в дозволі відмовлено


Ви повинні зробити це:

$ adb shell

$ cd /data

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

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

ГАРАЗД!


Це працює! Пару речей, які потрібно зробити перед виконанням будь-яких команд. Після ввімкнення параметрів розробника на телефоні, нам також потрібно включити налагодження через USB . Я також додатково включив щось у своєму телефоні (HTC M8) під назвою Вибрати додаток для налагодження і вибрав моє додаток. Може бути стандартним на всіх телефонах ... має бути.
srinij

30

У мене була схожа проблема при спробі роботи на вкоріненому Samsung Galaxy S. Видача команди з оболонки комп'ютера

> adb root

не вдається з повідомленням "не може запускатися як root у виробництві". Ось простий метод, який дозволяє вкоренитися.

Замість попередньої випишіть дві наступні команди одна за одною

> adb shell
$ su

Після першої команди, якщо запит змінився з '>' на '$', як показано вище, це означає, що ви ввели середовище adb shell. Якщо згодом підказка змінилася на "#" після видачі другої команди, це означає, що ви тепер root. Тепер, як root, ви можете робити все, що завгодно, зі своїм пристроєм.

Щоб повернутися до «безпечної» оболонки, видайте

# exit

Ви побачите, що підсказка '$' з’являється знову, що означає, що ви знаходитесь в оболонці adb як користувач, а не як root.


13
su: дозвіл відмовлено
petrnohejl

3
Дивовижне дякую! До речі, для цього потрібно мати вкорінений телефон. Можливо, вам також знадобиться SuperSU або щось подібне? Принаймні, коли я намагався використовувати "su" SuperSU дав мені діалог на своєму телефоні.
Річард Фунг

16
/ system / bin / sh: su: не знайдено
matt lohkamp

1
Дякую :) adb shell + suвирішено набридливий дозвіл. У мене виникла проблема щодо su: not foundAndroid 4.3, але з моменту оновлення до 4.4.2 проблема зникла. 4.3, схоже, є проблеми.

3
su мені недоступний, Nexus 5 / Android 5.1 - чи є спосіб вирішення?
CodeManX

19

У мене теж було багато проблем з цим. Я досі не повністю розумію дозвіл та запуск root, але це працювало для мене (одна з попередніх відповідей частково), щоб скопіювати файл бази даних з / data / data / [назва пакета] /databases/my_db.db. Запуск кореня оболонки або su в оболонці чомусь не працював, а також копіювання файлу db (я не міг перейти до каталогу), а також sqlite3 .

Отже, це спрацювало! У командному рядку 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>

Тепер перейдіть до каталогу SDCARD і отримайте файл db_copy.db. Навіть це було приховано, але мені вдалося надіслати електронною поштою. Ще в Windows я зміг відкрити db-файл за допомогою браузера SQLite Database. :)


Я спробував -> run-as <app_package_name>, але adb не розпізнав моє ім'я_прикладу__програми. Я використовував ім'я_пакету, яке вказав у своєму AndroidManifest.xml. Щось мені не вистачає?
ARK

3

Нижче наведено два кроки, щоб отримати кореневий доступ:

  1. Ваші андроїд-пристрої повинні вкорінюватися.
  2. В оболонці ADB введіть su і Android-пристрій підкаже y / n? Ви обираєте дозволити.

type su .. підкаже на мобільному пристрої .. просить супер дозволу через Superuser .. спрацювало
Mahajan344

2

виробництво не може ввести / дані / додаток

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

може знадобитися зміна права власника, щоб ним управляти.


2

Проблема може полягати в тому, що нам потрібно спеціально надати кореневий доступ до параметрів adb в опціях develonent в останніх КМ. Ось що я зробив.

abc @ abc-L655: ~ $ sudo adb kill-сервер
abc @ abc-L655: ~ $ sudo adb root start-server * демон не працює. запустивши його зараз на порт 5037 * * демон розпочався успішно * кореневий доступ відключений за допомогою системних налаштувань - включити в налаштуваннях -> параметри розробки

після зміни варіантів розвитку ...

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

якщо ви знаєте пакет програм, ви можете cdбезпосередньо до цієї папки ..

напр cd data/data/com.yourapp

це перетворить вас у каталог, тобто read/writableви можете змінювати файли за потребою. Оскільки папка однакова на папці emulator, ви можете використовувати її для отримання шляху до папки.


2
Я можу записати компакт-диск у папку безпосередньо, але я все одно отримую помилку "opendir fail, дозвіл відмовлено".
Тайлер Колліер

Це пояснюється тим, що користувач "оболонки" adb виконав дозвіл на каталоги, а не дозвіл на читання.
Кріс Страттон

0

Якщо ви просто хочете побачити ваші БД і таблиці, то найпростіший спосіб - це використовувати Stetho. Досить класний інструмент для кожного розробника Android, який використовує SQLitebuit by Facobook developed.

Steps to use the tool

  1. Додайте нижче залежність у файл gradle програми (Модуль: додаток)

'компілювати' com.facebook.stetho: stetho: 1.4.2 '

  1. Додайте нижче рядки коду до методу Діяльність onCreate ()
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 }

Тепер, складіть свою програму. Коли програма запущена, ви можете переглядати базу даних, відкривши chrome в URL-адресі:

chrome://inspect/#devices

Знімки екрана такі ж, як нижче_

ChromeInspact

ChromeInspact

Ваша БД

Ваша БД

Сподіваюся, що це допоможе всім! :)


0

Це працює, якщо ваш пристрій Android укорінений будь-якими способами (не впевнений, чи працює він для не вкорінених).

  1. adb shell - доступ до оболонки
  2. su - стати надрукувальником.

Тепер ви можете читати всі файли у всіх каталогах.


-3

не вкорінюючи пристрій, ви можете отримати доступ до файлів за наступним скріншотом cmd:

  1. запустіть adb за допомогою cmd із папки інструментів платформи відповідно до вашого користувача

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

    це може бути в іншій папці, залежить від того, де ви її встановили.

  2. відобразити робочі пристрої.

    adb devices

    скажімо, команда відповідь або відповідь

    List of devices attached
    0123456789ABCDEF     device
  3. написати команду

        adb -s 0123456789ABCDEF shell "su"

    він відкриється в

        root@theDeviceName:/ #

4.Приймаючи файли, перелічіть усі файли

ls

і так далі каталог змін до будь-якого іншого місця, наприклад, папки даних

cd data/data

1
C: \ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> adb -s emulator-5554 shell "su" / system / bin / sh: su: не знайдено
Solo

у моєму випадку це був Android 5.0.2, я не знаю, чи відрізняється він від версії до іншої @Koen
Махмуд Ашраф

шлях залежить від того, де ви встановили андроїд-студію, і це SDKs @Solo
Махмуд Ашраф

1
Проблема не в пошуку місця adb. Це в моїй ПАРТІ. Отримання списку файлів (або навіть виконання su) не працює / забороняється. Тестування на Android 4.3.
Коен

su не знайдено
Brill Pappin

-5

Коли ви перебуваєте в каталозі оболонки для пристрою. Просто біжи

su - root

Тоді ви повинні мати доступ до даних / папки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.