一、前言
Android API从21后开始,不再直接支持通过SystemProperties.get/set
方式来获取/设置系统属性。
目前有两种方式可以获取/设置系统属性,分别为通过反射方法及AndroidStudio中通过引入jar包来解决。
二、方法一
通过反射方式来进行系统属性操作,代码如下:
package com.example.SystemPropertiesUtils;
import java.lang.reflect.Method;
public final class SystemPropertiesUtils {
private static final String CLASS_NAME = "android.os.SystemProperties";
public static String getProperty(String key, String defaultValue) {
String value = defaultValue;
try {
Class<?> c = Class.forName(CLASS_NAME);
Method get = c.getMethod("get", String.class, String.class);
value = (String)(get.invoke(c, key, defaultValue));
} catch (Exception e) {
e.printStackTrace();
} finally {
return value;
}
}
public static void setProperty(String key, String value) {
try {
Class<?> c = Class.forName(CLASS_NAME);
Method set = c.getMethod("set", String.class, String.class);
set.invoke(c, key, value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
调用方法如下:
void SysPropTest() {
// get prop
String value = SystemPropertiesUtils.getProperty("persist.adb.tcp.port", "0");
// set prop
SystemPropertiesUtils.setProperty("persist.adb.tcp.port", "5555");
}
三、方法二
AndroidStudio app下的 build.gradle中,添加以下代码:
// add begin
String SDK_DIR = System.getenv("ANDROID_HOME")
if(SDK_DIR == null) {
Properties props = new Properties()
props.load(new FileInputStream(project.rootProject.file("local.properties")))
SDK_DIR = props.get('sdk.dir');
}
// add end
dependencies {
// add begin
provided files("${SDK_DIR}/platforms/android-20/data/layoutlib.jar")
// add end
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
注意,sdk中需要预先下载android-20。
使用方法:
// 引入包名
import android.os.SystemProperties;
class Test {
void SysPropTest() {
// get prop
String value = SystemProperties.get("persist.adb.tcp.port", "0");
// set prop
SystemProperties.set("persist.adb.tcp.port", "5555");
}
}
四、总结
如果是在AOSP源码中编译,我们可以选择方法一。
如果是在AndroidStudio中操作,可以选择方法二。
AOSP及AndroidStudio中都编译,建议采用方式一反射的方法获取。