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

Posted

技术标签:

【中文标题】如何使用 Android Studio 查看共享首选项文件?【英文标题】:How can I view the shared preferences file using Android Studio? 【发布时间】:2014-07-01 09:16:32 【问题描述】:

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

【问题讨论】:

安装 ES File Explorer 并启用 root 浏览。然后你就可以直接在手机上打开了。 尝试使用 adb pull 将文件提取到桌面。 adb pull /data/data/<packagename>/shared_prefs/prefs.xml 或转到文件资源管理器并在文件树中,在 /data/data/com.your-package/shared_prefs 下找到您应用的数据文件夹。首选项文件将以 XML 形式存在。从设备复制它并享受。在文件资源管理器视图的右上角,有两个图标按钮 - 一个带有磁盘,一个带有手机。这些按钮将允许您分别从手机/模拟器复制文件。 由于某种原因,我的 prefs xml 文件被称为 _preferences.xml 【参考方案1】:

Android Studio 3.x 中的设备文件资源管理器非常适合探索您的偏好文件、缓存项或数据库。

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

看起来像这样

打开设备文件资源管理器:

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

【讨论】:

打开设备文件资源管理器(屏幕右下角)。 文件可以编辑保存吗? 您可以“另存为...”文件然后修改它并替换原始文件。 @AndreyLiashuk 如何替换原文件? @Daniel 我只是删除原始文件,然后上传更新的变体。幸运的是,设备文件资源管理器支持删除和上传操作。【参考方案2】:

从 Android Studio 中,启动 Android Device Monitor,转到文件资源管理器,然后浏览“/data/data//shared_prefs/”。您会在那里找到 XML……您也可以复制它以供检查。

如果您的设备没有 root 权限,则无法直接从 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 目录中提取文件。

【讨论】:

我无法从设备监视器访问此文件夹。需要Root吗? 第二种方法适用于无根设备。将文件复制到 sd 卡后,您可以退出 adb 并运行 adb pull "/sdcard/your_preferences_file",您将在当前目录中获得一个可以检查的 xml 文件。 如果您可以通过这种方式进行调试,您实际上可以从没有 root 的模拟器中获取此信息。如果您使用的是物理设备,则需要 root。 在AndroidStudio的右下角寻找设备文件浏览器。它将让您轻松访问设备文件系统 使用设备文件资源管理器,我可以在没有 root 访问权限的情况下访问共享首选项【参考方案3】:

更新:Flipper

Flipper 是 facebook 的一个较新的替代品。它有更多的功能。并积极维护

听诊器

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

特点:

    查看和编辑共享首选项 查看和编辑 sqLite db 查看视图层次结构 监控 http 网络请求 从设备屏幕查看流 还有更多......

基本设置:

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

你也可以使用@Jeffrey 建议:

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

【讨论】:

这可以在模拟器上运行吗?我似乎无法让它工作 @EduardoMaia 它应该。我每天都在模拟器上使用它。您可以使用屏幕截图创建问题,因此我会尽力帮助您。 @EduardoMaia 您可以尝试执行以下操作: 1. 克隆 facebook stetho 存储库。 2. 将此项目导入最新的 Android Studio (File->Import->"choose settings.gradle") 3. 同意更新 gradle 插件。 4. 启动 Android Emulator(在我的情况下为 API 24) 5. 启动 stetho-sample(从绿色箭头旁边的运行配置菜单中选择它 6. 在您的 PC 上打开最新的 Chrome 浏览器 7. 访问 chrome://inspect 地址 8.在列表中选择您的模拟器。9.在打开的窗口中转到资源选项卡。10.在左侧的 LocalStorage 菜单下找到您的共享首选项。11.在应用程序中使用布尔标志 我昨天解决了我的问题,无需查看共享首选项。但我会在另一天一步一步地尝试。谢谢。 Stetho 已过时。为此,您需要使用 Flipper 或其他一些工具。【参考方案4】:

Android Studio -> 设备文件资源管理器(右下角)-> 数据 -> 数据 -> package.id -> 共享首选项

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

【讨论】:

【参考方案5】:

这是一篇旧帖子,但我认为我应该在这里给出一个图形答案,因为问题是关于使用 Android Studio 查看SharedPreferences.xml。就这样吧。

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

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

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

我使用了设备模拟器。

【讨论】:

感谢您的帖子,我了解到developer.android.com/studio/debug/device-file-explorer,这是您在此处解释的新方法。【参考方案6】:

您可以简单地创建一个特殊的 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.

【讨论】:

这非常有用,但不太适合我的需要。我添加了一个允许多个共享首选项文件的编辑 谢谢,我只是不知道如何接受修改 被其他人否认。他们说它应该是它自己的答案,所以我把它作为一个新的答案。我最初只是编辑了你的答案,因为我只能在看到你的答案时做我所做的事情。 好吧 :-) 是的,后来我想到了它必须由其他人审查【参考方案7】:

在android studio中打开共享preference

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

找到附加的图像以获得更多描述

【讨论】:

图片附在哪里 在 Android Studio 4.1 中,路径是 data/data/[YOUR_APP_PACKAGE]/shared_prefs/【参考方案8】:

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

如果您有多个 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 值都是String,但这是使用上述两种方法之一的输出...

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﹕ ------------------------------------

【讨论】:

【参考方案9】:

另一种简单的方法是在手机上使用根资源管理器应用。

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

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 - From Review @LucaDetomi 你知道我在外面做什么 您的答案被标记为太短。答案应该包含让用户理解“为什么”的细节,这可能是一个很好的答案,也许是最好的答案。我建议您添加更多有助于理解原则的细节,并可能使其适应其他类似问题【参考方案10】:

Android Studio 3 中:

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

或使用Android Debug Database

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

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

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

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

【讨论】:

Android Studio 3.0 中,我在 Device File Explorer > data > data > (package name) > shared_prefs > (package name) 中找到它_preferences.xml【参考方案13】:

如果您使用的是模拟器,您可以使用以下命令在终端上看到 sharedPrefs.xml 文件:

adb root cat /data/data/&lt;project name&gt;/shared_prefs/&lt;xml file&gt;

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

【讨论】:

谢谢!生根模拟器帮助从发布构建 apk 复制文件【参考方案14】:

我总是发现这些命令在控制台中很有用:

    找到正确的文件名

    adb shell

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

    获取文件到本地目录

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

    在您的$local_dir 中查看。

【讨论】:

如果您的模拟器/设备没有root并且应用程序不可调试,ls 命令将打印:ls: /data/data/com.your.package/shared_prefs: Permission denied。您可以将ls 更改为cd。但是下一个命令也无法接收文件。在模拟器上测试。要修复,您应该 root 模拟器/设备。当然,生根是一项危险的操作。然后你应该取消root。【参考方案15】:

Mac 中 Android 模拟器的共享首选项文件路径

/Users/"UserName"/Documents/AndroidStudio/DeviceExplorer/"EmulatorName"/data/data/com.app.domain/shared_prefs/

【讨论】:

以上是关于如何使用 Android Studio 查看共享首选项文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用android中的共享首选项将数据保存在editText中[重复]

如何在android studio项目中包含共享库?

如何保护 Android 共享首选项?

如何在没有Android Studio的情况下编译JNI共享库,并在[关闭]中编译依赖项

iOS 等效于 Android 共享首选项

如何在android studio项目中为类似于flappy bird的简单2D游戏保存高分?