C/JAVA /串口——中使用 prop(getprop,setprop)

在開發Framework 中,prop屬性的設定是很常用的一種方式,作爲和java中的 SharedPreference 算是有點相似把,但是有肯定是不一樣的。這個用來在編譯Android系統的時候 版本控制用的多一點把,具體的作用可以自行百度,本文章只講使用:

C/C++:
①getprop 使用的比較頻繁:

該代碼是實例,寫在system/vold/NetlinkHandler.cpp 下
在onEvent內

/***Add usb2 disable temporary scheme 20191231***/
   char args[PROPERTY_VALUE_MAX];
   property_get("vendor.device.usb2",args,"false");
   if (strcmp(args,"true")==0){
       const char *path = evt->findParam("DEVPATH");
       if (strstr(path,USB_2_PATH)!=NULL){
           SLOGW("DISABLE USB2");
           return;
       }
   }
// 以下是將USB掛載的消息下發
if (!strcmp(subsys, "block")) {
    vm->handleBlockEvent(evt);
}

②setprop的話,因爲是系統內,所以要先在系統.mk中定義:
path:/device/fsl/imx8q/

#Carplay && AndroidAuto Connected Success , unmount usb2.
PRODUCT_PROPERTY_OVERRIDES += \
    vendor.device.usb2 = false

注意:以ro.開頭的屬性都是隻讀屬性,以persist開頭的屬性,一般都是從/data/property目錄中加載的,設置setprop 中"ro.product.device.carbit",ro的是不可以二次被setprop的也就是設置之後不可再被修改。 謹慎使用,一般非系統級別的,APP用的建議使用
所以建議自己添加的用避開ro,如果是自己代碼中的一些小的屬性,只是自己使用的話,我一般用vendor

JAVA

import android.os.SystemProperties;
SystemProperties.set("xxxxx","xx")
SystemProperties.get("xxxxx","xx")

其實這些就夠了,不過看着有點簡單,我把我的實例貼出來。

public class DeviceManagerServiceprivate final String UNMOUNT_DEVICE_PROP_STATE = "vendor.device.usb2";
private final String GET_EASYCON_PROPERTY= "vendor.product.device.easycon";

/**setprop**/
case UNMOUNT_DEVICE_PROP_STATE:
SystemProperties.set(UNMOUNT_DEVICE_PROP_STATE,"true");
break;

/**getprop**/
if("false".equals(SystemProperties.get(GET_EASYCON_PROPERTY))){
 Log.d(TAG, "Carplay is connected");
}

串口命令
僅用於臨時修改,手動操作測試一些屬性:
在串口中輸入:getprop 你就可以看到很多 已經定義好的prop

getprop “key”
setprop "key" "value"

如果需要修改:

/**獲取當前prop 屬性**/
mek_8q:/ # getprop vendor.device.usb2
false
/**設置prop 屬性,系統重啓之後便恢復默認**/
mek_8q:/ # setprop vendor.device.usb2  true
mek_8q:/ # getprop vendor.device.usb2
true

補充:在RC 中設置 setprop

on boot
    setprop ro.FOREGROUND_APP_ADJ 0
    setprop ro.VISIBLE_APP_ADJ 1
    setprop ro.SECONDARY_SERVER_ADJ 2

注意: 只需要判斷是否存在這個prop,建議用字節判斷

如果是單純的是來判斷是否又prop這個屬性的話,則:
if(property_get(?,?,?)>0)
就滿足了 這個需求。因爲property_get 獲得到的是[字節數],
比如 setprop vts.hidl.get_stub 1   ,則代碼中property_get =1
比如 setprop vts.hidl.get_stub on  ,則代碼中property_get =2
比如 setprop vts.hidl.get_stub true   ,則代碼中property_get =4

如果需要值,就是args 的值了,可以直接打印
CM_LOGP(CM_LOG_INFO, "vendor.product.device.carbit=%s",args);

//例子:if判斷的話,如下
char args [PROPERTY_VALUE_MAX];
if (property_get("vendor.device.usb2", args, "") > 0) {
//xxxxx
}
//或者
int prop;
prop = property_get("vendor.device.usb2", args, "");
if(strcmp(args, "true")==0){
}

另外 設置setprop 不僅限於 String 類型。只要你想要什麼就可以寫什麼,
int,string,都可以。只需要正確的匹配就好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章