android 系统属性 或 自定义属性

添加全局变量开关(三种方式)
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值属性

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值