在android系統裡,設計有一種系統叫做屬性系統,它是用來做什麼呢?這樣設計有什麼優勢呢?其實這個屬性系統主要是用來儲存系統配置,或者用來交換不同進程的資訊。這樣的系統最大的優勢是統一了系統配置的方式,統一了資訊交換方式,通過共用記憶體的方式提高系統的效能。
下面就來分析屬性系統的初始化函數,代碼如下:
#001 void property_init(void)
#002 {
#003 init_property_area();
這行代碼是調用函數init_property_area來設定屬性記憶體的地區。
#004 load_properties_from_file(PROP_PATH_RAMDISK_DEFAULT);
這行代碼是從ramdisk盤裡載入屬性檔案。
#005 }
在這個函數裡,需要查看一下宏定義,如下:
#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"
也就是從記憶體盤裡載入屬性檔案/default.prop,並把這些屬性放到屬性系統裡。
接著來分析函數init_property_area是怎麼建立共用記憶體,並把屬性放到裡面給所有進程共用使用的,代碼如下:
#001 static int init_property_area(void)
#002 {
#003 prop_area *pa;
#004
#005 if(pa_info_array)
#006 return -1;
這段代碼是判斷當屬性資訊數組已經初始化,就直接返回。
#007
#008 if(init_workspace(&pa_workspace, PA_SIZE))
#009 return -1;
這段代碼是調用函數init_workspace建立共用記憶體。
#010
#011 fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC);
這行代碼是設定共用記憶體的執行結束後關閉。
#012
#013 pa_info_array = (void*) (((char*) pa_workspace.data) + PA_INFO_START);
這行代碼是儲存建立共用記憶體指標。
#014
#015 pa = pa_workspace.data;
#016 memset(pa, 0, PA_SIZE);
這段代碼是清空屬性共用的記憶體。
#017 pa->magic = PROP_AREA_MAGIC;
#018 pa->version = PROP_AREA_VERSION;
這段代碼是設定屬性共用記憶體的版本號碼。
#019
#020 /* plug into the lib property services */
#021 __system_property_area__ = pa;
這行代碼是設定屬性共用記憶體可以給庫的屬性共用服務使用。
#022
#023 return 0;
#024 }
#025
從上面的函數裡可以看到一個建立共用記憶體的函數,它是怎麼樣實現建立共用記憶體的呢?現在來分析它的代碼