26

我正在尝试使用一些参数进行仪器测试。我注意到我可以使用System.getProperty()函数读取系统属性。所以我使用 setprop 命令来设置系统属性。例如:adb shell setprop AP 123。在我的测试代码中,我尝试使用以下命令读取此 AP 属性:


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

然后我使用 logcat 查看此调试消息,但我得到此属性的空值。关于什么可能是错误的任何想法?请注意,我仍然可以使用adb shell getprop AP命令读取系统属性。

4

7 回答 7

25

要获取 '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 中可用的函数也是一种选择,但为什么要麻烦呢?

于 2012-07-24T02:33:01.593 回答
15

启动根 VM (Zygote) 时会读取一次系统属性,这反过来会生成其他 Dalvik VM,例如您的应用程序。这意味着您不能即时设置系统属性。

adb shell stop尝试使用(wait until it has stopped) 和(wait until it has restarted)重新启动 Zygote adb shell start,然后重试。或者只是重新启动设备或模拟器。

于 2011-04-09T09:50:33.587 回答
11

因为Android中有两种类型的属性。

  1. 系统级别 - 我们可以使用命令获取/设置adb shell getprop/setprop
  2. 在当前进程级别 - 我们可以使用常规 java 获取/设置System.getProperty()/setProperty()

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

于 2011-06-07T13:42:58.237 回答
6

这是基于 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) {
    }
}
于 2015-07-31T22:51:38.597 回答
0

根据提供的答案,SetProperty 的略微修改版本

    public void setSystemProperty(String Key, String value){
    InputStreamReader in = null;
    BufferedReader reader = null;
    try {
        Process proc = Runtime.getRuntime().exec("/system/bin/setprop "+Key+" "+value);
        in = new InputStreamReader(proc.getInputStream());
        reader = new BufferedReader(in);

        String line = null;
        Log.d("Saurabh Shell" ,"<OUTPUT>");
        while ( (line = reader.readLine()) != null)
            Log.d("Shell" , line);
        Log.d("Saurabh Shell", "</OUTPUT>");
        int exitVal = proc.waitFor();
        Log.d("Saurabh Shell","Process exitValue: " + exitVal);

    } catch (IOException e) {
       e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        closeQuietly(in);
        closeQuietly(reader);
    }
}

关闭输入和阅读器

    public  void closeQuietly(Closeable closeable) {
    if (closeable == null) return;
    try {
        closeable.close();
    } catch (IOException ignored) {
    }
}
于 2018-10-09T18:30:54.633 回答
0

您需要一个根来设置系统属性

adb shell
su
setprop AP 123
于 2020-12-01T09:29:08.453 回答
-4

导入 android.os.SystemProperties

String s = SystemProterties.get("ro.xxx.xxx","属性未设置时的默认值");

于 2017-04-28T18:06:01.537 回答