我需要设置并获取名为"persist.sys.aabbcc"的系统属性.我能够使用adb shell命令读取/写入值,如下所示:
adb shell setprop persist.sys.aabbcc 123456
Run Code Online (Sandbox Code Playgroud)
和:
adb shell getprop persist.sys.aabbcc
123456
Run Code Online (Sandbox Code Playgroud)
我还可以使用Reflection在java Android中读取此属性:
@SuppressWarnings("rawtypes")
Class SystemProperties = Class.forName("android.os.SystemProperties");
//Parameters Types
@SuppressWarnings("rawtypes")
Class[] paramTypes = new Class[1];
paramTypes[0] = String.class;
Method get = SystemProperties.getMethod("get", paramTypes);
//Parameters
Object[] params = new Object[1];
params[0] = new String("persist.sys.aabbcc");
ret = (String) get.invoke(SystemProperties, params);
Run Code Online (Sandbox Code Playgroud)
或者使用Linux命令exec:
try
{
String line;
java.lang.Process p = Runtime.getRuntime().exec("getprop persist.sys.aabbcc");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null)
{
System.out.println(line);
Log.d("HelloDroid", line);
}
input.close();
}
catch (Exception err)
{
err.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
但是我不能设置(写)该属性.我的代码(似乎不起作用)是:
try {
@SuppressWarnings("rawtypes")
Class SystemProperties = Class.forName("android.os.SystemProperties");
Method set1 = SystemProperties.getMethod("set", new Class[] {String.class, String.class});
set1.invoke(SystemProperties, new Object[] {"persist.sys.aabbcc", "999999"});
} catch( IllegalArgumentException iAE ){
throw iAE;
} catch( Exception e ){
ret= "";
}
Run Code Online (Sandbox Code Playgroud)
不工作也使用exec:
process = Runtime.getRuntime().exec("setprop persist.sys.aabbcc 555");
Run Code Online (Sandbox Code Playgroud)
如果你能在Android java中设置系统属性,请告诉我吗?谢谢.
小智 5
在命令行上运行与通过应用程序设置有很大区别。当您在 shell 中 su 时,进程将以 root 身份运行,当命令最终到达属性服务并检查您的 UID 时,它将允许写入,因为 root 可以写入任何属性。
当您反映 android.os.SystemProperties 并进行调用时,您将以应用程序的 UID 发出请求,并且该请求将被拒绝,因为属性服务具有允许写入特定关键域的 UID 的 ACL,请参阅 /system /core/init/property_service.c
请参阅我的答案,了解如何使其工作:/sf/answers/778652661/
如何获取/设置属性
Android 上获取/设置属性的主要方法有3 种。
本机代码 在编写本机应用程序时,可以使用 property_get 和 property_set API 来获取/设置属性。要使用它们,我们需要包含 cutils/properties.h 并链接到 libcutils。
java代码 Android还在java库中提供了System.getProperty和System.setProperty函数,我们的java应用程序可以使用它们来获取/设置属性。但值得注意的是,尽管这些 java API 在语义上与本机版本相同,但 java 版本将数据存储在完全不同的位置。实际上,dalvik VM 使用哈希表来存储属性。因此,java 属性是分离的,它不能获取或设置本机属性,反之亦然。
更新:Andrew 提到 android.os.SystemProperties 类可以操作本机属性,尽管它仅供内部使用。它通过 jni 调用本机属性库来获取/设置属性。
shell 脚本 Android 提供 getprop 和 setprop 命令行工具来检索和更新属性。它们可以在 shell 脚本中使用。它们是在 libcutils 之上实现的。