【问题标题】:Android Shell edited file isn't recognized by app anymoreAndroid Shell 编辑的文件不再被应用识别
【发布时间】:2014-12-08 12:14:14
【问题描述】:

第一次发帖,如有错误,我深表歉意。 :) 我在这个问题上搜索了很长时间,但找不到任何东西。

我正在尝试编辑另一个 android 应用程序的 shared_preferences 文件。 (我有开发人员的许可。)该文件是这样的 xml 结构:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="password">XYZ</string>
    <string name="username">XYZ</string>
    <boolean name="2.6.0.5" value="false" />
    <boolean name="disclaimer.isAccepted" value="true" />
    <string  name="safeForMode2">7</string>
</map>

我使用根终端加载文件,编辑内容并将其写回文件。

加载代码:

String[] commands = {"cd <directory>", "cat pref-file.xml"};  
String output = RunAsRoot(commands);
settings = output;

编写代码:

String[] commands = {"cd <directory>", "echo '" + settings + "' > pref-file.xml"};
RunAsRoot(commands);

RunAsRoot 获取 SU-Privilieges 并执行字符串数组中的命令。这部分工作正常。

如果我使用例如编辑文件ES 文件资源管理器,一切正常。设置已应用并且可以正常工作。如果我尝试使用上述代码对其进行编辑,则应用无法识别修改后的文件,并将被其标准 xml 覆盖,从而导致应用设置完全重置。

我已经检查了文件权限并将它们设置为与源文件相同,但应用程序不会接受它。在文本编辑器中,两个版本的文件看起来完全一样。

您以前是否在某个地方遇到过这个问题?看起来,这两个文件彼此相同。我找不到应用程序不接受它的原因。如果您需要更多 coden-ps,我很乐意发布它们。

再次,如果这个问题之前已经回答过,我们深表歉意。在这种情况下,我很乐意获得链接。 ;)

提前致谢!

编辑:修复了 xml-example 中的一个错误。不包括标题。

【问题讨论】:

  • 这里只是猜测,但它与编码有什么关系吗?编辑后的 ​​XML 文件很可能需要编码为 UTF-8 才能被识别。
  • @JASONGPETERSON:ES 文件资源管理器显示两个版本都是 UTF-8 编码的。 ://
  • 使用chown 恢复文件的所有权信息
  • 在编辑之前从文件中读取文件所有者和权限,并在写入过程之后再次设置。正如我所说 - 一切看起来都一样。

标签: android shell adb root preferences


【解决方案1】:

使用 awk 更改文件内容并使用 dd 将其写回:

awk '/map/{print " <string name=\"foo\">"}1 | dd of=/path/to/xml

这会保留原始文件,但会交换整个内容。

【讨论】:

  • 谢谢,这解决了我的问题。查看我的答案以获取完整代码。 :)
【解决方案2】:

感谢 kuhno,我能够解决问题。我使用他的解决方案将设置添加到文件底部:

public void AddSetting(int value) throws Throwable {
    // Change directory, insert Setting in XML and write changes back to file
    String[] commands = {
            "cd <directory>",
            "awk '/\\/map/{print \"    <string name=\\\"setting\\\">" + value + "</string>\"}1' pref-file.xml | dd of=pref-file.xml"
    };

    RunAsRoot(commands);
}

我正在使用“sed”更改设置(如果它已经存在):

public void ChangeSetting(int value) throws Throwable {
    // Change directory, replace Setting in XML
    String[] commands = {
            "cd <directory>",
            "sed -i 's|<string name=\"setting\">.|<string name=\"setting\">" + value + "|' pref-file.xml"
    };

    RunAsRoot(commands);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多