6

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

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

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

在模拟器上一切正常,但模拟器很慢,我宁愿使用 genymotion。

任何建议如何处理这个问题?

4

4 回答 4

10

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

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

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

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

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

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

于 2013-08-12T12:26:45.670 回答
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:/ # 退出
shell@android:/ $ exit
localuser:~ localhost$ adb pull /mnt/shell/emulated/0/Download/ your_database.db ~/ your_database.db

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

于 2013-12-05T14:10:10.520 回答
2

您必须设置对该文件夹/文件的权限,然后您可以轻松拉取:

adb shell "run-as package.name chmod 666 /data/data/package.name/databases/file"

adb 拉 /data/data/package.name/databases/file 。

于 2014-01-01T21:42:58.910 回答
0

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

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

所以我创建了谷歌播放提供的虚拟机并下载了 SQL 调试器应用程序。我也在我的测试套件中使用了这个代码,所以我在每次运行测试结束时将 db 提取到 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);
    }

}

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

于 2013-08-11T07:18:07.277 回答