Как получить доступ к папке данных / данных на устройстве Android?


317

Я занимаюсь разработкой приложения и знаю, что моя база данных *.dbпоявится вdata/data/com.****.***

Я могу получить доступ к этому файлу из AVD в Eclipse с помощью диспетчера sqlite

Но я не могу получить доступ к этому файлу на своем телефоне Android.
Я гуглю его, и он говорит, что мне нужно рутировать мой телефон, чтобы сделать это, но я не хочу это делать. (Новый телефон, проблемы с гарантией и проблемы с безопасностью)

Итак, вот мой вопрос: как я могу получить доступ к своему data/data/.....каталогу в моем телефоне Android " без рутирования "?

Могу ли я изменить пользовательские разрешения для каталога data/data.....без рута?


1
у вас есть файл database.db .. ???
Амит Праджапати

я использую базу данных - "openOrCreateDatabase (....)"
Naveen Prince P

5
Вам обязательно нужно рутировать телефон в первую очередь. Тогда вам понадобится компетентное приложение для управления файлами, которое вы можете использовать. Файловый менеджер ASTRO популярен, но у него нет поддержки корневого доступа, поэтому он бесполезен для опытных пользователей. Вы должны быть в состоянии использовать ES File Explorer или File Expert. Недавно у меня были проблемы с просмотром / данными / данными или другими защищенными папками в ES File Explorer, и я почти отказался от него, и теперь я использую File Expert. Они оба требуют, чтобы вы вошли в настройки и включили опцию root explorer (и иногда также монтировали файловую систему как доступную для записи). Так что вам нужно сделать это в первую очередь.
Самир

Это не связанный с программированием вопрос или ответы.
SkyWalker

Ответы:


376

Доступ к файлам непосредственно на вашем телефоне затруднен, но вы можете скопировать их на свой компьютер, где вы сможете делать с ним все, что захотите. Без рута у вас есть 2 варианта:

  1. Если приложение отлаживаемо, вы можете использовать run-asкоманду в оболочке adb

    adb shell
    run-as com.your.packagename 
    cp /data/data/com.your.packagename/
  2. В качестве альтернативы вы можете использовать функцию резервного копирования Android.

    adb backup -noapk com.your.packagename

    Теперь вам будет предложено «разблокировать устройство и подтвердить операцию резервного копирования». Лучше НЕ предоставлять пароль, иначе становится сложнее читать данные. Просто нажмите «Резервное копирование моих данных». В результате файл «backup.ab» на вашем компьютере содержит все данные приложения в формате резервной копии Android. По сути это сжатый tar-файл. На этой странице объясняется, как вы можете использовать команду OpenSSL zlib для ее распаковки. Вы можете использовать adb restore backup.dbкоманду для восстановления резервной копии.


15
adb backup -f \location\on\local\drive -noapk app.package.nameу меня работал без рута
theblang

24
Используйте эту команду, чтобы распаковать ваш файл резервной копии:dd if=backup.ab bs=24 skip=1|openssl zlib -d > backup.tar
Hooman

11
В варианте 1, как мне сказать команде cp сохранить их на моем ноутбуке (Mac)? Если вы приведете пример выигрыша, я бы тоже хотел знать, и просто переведу его. Спасибо.
Джерард

10
Важно: Запуск adb backup -noapk com.your.packagenameсохранит файл ab в текущем каталоге , поэтому убедитесь, что вы перешли в нужный каталог (например cd Desktop..)
Menelaos Kotsollaris

6
Обратите внимание, что подход резервного копирования даст пустую резервную копию, если ваше приложение отключило резервное копирование через android:allowBackup="false"манифест.
Том

130

Если вы используете Android Studio 3.0 или более позднюю версию, выполните следующие действия.

  1. Нажмите « Просмотр» > « Инструмент Windows» > « Обозреватель файлов устройства» .
  2. Разверните / data / data / [имя-пакета] узлы.

Вы можете разворачивать пакеты, которые работают в режиме отладки, только на некорневом устройстве.

Шаги в Android Studio 3.0


1
Я не вижу ничего в этом доке. и скажи мне ничего не показывай. ты знаешь в чем проблема?
Махди Азадбар

1
Это работает только в режиме отладки, а не для релиз-сборок
itinance

Спасибо за то, что вы показали способ проверки без файловой системы!
Lensflare

У меня, кажется, нет варианта в версии 3.0.1, он переместился?
Codingale

1
это круто. Жаль, что я знал это некоторое время назад.
checkmate711

59

Вы также можете попробовать получить базу данных с помощью приложения root explorer. И если это не работает, то вы можете попробовать это:

  1. Открыть cmd
  2. Измените каталог и перейдите в «Инструменты платформы»
  3. Тип ' adb shell'
  4. su
  5. Нажмите «Разрешить» на устройстве
  6. chmod 777 /data /data/data /data/data/com.application.package /data/data/com.application.package/*
  7. Откройте представление DDMS в Eclipse и оттуда откройте FileExplorer, чтобы получить нужный файл

После этого вы сможете просматривать файлы на рутированном устройстве.


2
Я думаю, что приложение root исследовать работает только для рутованных телефонов. Я попробую 2-й способ
Naveen Prince P

5
Невозможно выполнить chmod / data: операция не разрешена
bofredo

@ Bofredo Я думаю, потому что ваш телефон не рутирован. Вы должны
рутировать

1
@mahemadhi да, вам, вероятно, придется запускать эту команду вручную для каждого каталога, так как все каталоги имеют частные разрешения.
Шераз Ахмад Хилджи

1
@VivekChavda да они требуют
рутированный

21

Чтобы сделать что-либо из вышеперечисленного (например, получить доступ к защищенным папкам из самого телефона), вам все еще нужен root. (Это включает изменение разрешений на монтирование для папки / data и доступ к ней)

Без root невозможно получить /dataпрямой доступ для чтения, кроме как из вашего приложения через код. Таким образом, вы можете попробовать скопировать этот файл на SDCard или куда-нибудь доступный, и тогда вы сможете получить к нему обычный доступ.

Rooting не аннулирует вашу гарантию, если у вас есть устройство разработчика. Извините, по-другому, AFAIK, нет.


Я не использую устройство разработчиков. Мой Xperia U
Навин Принс П

Могу ли я отредактировать разрешение пользователя для папки данных с помощью команд chmode?
Навин Принс П

Весь раздел монтируется только для чтения. Я бы сказал, что ваша лучшая ставка будет такой, adb pullкак указано в ответе ниже.
Анируд Раманатан

Я возможно, если приложение позволяет. Все каталоги имеют x разрешение для всех (но не r для всех, поэтому вы должны знать путь). Это зависит от того, сделало ли приложение доступным файловый мир или нет. Некоторые файлы, большинство нет.
Ян Худек

Сначала вы говорите, что невозможно прочитать, затем вы предлагаете скопировать файл в другое место. Но как скопировать файл, не читая его в первую очередь? Я думаю, что этот ответ глючит.
до

13

Самый простой способ (всего один простой шаг) извлечь файл из папки отлаживаемого приложения (скажем /data/data/package.name/databases/file) на некорневом устройстве Android 5.0+ с помощью этой команды:

adb exec-out run-as package.name cat databases/file > file

12
  1. Откройте командную строку
  2. Перейдите в каталог E: \ Android \ adt-bundle-windows-x86_64-20140702 \ adt-bundle-windows-x86_64-20140702 \ sdk \ platform-tools
  3. Введите ниже команды
  4. adb -d shell
  5. run-as com.your.packagename cat databases/database.db > /sdcard/database.db
  6. Перейдите в каталог, чтобы cd /sdcardубедиться, что database.dbон есть.
  7. adb pull /sdcard/database.db или просто вы можете скопировать database.db с устройства.

Работает идеально для меня. Спасибо! Но в моем случае имя файла базы данных не имеет расширения .db.
technik

10

Используйте Проводник в затмении. Выберите Windows => Показать представление => Прочее ... => Проводник.

Другой способ - извлечь файл через adb:

adb pull /system/data/data/<yourpackagename>/databases/<databasename> /sdcard

5

У меня тоже была одна и та же проблема. Невозможно получить прямой доступ к файлу на устройствах Android, кроме оболочки adb или рутирующего устройства.

Кроме того, здесь есть 2 варианта:

1)

 public void exportDatabse(String databaseName)
   {
     try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath = "//data//"+getPackageName()+"//databases//"+databaseName+"";
            String backupDBPath = "backupname.db";
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {

    }
}

2) Попробуйте это: https://github.com/sanathp/DatabaseManager_For_Android


5

Для резервного копирования с Android на рабочий стол

Откройте командную строку cmd и запустите: adb backup -f C: \ Intel \ xxx.ab -noapk your.app.package . Не вводите пароль и нажмите Резервное копирование моих данных. Убедитесь, что вы не сохранили на диске C root. Вам может быть отказано. Вот почему я сохранил на C: \ Intel.

Чтобы извлечь файл * .ab

  1. Зайдите сюда и загрузите: https://sourceforge.net/projects/adbextractor/
  2. Распакуйте загруженный файл и перейдите в папку, в которую вы распаковали.
  3. запустите его со своими собственными именами файлов: java -jar abe.jar распаковать c: \ Intel \ xxx.ab c: \ Intel \ xxx.tar

1
Это отличный ответ, спасибо. Я работал над извлечением резервной копии одного приложения, созданной на устройстве Xiaomi (с расширением .bak). Рут не требуется
Russian

4

На рутованном устройстве правильное решение таково:

Open cmd
Change your directory and go into 'Platform tools'
Type 'adb shell'
su
Press 'Allow' on device
chmod 777 /data /data/data /data/data/*
Open DDMS view in Eclipse/IntelliJ and from there open 'FileExplorer' to get your desired file

Исходное решение работало, но chmod возвращал неизвестный каталог. Изменение команды chmod на / data / data / * дало доступ ко всем подпапкам в каталоге данных из DDMS в Intellij. Я предполагаю, что то же решение верно для Eclipse DDMS.

ОБНОВЛЕНИЕ Итак, то, что я нашел, странно. Я использую Nexus 6, используя DDMS в IntelliJ (Android Device Monitor). Я построил небольшое приложение для начинающих. Указанное приложение сохраняет данные в файл .csv в data / data / com.example.myapp / files

Когда я впервые начал пытаться получить доступ к этому файлу на своем Nexus 6, я обнаружил, что должен рутировать устройство. Я мог видеть папку данных, но попытка открыть ее не сработала. Как упоминалось в Интернете в других местах, расширение + исчезнет, ​​а затем вскоре появится снова (обратите внимание, что в Интернете есть решения, которые утверждают, что разрешают доступ к этим папкам без рутирования, я не нашел их слишком поздно, и я не уверен, предпочитаю ли я в любом случае не получать root-права ((я бы предпочел сделать это вручную, чем полагаться на приложение или командную строку, чтобы дать мне свои решения))). Я рутировал свои 6 и снова попробовал DDMS.

В этот момент он показал мне папку с данными, и я смог развернуть папку и увидеть ком. каталоги, но я не мог открыть ни один из них. Именно тогда я обнаружил вышеуказанное решение. Начальные инструкции не будут работать на этой части:

chmod 777 /data /data/data /data/data/com.application.pacakage /data/data/com.application.pacakage/*

Именно тогда я попробовал решение, которое я отправил:

chmod 777 /data /data/data /data/data/*

Это решение, похоже, работает, но только для определенных папок. Теперь я могу развернуть папку myapp, но не могу развернуть каталог файлов в ней.

В этот момент я немного поигрался, а потом подумал, почему бы просто не попробовать его в нужном мне каталоге, а не попробовать эти подстановочные знаки.

chmod 777 /data /data/data /data/data/com.example.myapp/*

С последующим:

chmod 777 /data /data/data /data/data/com.example.myapp/files

Эти команды позволили мне развернуть и просмотреть файлы в каталоге моего приложения, чтобы убедиться, что файл .csv был сохранен правильно.

Надеюсь, это кому-нибудь поможет. Я боролся с этим часами!

(немного сложнее, как ни странно, разрешения не передавались в файл .csv, который передавался в каталог files. Мои права доступа к каталогу файлов для чтения drwxrwxrwx и мои права доступа для файла log.csv для чтения -rw-rw --- - .. просто к вашему сведению)


2

Вы можете скачать файл Sigle следующим образом:

adb exec-out run-as debuggable.app.package.name cat files/file.mp4 > file.mp4

Перед загрузкой вы, возможно, не захотите взглянуть на файловую структуру в вашем App-Directory. Для этого выполните следующие шаги, THelperуказанные выше:

adb shell
run-as com.your.packagename 
cd files
ls -als .

Упомянутый способ Android-StudioShahidul ( https://stackoverflow.com/a/44089388/1256697 ) также работает. Для тех, кто не видит DeviceFile Explorerопцию в меню: обязательно откройте / android-Directory в Android Studio. Например, пользователи-реагирующие имеют это внутри своей папки проекта прямо на том же уровне, что и / ios-Directory.


1

Одним из простых способов является создание базы данных на SD-карте. Потому что вы не можете получить доступ к папке данных вашего телефона во внутренней памяти, если вы не рутируете свой телефон. Так почему бы просто не создать свою базу данных на SD-карте.

Более того, если вы хотите, вы можете написать некоторый код для копирования файлов, чтобы скопировать существующий файл базы данных (из внутренней памяти) во внешнюю память, не требуя какого-либо рута.


как это сделать? Как я могу создать БД в SDCard
Naveen Prince P

Этот метод поможет вам создать базу данных на SD-карте. Просто File
укажите

1

Возможно, для доступа к этой папке вам необходимы права администратора.

так что у вас есть два варианта: -

  1. root ваше устройство, а затем попробуйте получить доступ к этой папке
  2. использовать эмулятор

PS: если вы используете любой из двух вышеуказанных вариантов, вы можете получить доступ к этой папке, выполнив следующие действия

откройте перспективу DDMS -> ваше устройство -> (выберите File Explorer из правого окна), выберите пакет -> данные -> данные -> имя пакета -> файлы

и оттуда вы можете поднять свой файл


1

adb backupу меня не получилось, поэтому вот что я сделал (Xiaomi Redmi Note 4X, Android 6.0):
1. Перейдите в раздел «Настройки»> «Дополнительные настройки»> «Резервное копирование и сброс»> «Локальные резервные копии» .
2. Нажмите «Резервное копирование» в нижней части экрана.
3. Снимите флажки «Система» и «Приложения».
4. Нажмите кнопку подробного раскрытия в правой части ячейки «Приложения», чтобы перейти к экрану выбора приложения.
5. Выберите нужное приложение и коснитесь OK.
6. После того, как резервное копирование было завершено, нужно как-то найти фактический файл. Мою можно найти в / MIUI / backup / AllBackup / _FOLDER_NAMED_AFTER_BACKUP_CREATION_DATE_ .
7. Затем я последовал за шагами от этого ответа на RonTLVчтобы на самом деле преобразовать файл резервной копии (в моем случае .bak) в tar (дублируя исходный ответ):
«
а) Перейдите сюда и загрузите: https://sourceforge.net/projects/adbextractor/
b) Извлеките загруженный файл и перейдите в папку, в которую вы распаковали.
c) запустите ее с собственными именами файлов: java -jar abe.jar распакуйте c: \ Intel \ xxx.ab c: \ Intel \ xxx.tar
"


0

Вы можете скопировать этот файл базы данных куда-нибудь в обозревателе eclipse (например, SDCard или ПК), и вы можете использовать sqlite для доступа и обновления этого файла базы данных.


0

Вопрос: как получить доступ к данным-данным-папке-в-андроид-устройстве?


Если android-устройство Bluestacks * Root Browser APK показывает данные / данные / ..


Попробуйте загрузить Root Browser с https://apkpure.com/root-browser/com.jrummy.root.browserfree


Если файл представляет собой текстовый файл, вам нужно нажать «Открыть как», «Текстовый файл», «Открыть как», «Текстовый редактор РБ».


0

Вы также можете попробовать скопировать файл в папку SD Card, которая является общей папкой, затем вы можете скопировать файл на свой компьютер, где вы можете использовать sqlite для доступа к нему.

Вот некоторый код, который вы можете использовать для копирования файла из данных / данных в папку общего хранилища

private void copyFile(final Context context) {
    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath =
                    context.getDatabasePath(DATABASE_NAME).getAbsolutePath();

            String backupDBPath = "data.db";

            File currentDB = new File(currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Manifest:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

Все действия для файла копирования недоступны, если файл не имеет права на чтение для других
Steve Luck

0

База данных SQLlite хранится на телефоне пользователя и скрывается по пути:

/Data/Data/com.companyname.AppName/File/

у вас есть 2 варианта здесь:

  1. вы можете получить root права на свой телефон, чтобы получить доступ к файлу hdding db3
  2. это не решение, а обходной путь. Почему бы просто не создать тестовую страницу, в которой будет отображаться таблица вашей базы данных, используя статистику select.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.