Android Shell编辑的文件不再被应用程序识别

时间:2014-12-08 12:14:15

标签: android shell adb root preferences

这里的第一次海报,我为任何错误道歉。 :)我在这个问题上搜索了很长时间,却找不到任何东西。

我正在尝试编辑另一个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>

我使用root-terminal加载文件,编辑内容并将其写回文件。

正在加载代码:

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并执行String-Array中的命令。这部分工作正常。

如果我使用例如编辑文件ES文件资源管理器,一切正常。设置已应用且有效。如果我尝试使用上面的代码编辑它,应用程序将无法识别修改后的文件,并且将使用它的标准xml覆盖该修改后的文件,从而完全重置应用程序的设置。

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

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

再次,如果以前已经回答过这个问题,请道歉。在这种情况下,我会很高兴得到一个链接。 ;)

提前致谢!

编辑:修复了xml示例中的错误。标题不包括在内。

2 个答案:

答案 0 :(得分:2)

使用awk更改文件内容并使用dd:

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

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

答案 1 :(得分:-1)

感谢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);
}