如何在Android Instrumentationtesting中定义和使用系统属性?

我正在尝试使用一些参数进行Instrumentationtesting。 我注意到我可以通过System.getProperty()函数读取系统属性。 所以我使用setprop命令来设置系统属性。 例如: adb shell setprop AP 123 。 在我的testing代码里面我尝试阅读这个AP属性:

 tmp = System.getProperty("AP"); Log.d("MyTest","AP Value = " + tmp); 

然后我使用logcat来查看这个debugging消息,但我得到这个属性的空值。 任何想法可能是错的? 请注意,我仍然可以使用adb shell getprop AP命令读取系统属性。

Solutions Collecting From Web of "如何在Android Instrumentationtesting中定义和使用系统属性?"

要获得“setprop”设置的属性,有两个选项:
一。 使用android.os.SystemProperties,这是一个隐藏的API。 像这样使用它:

 Class clazz = null; clazz = Class.forName("android.os.SystemProperties"); Method method = clazz.getDeclaredMethod("get", String.class); String prop = (String)method.invoke(null, "AP"); Log.e("so_test", "my prop is: <" + prop + ">"); 

二。 使用'getprop'工具:

 Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/getprop", "AP"}); BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); Log.e("so_test", "my prop is: " + reader.readLine()); 

也许使用NDK中可用的函数也是一个选项,但是为什么呢?

当启动根VM(Zygote)时,系统属性会被读取一次,然后生成其他Dalvik虚拟机,就像您的应用程序一样。 这意味着您无法即时设置系统属性。

尝试使用adb shell stop (等到停止)重新启动Zygote,并且adb shell start (等到它重新启动),然后重试。 或者干脆重新启动设备或模拟器。

因为Android中有两种types的属性。

  1. 系统级别 – 我们可以使用命令adb shell getprop/setprop来获取/设置。
  2. 在当前的进程级别 – 我们可以使用普通的java System.getProperty()/setProperty()设置/设置。

在设置系统级属性并尝试将其值作为当前进程级别时,您将在日志中获得空值。

基于accuya的回答,这里是一个稍微精简的版本:

 public static String readSystemProperty(String name) { InputStreamReader in = null; BufferedReader reader = null; try { Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/getprop", name}); in = new InputStreamReader(proc.getInputStream()); reader = new BufferedReader(in); return reader.readLine(); } catch (IOException e) { return null; } finally { closeQuietly(in); closeQuietly(reader); } } public static void closeQuietly(Closeable closeable) { if (closeable == null) return; try { closeable.close(); } catch (IOException ignored) { } } 

导入android.os.SystemProperties

String s = SystemProterties.get(“ro.xxx.xxx”,如果属性未设置,则为默认值);