Android系统开发之Systemproperties的反射用法及如何自定义名称

本文原作者 长鸣鸟 ,未经同意,转载不带名的严重鄙视。
Systemproperties的作用就不说了,先简述一下其用法:

SystemProperties.set("persist.sys.enable","true");//将persist.sys.enable的值设置为true
SystemProperties.get("persist.sys.enable","false");//获取persist.sys.enable的值,如果获取不到,以“false”作为默认值

如果想得到一个bool值,可以用:

SystemProperties.getBoolean("persist.sys.enable",false);

其他类似。

不过在这之前,应将该应用调为系统级别应用。
AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.setupwizard"
    android:versionCode="01080000"
    android:versionName="1.0" 
   +android:sharedUserId="android.uid.system">

但这只适用于Android Source的开发者,普通app开发只能使用反射方法。
谷歌反对这种用法,但存在即合理,下面是我写的一个示例,可以直接拿去用,不谢:

package com.android.xxx;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.content.Context;
import android.net.ConnectivityManager;

public class SysProp {

    private static Method sysPropGet;
    private static Method sysPropSet;

    private SysProp() {
    }

    static {
        try {
            Class<?> S = Class.forName("android.os.SystemProperties");
            Method M[] = S.getMethods();
            for (Method m : M) {
                String n = m.getName();
                if (n.equals("get")) {
                    sysPropGet = m;
                } else if (n.equals("set")) {
                    sysPropSet = m;
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static String get(String name, String default_value) {
        try {
            return (String) sysPropGet.invoke(null, name, default_value);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return default_value;
    }

    public static void set(String name, String value) {
        try {
            sysPropSet.invoke(null, name, value);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

本文原作者 长鸣鸟 ,未经同意,转载不带名的严重鄙视。
可以通过命令adb shell :

   getprop查看设备上所有属性状态值。
   或者 getprop XX.XX查看某个属性状态
   使用setprop XX.XX yy 设置某个属性的状态

下面问题来了,如果我要新增一个属性persist.backdata.enable怎么办?
按照正常思路,应该是SystemProperties.set("persist.backdata.enable","false");
可惜这个命名不符规则。
编译不会出错,但什么也写不进去,当然也读不出来。
我们的方法没有错,错的是规则,那么我们就来修改规则。
打开external/sepolicy/property_contexts,加上一句:

@@ -56,6 +56,7 @@ 
 persist.sys.            u:object_r:system_prop:s0
 persist.service.        u:object_r:system_prop:s0
 persist.service.bdroid. u:object_r:bluetooth_prop:s0
 persist.security.       u:object_r:system_prop:s0
+persist.backdata.      u:object_r:system_prop:s0

整编系统后就可以正常使用persist.backdata.*
本文原作者 长鸣鸟 ,未经同意,转载不带名的严重鄙视。
That's all.

阅读 9.4k

推荐阅读
仗剑长行
用户专栏

android.物联网

1 人关注
4 篇文章
专栏主页