Genymotion.如何从设备中提取数据库.我的/ data/data /文件夹似乎是空的

Raf*_*nka 6 database eclipse android adb genymotion

我的ubuntu安装genymotion有问题.主要是我无法调试我的数据库,因为通过eclipse中的DBMS和shell中的adb我无法查看/ data /文件夹的内容.没有显示文件.

我通过cd登录adb到/ sdk/platform-tools并输入./adb shell su.我看到标签不起作用,所以我盲目地输入路径.无论如何我无法拉数据库,也许我做错了命令.

通过DBMS我尝试连接但数据文件夹不显示内容.

在模拟器上一切顺利,但模拟器很慢,我宁愿使用genymotion.

有什么建议如何处理这个问题?

eya*_*zmy 11

我没有你要说的问题,Genymotion上的默认shell用户是root,所以不应该发生.尽管如此,您可以使用run-as命令直接访问您的数据.

简而言之.您应用的数据文件夹受应用用户权限的保护.默认shell用户无权访问应用程序的文件夹.由于该run-as命令,您可以更改shell正在使用的用户.

  1. 打开一个shell: adb shell
  2. 然后输入: run-as your.package.name

此命令将shell用户更改为您的应用程序的用户.因此,您有权阅读和撰写应用程序的数据.您还将被重定向到您应用的数据文件夹:/data/data/you.package.name

完成后,您可以轻松浏览文件.

注意:您的应用必须构建为调试才能使用此命令.它应该显示在DDMS上的设备进程列表中.


Ale*_*xey 7

然后在本地计算机上运行模拟器

localuser:~localhost $ adb shell
shell @ android:/ $ su
shell @ android:/ #cp/data/data/your.package.name/databases/your_database.db/mnt/shell/emulated/0/Download/your_database. db
shell @ android:/#exit
shell @ android:/ $ exit
localuser:~localhost $ adb pull/mnt/shell/emulated/0/Download/your_database.db ~/your_database.db

它的作用是:
1.连接到模拟器
2.请求超级用户权限
3.将只有超级用户可用的文件复制到公共目录(在这种情况下是下载)
4.将文件从公用文件夹(下载)拖到您的本地机器主目录; 你也可以从eclipse gui执行这一步.


Raf*_*nka 0

我设法解决了这个问题,所以我发布了我的解决方案,以防有人发现它有帮助。

以前我一直在创建没有谷歌API的虚拟机,每次我想要root手机时超级用户应用程序都会崩溃。

所以我创建了 google play 提供的虚拟机并下载了 SQL 调试器应用程序。我还在我的测试套件中使用此代码,因此我在运行的每个测试结束时将数据库获取到 SD 卡。这样我就不需要超级用户权限。

public static void copyDbToSd(Context context) {
    File dbFile = context.getDatabasePath((String) DatabaseHandler.DATABASE_NAME);


    InputStream myInput;
    try {
        myInput = new FileInputStream(dbFile);
        OutputStream myOutput = new FileOutputStream(
                Environment.getExternalStorageDirectory() 
                + java.io.File.separator 
                + "database.db");

        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }

        myOutput.flush();
        myOutput.close();
        myInput.close();
    } catch (FileNotFoundException e) {
        Log.e(TAG, "Exception: ", e);
    } catch (IOException e) {
        Log.e(TAG, "Exception: ", e);
    }

}
Run Code Online (Sandbox Code Playgroud)

其中 DatabaseHandler.DATABASE_NAME 是我在创建数据库时设置的数据库名称。