无法在Android中使用Reflection或Linux命令exec在Android中设置系统属性

tru*_*ung 6 android

我需要设置并获取名为"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/


Pad*_*mar 2

如何获取/设置属性

Android 上获取/设置属性的主要方法有3 种。

  1. 本机代码 在编写本机应用程序时,可以使用 property_get 和 property_set API 来获取/设置属性。要使用它们,我们需要包含 cutils/properties.h 并链接到 libcutils。

  2. java代码 Android还在java库中提供了System.getProperty和System.setProperty函数,我们的java应用程序可以使用它们来获取/设置属性。但值得注意的是,尽管这些 java API 在语义上与本机版本相同,但 java 版本将数据存储在完全不同的位置。实际上,dalvik VM 使用哈希表来存储属性。因此,java 属性是分离的,它不能获取或设置本机属性,反之亦然。

    更新:Andrew 提到 android.os.SystemProperties 类可以操作本机属性,尽管它仅供内部使用。它通过 jni 调用本机属性库来获取/设置属性。

  3. shell 脚本 Android 提供 getprop 和 setprop 命令行工具来检索和更新属性。它们可以在 shell 脚本中使用。它们是在 libcutils 之上实现的。