添加全局变量开关(三种方式)
1. android.provider.Settings.System.getInt(getContentResolver(),"test", 0);
android.provider.Settings.System.putInt(getContentResolver(),"test", 1);
Settings有System Global Secure
2.1 定义: ./frameworks/base/core/res/res/values/symbols.xml:
<java-symbol type="bool" name="config_sms_ringtone_incall" />
2.2 定义: ./frameworks/base/core/res/res/values/config.xml:
<bool name="config_sms_ringtone_incall">true</bool>
2.3读取: context.getResources().getBoolean(com.android.internal.R.bool.config_sms_ringtone_incall)
3.system.prop中添加:
tinno_gms_able = false
使用:
import android.os.SystemProperties;
SystemProperties.getBoolean("tinno_gms_able", false);
system.prop生成的位置: out/target/product/l5261/system/build.prop
对属性的读写操作
adb shell getprop key
adb shell setprop key value (eng版本)
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_HDMI_CEC)) {
traceBeginAndSlog("StartHdmiControlService");
mSystemServiceManager.startService(HdmiControlService.class);
traceEnd();
}
在系统中常用为遇到判断系统是否支持某功能用hasSystemFeature方法判断
SystemFeature 配置在frameworks/native/data/etc路径下,在pkms启动时会读取和解析这些xml文件,
初始值文件在framework/base/package/SettingProvider/ com.android.providers.settings/DatabaseHelper.java
loadBooleanSetting(stmt, Settings.Global.AIRPLANE_MODE_ON,R.bool.def_airplane_mode_on);
需要在xml中声明:
base/packages/SettingsProvider/res/values/defaults.xml:25: <bool name="def_airplane_mode_on">false</bool>
需要在java声明:
public static final String AIRPLANE_MODE_ON = "airplane_mode_on";
使用:
private void updateAirplaneMode(boolean force) {
boolean airplaneMode = (Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) == 1);
-----------------
final ContentResolver cr = mContext.getContentResolver();
Settings.Global.putInt(cr, Settings.Global.AIRPLANE_MODE_ON, enable ? 1 : 0);
查看系统属性:
adb shell “getprop | grep xxxx” 或直接 getprop xxxxx 两者查询显示结果稍有不同如下:
xxxxx:/system # getprop ro.fota.app
5
xxxxx:/system # getprop |grep ro.fota.app
[ro.fota.app]: [5]
或是使用:
C:\Users\User>adb shell getprop | findstr "ro.fota.app"
[ro.fota.app]: [5]
具体实现架构看此文章:https://www.cnblogs.com/cyqx/p/5764261.html
1.导包
import android.os.SystemProperties;
2. Android SystemProperties设置/读取
#设置
Systemproperties.set(name, value);
#读取
Systemproperties.get(name);
进行系统属性设置的程序也必须有system或root权限,
如何将android程序的权限提升到system权限?方法是这样的:
1、在AndroidManifest.xml中,在manifest加入android:sharedUserId="android.uid.system"。
2、在Android.mk中,將LOCAL_CERTIFICATE := XXX修改成LOCAL_CERTIFICATE :=platform。
经过以上两步就可以把ap的权限提升到system权限了。但是用这种方法提升权限有两个弊端,如下:
1、程序的拥有者必须有程序的源码;
2、程序的拥有者还必须有android开发环境,就是说自己能make整个android系统。
一般能做这两点的,基本上都是开发人员!
2.Android 的系统属性(SystemProperties)设置分析
Android 的系统属性包括两部分:文件保存的持久属性和每次开机导入的cache属性。前者主要保存在下面几个文件中:
需要注意的是android属性的名称是有一定的格式要求的,如下:前缀必须用system\core\init\property_service.c中定义的前缀,
bionic/libc/include/sys/_system_properties.h
#define PROP_SERVICE_NAME "property_service"
#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"
#define PROP_PATH_SYSTEM_BUILD "/system/build.prop"
#define PROP_PATH_SYSTEM_DEFAULT "/system/default.prop"
#define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop"
后者则通过frameworks/base/core/java/android/os/SystemProperties.java的接口定义,
private static native String native_get(String key);
private static native String native_get(String key, String def);
private static native void native_set(String key, String def);
public static void set(String key, String val) {
if (key.length() > PROP_NAME_MAX) {
throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
}
if (val != null && val.length() > PROP_VALUE_MAX) {
throw new IllegalArgumentException("val.length > " +
PROP_VALUE_MAX);
}
native_set(key, val);
}
该接口类在初始化运行环境中注册对应的cpp接口android_os_SystemProperties.cpp,实际操作通过JNI调用的是cpp文件对应的接口:
http://blog.csdn.net/ameyume/article/details/8056492
frameworks/base/core/jni/AndroidRuntime.cpp
namespace android {
extern int register_android_os_SystemProperties(JNIEnv *env);
}
init进程将会从以下文件中加载属性:
1: /default.prop
2: /system/build.prop
3: /system/default.prop
4: /data/local.prop
build.prop的生成是由make系统解析build/core/Makefile完成。buildinfo.sh 脚本就是专门用于生成build.prop文件,build.prop的生成是由make系统解析build/core/Makefile文件完成,并把系统默认的system.prop以及定制的system.prop中的设定追加到build.prop文件中
1、build/tools/buildinfo.sh
添加的一般都是前缀为“ro.”的只读系统属性
2、device/$(TARGET_DEVICE_DIR)/system.prop
3、在Makefile中的参数ADDITIONAL_BUILD_PROPERTIES中添加
添加的一般是特定平台或者产品的特定系统属性
4、在Makefile中的参数PRODUCT_PROPERTY_OVERRIDES中添加
添加的一般是特定平台或者产品的特定系统属性
比如device/rockchip/common/device.mk
5、system/core/rootdir/int.rc中on post-fs-data下添加
添加个人自定义的一些系统属性
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。
(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护
进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务
名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。客户端应用程序可以轮询那个属性值,以确定结果。
一般我们自定义属性就在对应的项目下 : device/$(TARGET_DEVICE_DIR)/system.prop 定义自己的属性即可
1) Makefile中首先定义各种变量,这在下一步执行时会用到
比如:
PRODUCT_DEFAULT_LANGUAGE="$(calldefault-locale-language,$(PRODUCT_LOCALES))" \
PRODUCT_DEFAULT_REGION="$(calldefault-locale-region,$(PRODUCT_LOCALES))" \
...
2) Makefile中调用build/tools/buildinfo.sh执行脚本,并输出到build.prop
Buildinfo.sh很简单,只是echo一些属性,比如:
echo"ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
echo"ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
...
而,ro.product.locale.language/ ro.product.locale.region就是些属性,等号后面是值。 PRODUCT_DEFAULT_LANGUAGE这些都在其他.mk文件中定义的
3) Makefile中直接把$(TARGET_DEVICE_DIR)/system.prop的内容追加到build.prop中
是在很多目录下存在,都会收集追加到build.prop中,例如:
./device/samsung/maguro/system.prop
./device/samsung/crespo4g/system.prop
./device/samsung/crespo/system.prop
./device/qcom/msm8660_surf/system.prop
./device/qcom/msm7630_surf/system.prop
./device/qcom/msm8625/system.prop
./device/qcom/msm8960/system.prop
./device/qcom/msm7627a/system.prop
……
4)收集ADDITIONAL_BUILD_PROPERTIES中的属性,追加到build.prop中。
ADDITIONAL_BUILD_PROPERTIES又会收集PRODUCT_PROPERTY_OVERRIDES中定义的属性
ADDITIONAL_BUILD_PROPERTIES:= \
$(ADDITIONAL_BUILD_PROPERTIES)\
$(PRODUCT_PROPERTY_OVERRIDES)
PRODUCT_PROPERTY_OVERRIDES 在build/target/product/core.mk有:
PRODUCT_PROPERTY_OVERRIDES := \
ro.config.notification_sound=OnTheHunt.ogg \
ro.config.alarm_alert=Alarm_Classic.ogg
通过build.prop生成过程的分析,可知哪里可以修改原有的属性或加入自己定义属性,那就是
2) \build\tools\buildinfo.sh
3)device\mediateksample\projectname\ system.prop;
4) ADDITIONAL_BUILD_PROPERTIES或PRODUCT_PROPERTY_OVERRIDES。
不过个人建议改在system.prop或PRODUCT_PROPERTY_OVERRIDES,这对应于具体特定平台或产品的修改
C++部分获取属性值 ,
1) 当使用 property_set ,设置键值,
2) 然后使用property_get ,得到键值 可能为空,//给验证,如果property_get读不到某属性(未定义此属性),其值就是你此方法的第三个参数 默认值
出现上述问题的解决办法是: 在调用 property_set property_get 之前, 必须调用函数 __system_properties_init();
例
char buf[20]="ssssssssssss";
char tempbuf[PROPERTY_VALUE_MAX];
property_set("phone.imei",buf);
property_get("phone.imei",tempbuf,"0");//get方法有两个属性,与java部分不同,java 只有两个参数,c++部分中的第二个参数是一个数组,代表将get到的值放入此数组中
1、 char driver_status[PROPERTY_VALUE_MAX];
property_get("wlan.driver.status", driver_status, NULL);
获得 "wlan.driver.status" 的属性,放到 driver_status 数组中。
bool propertyKTERecode = property_get_bool("ro.kte.recode", false/*default_value */);//获取boolean值属性