Qcom android L ro.sf.lcd_density属性修改

来源:互联网 发布:手机禁网软件 编辑:程序博客网 时间:2024/06/04 13:13


在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的值在device/qcom/common/init/init_msm.h中定义:
[cpp] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. #define VIRTUAL_SIZE "/sys/class/graphics/fb0/virtual_size"  
  2. #define BUF_SIZE 64  
  3.   
  4. void init_msm_properties(unsigned long msm_id, unsigned long msm_ver, char *board_type)  
  5. {  
  6.     char platform[PROP_VALUE_MAX];  
  7.     int rc;  
  8.     unsigned long virtual_size = 0;  
  9.     char str[BUF_SIZE];  
  10.   
  11.     UNUSED(msm_id);  
  12.     UNUSED(msm_ver);  
  13.   
  14.     rc = property_get("ro.board.platform", platform);  
  15.     if (!rc || !ISMATCH(platform, ANDROID_TARGET)){  
  16.         return;  
  17.     }  
  18.   
  19.     rc = read_file2(VIRTUAL_SIZE, str, sizeof(str));  
  20.     if (rc) {  
  21.         virtual_size = strtoul(str, NULL, 0);  
  22.     }  
  23.   
  24.     if(virtual_size >= 1080) {  
  25.         if (ISMATCH(board_type, "SBC")) {  
  26.             property_set(PROP_LCDDENSITY, "240");  
  27.             property_set(PROP_QEMU_NAVKEY, "0");  
  28.         } else  
  29.             property_set(PROP_LCDDENSITY, "480");  
  30.     } else if (virtual_size >= 720) {  
  31.         // For 720x1280 resolution  
  32.         property_set(PROP_LCDDENSITY, "320");  
  33.     } else if (virtual_size >= 480) {  
  34.         // For 480x854 resolution QRD.  
  35.         property_set(PROP_LCDDENSITY, "240");  
  36.     } else  
  37.         property_set(PROP_LCDDENSITY, "320");  
  38.   
  39.     if (msm_id >= 239 && msm_id <= 243) {  
  40.         property_set("media.msm8939hw""1");  
  41.     }  
  42.   
  43.     if (msm_id >= 268 && msm_id <= 271) {  
  44.         property_set("media.msm8929hw""1");  
  45.     }  
  46.   
  47.     if (msm_id == 206) {  
  48.         property_set("vidc.enc.narrow.searchrange""0");  
  49.     }  
  50. }  
  51.   
  52.   
  53. kernel/drivers/video/fbsysfs.c  
  54.   
  55. static ssize_t show_virtual(struct device *device,  
  56.                 struct device_attribute *attr, char *buf)  
  57. {  
  58.     struct fb_info *fb_info = dev_get_drvdata(device);  
  59.     return snprintf(buf, PAGE_SIZE, "%d,%d\n", fb_info->var.xres_virtual,  
  60.             fb_info->var.yres_virtual);  
  61. }  
  62.   
  63. 在Msm_fb.c (drivers\video\msm)   定义fb_info->var.xres_virtual  
  64.   
  65. var->xres_virtual = panel_info->xres;  
  66. var->yres_virtual = panel_info->yres * mfd->fb_page +  
  67.     ((PAGE_SIZE - remainder)/fix->line_length) * mfd->fb_page;  

所以ro.sf.lcd_density最终是有分辨率决定的。

init_msm_properties函数被谁调用了呢?暂时没找到


为了更加便捷的修改ro.sf.lcd_density,后面做了一个实验:

1、  在Android系统运行的时候通过adb 修改/system/build.prop文件,添加一行:

ro.sf.lcd_density=480

后重启,发现字体变大了!

2、  所以通过修改/system/build.prop是有效的,后面网上查了一下build.prop的过程,它是由android编译系统生成的文件,主要属性配置来源与三个方面:

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

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

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

 

3、 通过修改

device\qcom\msm8916_64_slm755_meig_02\system.prop

添加一行:

         ro.sf.lcd_density=480,编译系统 make –j8

4、 刚开始

out\target\product\msm8916_64_slm755_meig_02\system\build.prop

文件中出现了ro.sf.lcd_density=480可是后面又变回到原来的样子,ro.sf.lcd_density=480消失了!!不解!

5、 后来发现是因为在out\target\product\msm8916_64_slm755_meig_02\system\下面还有一个

文件:build.prop.bakforspec 



这个鬼东西一直会把修改后的build.prop强制还原到以前的状态,坑爹!后来把它删掉,build.prop中新增了修改项:ro.sf.lcd_density=480

 

所以综上:一般修改属性,或者添加属性,可以修改一下两个文件:

 

1、  build/target/product/core_base.mk 



2、$(TARGET_DEVICE_DIR)/system.prop

(device\qcom\msm8916_64_slm755_meig_02\system.prop)



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

参考文章: Android属性之build.prop生成过程分析


0 0
原创粉丝点击