如何在Android设备中访问数据/数据文件夹?


316

我正在开发一个应用程序,我知道我的数据库*.db将出现在data/data/com.****.***

我可以在sqlite管理器的帮助下从Eclipse中的AVD访问此文件

但是我无法在Android手机中访问此文件。
我在Google上搜索了它,并说我需要扎根手机才能做到,但我不想这样做。(新电话,保修问题和安全性问题)

所以这是我的问题:如何data/data/.....在“ 不植根 ”的情况下在Android手机中访问目录?

我可以更改目录的用户权限data/data.....而无需将其植根吗?


1
你有database.db文件.. ???
阿米特·帕拉贾帕蒂

我正在使用数据库-“ openOrCreateDatabase(....)”
Naveen Prince P 2012年

5
您肯定首先需要扎根手机。然后,您将需要一个可以使用的胜任的文件管理器应用程序。ASTRO文件管理器很流行,但是它没有root访问支持,因此对高级用户没有用。您应该能够使用ES File Explorer或File Expert。我最近在使用ES File Explorer查看/ data / data或其他受保护的文件夹时遇到了问题,并且几乎放弃了它,现在我正在使用File Expert。它们都要求您进入设置并启用root资源管理器选项(有时还将文件系统挂载为可写)。因此,您首先需要这样做。
萨米尔

这不是与编程相关的问题或答案。
2015年

Answers:


375

直接在手机上访问文件很困难,但是您可以将它们复制到计算机上,在其中可以执行任何操作。不生根,您有2个选择:

  1. 如果应用程序是可调试的,则可以run-as在adb shell中使用该命令

    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 2014年

11
在选项1中,如何告诉cp命令将其保存到笔记本电脑(Mac)?如果您举一个Win示例,我也想知道,将其翻译出来。谢谢。
杰拉德2014年

10
重要提示:运行adb backup -noapk com.your.packagename会将ab文件保存在当前目录中,因此请确保已在正确的目录中导航(例如cd Desktop..
Menelaos Kotsollaris 2015年

6
请注意,如果您的应用已通过android:allowBackup="false"清单禁用了备份,则备份方法将产生一个空备份。
汤姆

130

如果您使用的是Android Studio 3.0或更高版本,请按照以下步骤操作。

  1. 单击视图 > 工具窗口 > 设备文件资源管理器
  2. 展开/ data / data / [package-name]节点。

您只能扩展在非根设备上以调试模式运行的软件包。

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. 在Eclipse中打开DDMS视图,然后从其中打开“ FileExplorer”以获取所需的文件

之后,您应该能够浏览已root用户的设备上的文件。


2
我认为Root Explorer应用程式仅适用于植根电话。我会尝试第二种方法
Naveen Prince P 2012年

5
无法chmod / data:不允许操作
bofredo

@bofredo我认为这是因为您的手机未扎根。您应该扎根手机,然后再尝试
Sheraz Ahmad Khilji 2014年

1
@mahemadhi是的,您可能必须为每个目录手动运行此命令,因为所有目录都具有对其专有的权限。
Sheraz Ahmad Khilji 2014年

1
@VivekChavda是的,他们需要扎根电话
Sheraz Ahmad Khilji

21

要执行上述任何一项操作(即从手机内部访问受保护的文件夹),您仍然需要root用户。(这包括更改/ data文件夹上的安装权限并访问它)

如果没有root用户,则无法通过代码应用程序内部/data直接访问读取的内容。因此,您可以尝试将该文件复制到sdcard或可访问的位置,然后,您应该可以正常访问它。

如果您使用的是开发人员设备,则生根维护不会使您的保修无效。抱歉,AFAIK没有其他方法。


我没有使用开发者设备。我的是Xperia U
Naveen Prince P

如何使用chmode命令编辑数据文件夹的用户权限?
Naveen Prince P

整个分区安装为只读。我想您最好的选择就是adb pull下面的答案。
Anirudh Ramanathan,2012年

如果应用程序允许,我是可能的。目录对每个人都有x权限(但对每个人都没有r,因此您必须知道路径)。它取决于应用程序是否使文件世界可访问。有些文件是,大多数不是。
Jan Hudec

首先,您说无法读取,然后建议将文件复制到其他位置。但是,如何在不首先读取文件的情况下复制文件?我认为这个答案是错误的。
直到2015年

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 或者只是您可以从device复制database.db。

对我来说很完美。谢谢!但是在我的情况下,数据库文件名没有.db扩展名。
technik

10

在Eclipse中使用文件资源管理器。选择Windows =>显示视图=>其他... =>文件资源管理器。

另一种方法是通过adb拉文件:

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

5

我曾经也遇到过同样的问题。除了adb shell或rooting device,无法在android设备中直接访问文件。

除了这些,还有02个替代方案:

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根目录下。您可能会被拒绝。这就是为什么我保存在C:\ Intel。

提取* .ab文件

  1. 转到此处下载:https : //sourceforge.net/projects/adbextractor/
  2. 解压缩下载的文件,然后导航到您解压缩的文件夹。
  3. 使用您自己的文件名运行此文件:java -jar abe.jar解压c:\ Intel \ xxx.ab c:\ Intel \ xxx.tar

1
这是一个很好的答案,谢谢。为我工作,以提取在小米设备(扩展名为.bak)上创建的单应用程序备份。无需生根
俄语

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 / *可以从Intellij的DDMS访问数据目录中的所有子文件夹。我假设Eclipse DDMS的解决方案相同。

更新 所以,我发现的很奇怪。我正在IntelliJ(Android设备监视器)中使用DDMS运行Nexus 6。我建立了一个小启动器应用程序。所述应用将数据保存到data / data / com.example.myapp / files中的.csv文件中

刚开始尝试在Nexus 6上访问此文件时,我发现我必须将设备置于根目录下。我可以看到数据文件夹,但尝试打开该文件夹将不起作用。如在其他地方在线所提到的,expand +将消失,然后在不久后重新出现(请注意,网络上有一些解决方案声称允许访问这些文件夹而不会生根,我直到很晚才发现它们,我不知道我是否宁愿不扎根((我宁愿能够手动完成它,也不愿依靠应用程序或命令提示符为我提供解决方案))。我扎根了6,然后再次尝试DDMS。

此时,它向我显示了数据文件夹,我可以展开该文件夹并查看com。目录,但我无法打开其中任何一个。那就是我发现上述解决方案的时候。最初的说明不适用于此部分:

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文件。我的文件目录权限为drwxrwxrwx,而我的log.csv文件权限为-rw-rw-- -..就这样


2

您可以下载类似的单文件:

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-Studio方式Shahidulhttps://stackoverflow.com/a/44089388/1256697)也可以使用。对于那些DeviceFile Explorer在菜单中看不到该选项的用户:确保在Android Studio中打开/ android-Directory。例如,反应本地用户有这个里面的自己的项目,文件夹右侧的相同的水平/ IOS-目录。


1

一种简单的方法是在SD卡上创建数据库。因为除非您为手机设置了根目录,否则您将无法访问内部存储器中手机的数据文件夹。那么,为什么不简单地在SD卡上创建数据库。

此外,如果需要,您可以编写一些文件复制代码,以将现有数据库文件(从内部存储器)复制到外部存储器,而无需任何root用户。


怎么做?我如何在sdcard中创建数据库
Naveen Prince P

方法将帮助您在SD卡上创建数据库。只需提供File指向SD卡的路径,您就可以开始使用
waqaslam 2012年

1

可能是要访问此文件夹,您需要管理权限。

所以您有两个选择:

  1. 根您的设备,然后尝试访问此文件夹
  2. 使用模拟器

ps:如果您使用以上两个选项中的任何一个,则可以按照以下步骤访问此文件夹

打开DDMS透视图->您的设备->(从右侧窗口选项中选择File Explorer)选择包->数据->数据->包名称->文件

从那里你可以拉起你的文件


1

adb backup不适用于我,所以这是我做的(Xiaomi Redmi Note 4X,Android 6.0):
1.转到设置>其他设置>备份和重置>本地备份
2.点击屏幕底部的“备份”。
3.取消选中“系统”和“应用程序”复选标记。
4.点击“应用程序”单元格右侧的详细信息披露按钮以导航至应用程序选择屏幕。
5.选择所需的应用程序,然后点击确定。
6.备份完成后,需要以某种方式查找实际文件。我的位于/ MIUI / backup / AllBackup / _FOLDER_NAMED_AFTER_BACKUP_CREATION_DATE_
7.然后,我按照RonTLV的回答中的步骤进行操作实际将备份文件(以我的情况为.bak)转换为tar(与原始答案重复):

a)转到此处下载:https : //sourceforge.net/projects/adbextractor/
b)提取下载的文件并导航到您提取的文件夹
。c)使用您自己的文件名运行此文件:java -jar abe.jar解压c:\ Intel \ xxx.ab c:\ Intel \ xxx.tar


0

您可以将此db文件复制到eclipse Explorer中的某个位置(例如:sdcard或PC),并且可以使用sqlite访问和更新此db文件。



0

您也可以尝试将文件复制到SD卡文件夹(这是一个公用文件夹),然后可以将文件复制到PC上,然后可以使用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();
    }
}

表现:

<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,以便可以查看隐藏的db3文件
  2. 这不是解决方案,而是解决方法。为什么不创建使用“ select”语句在其中显示数据库表的测试页。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.