安卓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/ 下有檔案:
編譯即可。
一般新增屬性或者修改屬性可以修改下面兩個檔案:
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.prop
build.prop
default.prop
local.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;
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.prop
build.prop
default.prop
local.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;
-