如何使用Android Studio查看共享的首选项文件?


101

我正在使用共享首选项来存储我的应用程序的某些值。我想查看手机上实际存储信息的文件。我在Eclipse上找到了许多方法来执行此操作,但是我正在Android Studio上进行调试。我的手机已扎根。我读到,具有root用户访问权限对于读取这些类型的文件很重要。如果没有办法,那么我将查找如何通过程序访问信息,然后将其输出到log cat。不过希望是,我可以直接在手机上查看文件,因为它要简单得多。谢谢。


安装ES File Explorer并启用root浏览。然后,您将可以直接在手机上打开它。
CurlyPaul 2014年

3
尝试使用adb pull将文件提取到桌面。 adb pull /data/data/<packagename>/shared_prefs/prefs.xml
2014年

2
或转到文件浏览器,然后在文件树中的/data/data/com.your-package/shared_prefs下找到应用程序的数据文件夹。首选项文件将以XML格式存在。从设备复制并欣赏。在“文件资源管理器”视图的右上角,有两个图标按钮-一个带有磁盘,一个带有手机。通过这些按钮,您可以分别从手机/仿真器复制文件或向手机/仿真器复制文件。
2014年

1
由于某种原因,我的prefs xml文件称为<PACKAGENAME> _preferences.xml
JPM,

Answers:


95

在Android Studio中,启动Android设备监视器,转到文件资源管理器,然后浏览“ / data / data / <包的名称> / shared_prefs /”。您可以在此处找到XML ...,也可以将其复制以进行检查。

如果您使用的是非根目录设备,则无法直接通过Android Studio进行操作。但是,adb shell只要您的应用程序是调试版本,就可以访问该文件。

adb shell
run-as your.app.id
chmod 777 shared_prefs/your.app.id_preferences.xml
exit # return to default user
cp /data/data/your.app.id/shared_prefs/your.app.id_preferences.xml /sdcard

之后,您可以使用adb从/ sdcard目录中提取文件。


我无法从设备监视器访问此文件夹。需要根吗?
玛丽安(MarianKlühspies)2015年

2
第二种方法适用于无根设备。将文件复制到sd卡后,您可以退出adb并运行adb pull“ / sdcard / your_preferences_file”,然后会在当前目录中获取一个xml文件,您可以检查该文件。
Bebop_

4
如果您可以通过这种方式进行调试,则实际上可以从没有root的仿真器中获取此信息。如果您在物理设备上,则需要root用户。
Booger

3
在AndroidStudio的右下角查找设备文件浏览器。它将使您轻松访问设备文件系统
Maksim Turaev,

2
使用设备文件资源管理器,我无需root访问权限即可访问共享首选项
Devansh Maurya

77

Android Studio 3.x中的设备文件资源管理器非常适合浏览您的首选项文件,缓存项或数据库。

  1. 共享首选项/ data / data // shared_prefs目录

在此处输入图片说明

看起来像这样

在此处输入图片说明

要打开设备文件资源管理器,请执行以下操作:

单击视图>工具窗口>设备文件资源管理器,或单击工具窗口栏中的设备文件资源管理器按钮。

在此处输入图片说明


13
打开设备文件资源管理器(屏幕的右下角)。
Apit John Ismail

47

Stetho

当应用程序处于调试模式时,可以使用http://facebook.github.io/stetho/访问共享的首选项。无根

特征:

  1. 查看和编辑共享首选项
  2. 查看和编辑sqLite数据库
  3. 查看视图层次结构
  4. 监控HTTP网络请求
  5. 从设备的屏幕查看流
  6. 和更多....

在此处输入图片说明

基本设置:

  1. 在build.gradle中添加 compile 'com.facebook.stetho:stetho:1.5.0'
  2. 在应用程序的onCreate()中添加 Stetho.initializeWithDefaults(this);
  3. 在PC上的Chrome中转到chrome:// inspect /

更新:鳍状肢

Flipper是来自Facebook的更新替代品。它具有更多功能,但目前仅适用于Mac编写,配置难度稍大,缺乏数据库调试功能,同时还极大地增强了布局检查器

您也可以使用@Jeffrey建议:

  • 打开设备文件资源管理器(屏幕右下方)
  • 转到data / data / com.yourAppName / shared_prefs

可以在模拟器上使用吗?我似乎无法使它工作
EduardoMaia

@EduardoMaia应该。我每天都在模拟器中使用它。您可以使用屏幕截图创建问题,因此我将尽力为您提供帮助。
Maksim Turaev

@EduardoMaia您可以尝试执行以下操作:1.克隆facebook stetho存储库。2.将该项目导入最新的Android Studio(文件->导入->“选择settings.gradle”)3.同意更新gradle插件。4.启动Android Emulator(在我的示例中为API 24)5.启动stetho-sample(从绿色箭头旁边的运行配置菜单中选择它)。6.在您的PC上,打开最新的Chrome浏览器7.转到chrome:// inspect地址8。选择你的模拟器在列表9.在打开的窗口中转到资源选项卡10查找左侧下localStorage的菜单中选择您共享偏好11.在布尔标志应用程序播放。
马克西姆Turaev

我昨天解决了问题,而无需查看共享偏好。但是,我将在另一天逐步进行尝试。谢谢。
EduardoMaia

14

您可以简单地创建一个特殊的Activity以进行调试:

@SuppressWarnings("unchecked")
public void loadPreferences() {
// create a textview with id (tv_pref) in Layout.
TextView prefTextView;
prefTextView = (TextView) findViewById(R.id.tv_pref);
    Map<String, ?> prefs = PreferenceManager.getDefaultSharedPreferences(
            context).getAll();
    for (String key : prefs.keySet()) {
        Object pref = prefs.get(key);
        String printVal = "";
        if (pref instanceof Boolean) {
            printVal =  key + " : " + (Boolean) pref;
        }
        if (pref instanceof Float) {
            printVal =  key + " : " + (Float) pref;
        }
        if (pref instanceof Integer) {
            printVal =  key + " : " + (Integer) pref;
        }
        if (pref instanceof Long) {
            printVal =  key + " : " + (Long) pref;
        }
        if (pref instanceof String) {
            printVal =  key + " : " + (String) pref;
        }
        if (pref instanceof Set<?>) {
            printVal =  key + " : " + (Set<String>) pref;
        }
        // Every new preference goes to a new line
        prefTextView.append(printVal + "\n\n");     
    }
}
// call loadPreferences() in the onCreate of your Activity.

这非常有用,但是并不能完全满足我的需求。我添加了允许多个共享首选项文件的编辑
Christopher Rucinski 2015年

谢谢,我只是很难弄清楚如何接受编辑
cYrixmorten

被其他人否认。他们说这应该是自己的答案,所以我把它作为一个新答案。我最初只是编辑您的答案,因为我只能在看到您的答案时做我所做的事情。
克里斯托弗Rucinski

好吧:-)是的,之后我不得不接受其他人的审查
cYrixmorten

13

Android Studio->设备文件资源管理器(右下角)->数据->数据-> {package.id}->共享偏好

注意:您需要将移动设备连接到android studio,并且所选应用程序应处于调试模式


10

这是一篇过时的文章,但是我应该在此处输入图形化答案,因为问题是关于查看SharedPreferences.xml使用Android Studio的问题。所以就到这里。

转到工具-> Android设备监视器。通过单击打开设备监视器。

在此处输入图片说明

然后,您需要在设备监视器中选择“文件资源管理器”选项卡。找到数据文件夹并在其中找到另一个数据文件夹。它将包含一个具有您的应用程序包名称的文件夹,并且会有所需的SharedPreferences.xml

在此处输入图片说明

选择SharedPreferences.xml文件,然后使用上图右上角标记的按钮将文件提取并保存到计算机中。

我已经使用了设备模拟器。


1
感谢您的帖子,我了解了developer.android.com/studio/debug/device-file-explorer,这是您在此处说明的新方法。
马拉拉'18

很高兴知道我可以提供帮助!不用客气。
Reaz Murshed

4

单个或多个共享首选项文件

如果您有多个Shared Preference文件,那么这里是显示所有文件的好方法,但是您也可以传入1个文件名。

  • loadSharedPrefs("pref_name");

  • loadSharedPrefs("shared_pref1", "shared_pref2", "shared_pref3");

选择以下一种以满足您的需求...

单类型值

public void loadSharedPrefs(String ... prefs) {

    // Logging messages left in to view Shared Preferences. I filter out all logs except for ERROR; hence why I am printing error messages.

    Log.i("Loading Shared Prefs", "-----------------------------------");
    Log.i("----------------", "---------------------------------------");

    for (String pref_name: prefs) {

        SharedPreferences preference = getSharedPreferences(pref_name, MODE_PRIVATE);
        for (String key : preference.getAll().keySet()) {

            Log.i(String.format("Shared Preference : %s - %s", pref_name, key),
                  preference.getString(key, "error!"));

        }

        Log.i("----------------", "---------------------------------------");

    }

    Log.i("Finished Shared Prefs", "----------------------------------");

}

多类型值

public void loadSharedPrefs(String ... prefs) {

    // Define default return values. These should not display, but are needed
    final String STRING_ERROR = "error!";
    final Integer INT_ERROR = -1;
    // ...
    final Set<String> SET_ERROR = new HashSet<>(1);

    // Add an item to the set
    SET_ERROR.add("Set Error!");

    // Loop through the Shared Prefs
    Log.i("Loading Shared Prefs", "-----------------------------------");
    Log.i("------------------", "-------------------------------------");

    for (String pref_name: prefs) {

        SharedPreferences preference = getSharedPreferences(pref_name, MODE_PRIVATE);
        Map<String, ?> prefMap = preference.getAll();

        Object prefObj;
        Object prefValue = null;

        for (String key : prefMap.keySet()) {

            prefObj = prefMap.get(key);

            if (prefObj instanceof String) prefValue = preference.getString(key, STRING_ERROR);
            if (prefObj instanceof Integer) prefValue = preference.getInt(key, INT_ERROR);
            // ...
            if (prefObj instanceof Set) prefValue = preference.getStringSet(key, SET_ERROR);

            Log.i(String.format("Shared Preference : %s - %s", pref_name, key),
                  String.valueOf(prefValue));

        }

        Log.i("------------------", "-------------------------------------");

    }

    Log.i("Loaded Shared Prefs", "------------------------------------");

}

}

Logcat输出

我的Shared Preference值是all String,但这是使用上述2种方法之一的输出...

I/Loading Shared Prefs -----------------------------------
I/------------------﹕ -------------------------------------
I/Shared Preference : FAVORITE - 135397 Jurassic World
I/Shared Preference : FAVORITE - 87101 Terminator Genisys
I/Shared Preference : FAVORITE - 177677 Mission: Impossible  Rogue Nation
I/------------------﹕ -------------------------------------
I/Shared Preference : WATCHED - 177677 Mission: Impossible  Rogue Nation
I/Shared Preference : WATCHED - 157336 Interstellar
I/Shared Preference : WATCHED - 135397 Jurassic World
I/Shared Preference : WATCHED - 87101 Terminator Genisys
I/------------------﹕ -------------------------------------
I/Shared Preference : WILL_WATCH - 211672 Minions
I/Shared Preference : WILL_WATCH - 102899 Ant-Man
I/------------------﹕ -------------------------------------
I/Loaded Shared Prefs ------------------------------------

4

另一种简单的方法是在手机上使用Root Explorer应用程序。

然后转到/data/data/package name/shared preferences folder/name of your preferences.xml,您可以使用ES File Explorer,然后转到root设备的,而不是sd card


1
这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,就可以在任何帖子中发表评论。- 评论
卢卡·德托米

@LucaDetomi您知道我要离开这里了
user5291072

您的答案被标记为太短。答案应包含可使用户理解“为什么”的详细信息,这可能是一个好的答案,也许是最好的答案。我建议您添加更多详细信息,以帮助理解原理,并使之适应其他类似问题
Luca Detomi,2016年

4

preference在Android Studio中打开共享

从右侧打开设备资源管理器文件-数据>数据>> shared_prefs

找到附件的图像以获取更多描述


3

Android Studio 3中

  • 打开设备文件资源管理器(屏幕的右下角)。
  • 转到data / data / com.yourAppName / shared_prefs。

或使用Android调试数据库


2

插入一些数据后,在Emulator中运行该应用程序,只需关闭该应用程序即可。

现在打开DDMS或Android Monitor,然后选择仿真器,在右侧,您可以看到文件资源管理器,在其中查找Data文件夹,并找到您创建的应用程序包,因为您可以找到共享的首选项文件它,您可以看到XML文件,单击它,然后单击从右上角的设备按钮中提取文件。

XML文件将保存在所需的位置,然后您可以使用任何编辑器(如notepad ++)打开它,并可以查看输入的数据。


Android Studio 3.0中,我在设备文件资源管理器 >数据>数据>(程序包名称)> shared_prefs>(程序包名称)_preferences.xml中找到它
Josselin

2

在设备文件资源管理器中,遵循以下路径:-

/data/data/com.**package_name**.test/shared_prefs/com.**package_name**.test_preferences.xml

1

我总是在控制台中找到以下命令:

  1. 找到正确的文件名

    adb shell

    ls /data/data/com.your.package/shared_prefs

  2. 将文件获取到本地目录

    adb pull /data/data/com.your.package/shared_prefs/the_file_you_want $local_dir

  3. 检查您的$local_dir


1

如果使用仿真器,则可以sharedPrefs.xml使用以下命令在终端上查看文件:

  • adb root
  • cat /data/data/<project name>/shared_prefs/<xml file>

之后,adb unroot如果您不想让虚拟设备保持根目录,则可以使用。

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.