安卓SystemProperties详解及使用

platform :msm8916

OS:android5.1


安卓系统属性是以键值对的形式存在,系统属性,一般放在system.prop,build.prop,default.prop等文件中,

应用通过函数String key = SystemProperties.get("ro.android.myprop");返回属性ro.android.myprop对应的key值。

         

一. build.prop生成过程,它是由android编译系统生成的文件,主要属性配置来源与三个方面

①   build/tools/buildinfo.sh执行脚本,并输出到build.prop

②   把$(TARGET_DEVICE_DIR)/system.prop的内容追加到build.prop中

③   收集ADDITIONAL_BUILD_PROPERTIES中的属性,追加到build.prop中。

可用adb命令修改,或者adb push上去,修改完后权限一定是0644,要不然系统无法启动。


二. 可以修改device/qcom/M9PLUS_10/system.prop来设置系统的属性,

比如修改:#修改图标显示大小(屏幕dpi)

   ro.sf.lcd_density=480

   #默认时区为中国标准时区。

    persist.sys.timezone=Asia/Shanghai

   #强制横屏(persist.panel.orientation=0时为强制竖屏)

   persist.panel.orientation=270

 修改好之后,执行make -j8.编译完成后,build.prop修改的内容全部还原了。后来发现out/target/product/M9PLUS_10/system/ 下有文件:build.prop.bakforspec 。这个会一直把修改后的build.prop文件强制还原到以前的状态。直接把这个文件删了,再次

  编译即可。

 一般添加属性或者修改属性可以修改下面两个文件:

1、  build/target/product/core_base.mk 

       2. $(TARGET_DEVICE_DIR)/system.prop

我的平台目录:device/qcom/M9PLUS_10/system.prop

在编译system的时候会更新到build.prop中!

三 . 自己增加一个系统属性,作为宏开关。

例1:

1. 在system.prop添加属性ro.nbpt.mystatus=false或者ro.nbpt.mystatus=true

或者利用setpropro.nbpt.mystatus false或者setpropro.nbpt.mystatus true.这句命令也可以放在别的

应用中执行,可以实现应用之间的通信,也可以用来调试。

2. 应用可以通过下面的函数和判断哎做相应的操作:

String mode = SystemProperties.get("ro.nbpt.mystatus");

if(mode.equals("true")){
//操作
}

例2

在高通平台,想要添加一个宏开关,可以尽量控制更大范围的代码,我选择了system.prop文件中,添加了一个开关

tinno_gms_able = false

在java中的使用方法

import android.os.SystemProperties;
if(SystemProperties.getBoolean("tinno_gms_able", false) == true){
    ..................
}
这个使用方式,需要应用程序有system或root权限。

将android程序的权限提升到system权限,有下面方法:

(1)在AndroidManifest.xml中,在manifest加入

android:sharedUserId="android.uid.system"
  • 1

(2)在Android.mk中,將LOCAL_CERTIFICATE := XXX修改成

LOCAL_CERTIFICATE := platform
  • 1

(3)有时会显示无法import android.os.SystemProperties

修改方法如下: 
注释掉相应Android.mk文件中的以下内容:

#LOCAL_SDK_VERSION := current
  • 1

备注:因为SystemProperties是非标准的SDK接口,如果要使用,不能定义LOCAL_SDK_VERSION变量。该变量表示应用只使用标准的SDK接口。

在cpp文件中的使用方式

#include <cutils/properties.h>
  • 1
char tinnoGmsValue[PROPERTY_VALUE_MAX];
bool tinno_gms_enabled = false;
if(property_get("tinno_gms_able", tinnoGmsValue, "false")) {
     tinno_gms_enabled = atoi(tinnoGmsValue) || !strncmp("true", tinnoGmsValue, 4);
}
if(tinno_gms_enabled == true){
    .................
}
安卓系统属性一般存放位置:system.propbuild.prop   default.proplocal.prop

四. 根据屏幕大小来设置系统属性 在kernel里面kernel/drivers/video/fbsysfs.c会导出数据/sys/class/graphics/fb0/virtual_size


在Y:\LA.BR.1.2.4-05310-8x16.0\device\qcom\common\init\init_msm8916.c 中获取virtual_size值,根据不同的屏幕大小设置ro.sf.lcd_density。

其中PROP_LCDDENSITY的值,当然也可以设置其他的系统属性,利用property_set()
在device/qcom/common/init/init_msm.h中定义:
#define VIRTUAL_SIZE "/sys/class/graphics/fb0/virtual_size"  
#define BUF_SIZE 64  
  
void init_msm_properties(unsigned long msm_id, unsigned long msm_ver, char *board_type)  
{  
    char platform[PROP_VALUE_MAX];  
    int rc;  
    unsigned long virtual_size = 0;  
    char str[BUF_SIZE];  
  
    UNUSED(msm_id);  
    UNUSED(msm_ver);  
  
    rc = property_get("ro.board.platform", platform);  
    if (!rc || !ISMATCH(platform, ANDROID_TARGET)){  
        return;  
    }  
  
    rc = read_file2(VIRTUAL_SIZE, str, sizeof(str));  
    if (rc) {  
        virtual_size = strtoul(str, NULL, 0);  
    }  
  
    if(virtual_size >= 1080) {  
        if (ISMATCH(board_type, "SBC")) {  
            property_set(PROP_LCDDENSITY, "240");  
            property_set(PROP_QEMU_NAVKEY, "0");  
        } else  
            property_set(PROP_LCDDENSITY, "480");  
    } else if (virtual_size >= 720) {  
        // For 720x1280 resolution  
        property_set(PROP_LCDDENSITY, "320");  
    } else if (virtual_size >= 480) {  
        // For 480x854 resolution QRD.  
        property_set(PROP_LCDDENSITY, "240");  
    } else  
        property_set(PROP_LCDDENSITY, "320");  
  
    if (msm_id >= 239 && msm_id <= 243) {  
        property_set("media.msm8939hw", "1");  
    }  
  
    if (msm_id >= 268 && msm_id <= 271) {  
        property_set("media.msm8929hw", "1");  
    }  
  
    if (msm_id == 206) {  
        property_set("vidc.enc.narrow.searchrange", "0");  
    }  
}  
  
  
kernel/drivers/video/fbsysfs.c  
  
static ssize_t show_virtual(struct device *device,  
                struct device_attribute *attr, char *buf)  
{  
    struct fb_info *fb_info = dev_get_drvdata(device);  
    return snprintf(buf, PAGE_SIZE, "%d,%d\n", fb_info->var.xres_virtual,  
            fb_info->var.yres_virtual);  
}  
  
在Msm_fb.c (drivers\video\msm)   定义fb_info->var.xres_virtual  
  
var->xres_virtual = panel_info->xres;  
var->yres_virtual = panel_info->yres * mfd->fb_page +  
    ((PAGE_SIZE - remainder)/fix->line_length) * mfd->fb_page; 




发布了87 篇原创文章 · 获赞 253 · 访问量 32万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览