其實property就是name&value對,與常見系統中的配置項沒有差別。在android系統中,大量使用了property_set和property_get,用來設置和獲取某一property。下面來分析一下。android
property_set/property_get位於libcutils.so庫。任何進程若要調用這兩個函數,須要連接libcutils.so。socket
libcutils.so調用到了__system_property_set和__system_property_get函數,這兩個函數位於 bionic庫中,源代碼文件爲bionic/libc/bionic/system_properties.c,生成的庫文件爲 libc_common.so。ionic
對於set和get,分別會建立socket,發送消息到服務端。服務端位於init進程中,有一個property_service進程專門負責這個。 該service讀取socket消息,進行set和get的處理。property_service代碼位於system/core/init /property_service.c函數
在system_properties.c和property_service.c中都用到了共享內存(用mmap實現),這裏我開始有些搞不懂:若是用socket機制的話,只須要管理進程來維護內存便可,客戶端不準要訪問該內存,幹嗎要用共享內存呢?spa
原來,android這樣作是爲了效率考慮。在system_properties.c的get調用中,能夠經過只讀方式訪問共享內存,直接獲取配置。固然了,爲了保證get的時候別人不在set,避免讀寫衝突,get時須要等待一個信號量。對於set,system_properties.c會經過socket發送消息到service端處理,service端增長或者更新property後會wake該信號量。service端以讀寫方式打開共享內存。設計
爲 什麼要這樣設計呢?由於系統中由大量的get調用,get能夠直接訪問共享內存,因此訪問更快。對於set,須要交給服務端處理,這樣開銷比較大,由於用 到了socket,但由於set調用相對較少,因此問題也不嚴重。另爲,android系統由以ctl打頭的property,這種property比較 特殊,能夠控制服務的運行和中止,將這些控制放在service(即init進程)也就理所固然了!進程
附上一個框圖:內存