如何在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命令读取系统属性。

  • Android Studio - ADB错误 - “...设备未经授权。 请检查设备上的确认对话框。“
  • 使用ADB跟踪应用程序的networking统计信息(netstats)
  • Android adb推送到设备中的位置,没有SD卡和根访问权限
  • 在LogCat中过滤标签(在Android Eclipse插件中)
  • 我如何使用adb发送longpress重要事件?
  • Android - 不能安装* smartsocket * listener
  • Adb shell命令来更改设置或在手机上执行任务
  • 如何安装任何Android设备的ADB驱动程序?
  • 要获得“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”,如果属性未设置,则为默认值);