1. 程式人生 > >安卓SystemProperties詳解及使用--

安卓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中的使用方法


    
  1. import android.os.SystemProperties;
  2. if(SystemProperties.getBoolean( "tinno_gms_able", false) == true){
  3. ..................
  4. }
這個使用方式,需要應用程式有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

    
  1. char tinnoGmsValue[PROPERTY_VALUE_MAX];
  2. bool tinno_gms_enabled = false;
  3. if(property_get( "tinno_gms_able", tinnoGmsValue, "false")) {
  4. tinno_gms_enabled = atoi(tinnoGmsValue) || ! strncmp( "true", tinnoGmsValue, 4);
  5. }
  6. if(tinno_gms_enabled == true){
  7. .................
} 安卓系統屬性一般存放位置: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中定義:

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





    
    

    
   
  
 

 
 

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中的使用方法


  
  1. import android.os.SystemProperties;
  2. if(SystemProperties.getBoolean( "tinno_gms_able", false) == true){
  3. ..................
  4. }
這個使用方式,需要應用程式有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

  
  1. char tinnoGmsValue[PROPERTY_VALUE_MAX];
  2. bool tinno_gms_enabled = false;
  3. if(property_get( "tinno_gms_able", tinnoGmsValue, "false")) {
  4. tinno_gms_enabled = atoi(tinnoGmsValue) || ! strncmp( "true", tinnoGmsValue, 4);
  5. }
  6. if(tinno_gms_enabled == true){
  7. .................
} 安卓系統屬性一般存放位置: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中定義:

   
  1. #define VIRTUAL_SIZE "/sys/class/graphics/fb0/virtual_size"
  2. #define BUF_SIZE 64
  3. void init_msm_properties(unsigned long msm_id, unsigned long msm_ver, char *board_type)
  4. {
  5. char platform[PROP_VALUE_MAX];
  6. int rc;
  7. unsigned long virtual_size = 0;
  8. char str[BUF_SIZE];
  9. UNUSED(msm_id);
  10. UNUSED(msm_ver);
  11. rc = property_get( "ro.board.platform", platform);
  12. if (!rc || !ISMATCH(platform, ANDROID_TARGET)){
  13. return;
  14. }
  15. rc = read_file2(VIRTUAL_SIZE, str, sizeof(str));
  16. if (rc) {
  17. virtual_size = strtoul(str, NULL, 0);
  18. }
  19. if(virtual_size >= 1080) {
  20. if (ISMATCH(board_type, "SBC")) {
  21. property_set(PROP_LCDDENSITY, "240");
  22. property_set(PROP_QEMU_NAVKEY, "0");
  23. } else
  24. property_set(PROP_LCDDENSITY, "480");
  25. } else if (virtual_size >= 720) {
  26. // For 720x1280 resolution
  27. property_set(PROP_LCDDENSITY, "320");
  28. } else if (virtual_size >= 480) {
  29. // For 480x854 resolution QRD.
  30. property_set(PROP_LCDDENSITY, "240");
  31. } else
  32. property_set(PROP_LCDDENSITY, "320");
  33. if (msm_id >= 239 && msm_id <= 243) {
  34. property_set( "media.msm8939hw", "1");
  35. }
  36. if (msm_id >= 268 && msm_id <= 271) {
  37. property_set( "media.msm8929hw", "1");
  38. }
  39. if (msm_id == 206) {
  40. property_set( "vidc.enc.narrow.searchrange", "0");
  41. }
  42. }
  43. kernel/drivers/video/fbsysfs. c
  44. static ssize_t show_virtual (struct device *device,
  45. struct device_attribute *attr, char *buf)
  46. {
  47. struct fb_info *fb_info = dev_get_drvdata(device);
  48. return snprintf(buf, PAGE_SIZE, "%d,%d\n", fb_info->var.xres_virtual,
  49. fb_info->var.yres_virtual);
  50. }
  51. 在Msm_fb.c (drivers\video\msm) 定義fb_info->var.xres_virtual
  52. var->xres_virtual = panel_info->xres;