Как получить доступ к папке данных / данных на устройстве 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.