这里的第一次海报,我为任何错误道歉。 :)我在这个问题上搜索了很长时间,却找不到任何东西。
我正在尝试编辑另一个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示例中的错误。标题不包括在内。
答案 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);
}