AS项目中,当出现错误: 找不到符号 符号: 类android.os.SystemProperties,一般解决办法就是导入layoutlib.jar,得到
android.os.SystemProperties类即可,下面我们详细介绍一下!
Android的系统属性相当于Windows的注册表,由key和value组成,且都是核心系统的一个基本机制。相对于Windows的注册表,Android的系统属性要简单一些,它没有Windows注册表的树状结构,而只是一个列表,也就是说没有父子关系。value有string,int,long,boolean,但是设置只能通过字符串方式。读取系统属性,是通过SystemProperties类来实现的。SystemProperties在android.os下,但这个类是隐藏的,上层程序开发无法直接使用。要使用这个类,有两种方法。一个是导入layoutlib.jar
,另外一种是通过反射的方式调用。
一、导入layoutlib.jar
1.首先我们到sdk确认layoutlib.jar的存在,比如我项目目录下
2.然后在 /app/build.gradle 添加下面这段代码到末尾(注意一定要在 android 、dependencies之后)
String SDK_DIR = System.getenv("ANDROID_SDK_HOME")
if (SDK_DIR == null) {
Properties props = new Properties()
props.load(new FileInputStream(project.rootProject.file("local.properties")))
SDK_DIR = props.get('sdk.dir');
}
dependencies {
compileOnly files("${SDK_DIR}/platforms/android-24/data/layoutlib.jar")
}
该步骤是通过在gradle中添加函数,动态获取layoutlib.jar
路径,需要注意的是
compileOnly files("${SDK_DIR}/platforms/android-24/data/layoutlib.jar")
引入依赖的时候要用 compileOnly 而非旧版本AS的 provided即可,并且这个路径中,需要确定android-24/data/layoutlib.jar 中有android/os/systemProperites.class 。如果没有,可以在其他版本中查找,如adnroid-23,有的话把这个替换成android-23.。
3.导入之后,直接
import android.os.SystemProperties;
就可以正常使用了。注意:引入的layoutlib.jar
并不会编译到APK包里面,因此不需要担心增加最终的APK的大小的情况。
二、反射调用
对于不想引入layoutlib.jar
的情况,可以直接使用下面的反射类(PropertyUtils.class)来实现调用。
import java.lang.reflect.Method;
public class PropertyUtils {
private static volatile Method set = null;
private static volatile Method get = null;
public static void set(String prop, String value) {
try {
if (null == set) {
synchronized (PropertyUtils.class) {
if (null == set) {
Class<?> cls = Class.forName("android.os.SystemProperties");
set = cls.getDeclaredMethod("set", new Class<?>[]{String.class, String.class});
}
}
}
set.invoke(null, new Object[]{prop, value});
} catch (Throwable e) {
e.printStackTrace();
}
}
public static String get(String prop, String defaultvalue) {
String value = defaultvalue;
try {
if (null == get) {
synchronized (PropertyUtils.class) {
if (null == get) {
Class<?> cls = Class.forName("android.os.SystemProperties");
get = cls.getDeclaredMethod("get", new Class<?>[]{String.class, String.class});
}
}
}
value = (String) (get.invoke(null, new Object[]{prop, defaultvalue}));
} catch (Throwable e) {
e.printStackTrace();
}
return value;
}
}
导入之后,直接调用即可,比如 PropertyUtils.get("persist.sys.productivity_mode","0"));