android應用層對裝置的訪問許可權的實現
如果應用程式出現開啟裝置許可權不夠的錯誤,可能是建立裝置節點時賦予的許可權不夠。
問題:攝像頭總是許可權不夠,只能在shell下重新設定可用。
分析:android對裝置節點的管理不是使用udev,在init裡面,system/core/init/下的init.c和devices.c裡對裝置節點的建立設定了許可權。
andoid安全機制包括兩個層次:系統層和應用層。應用層的安全機制建立在授權與申請基礎上,本文不講。系統層的安全機制包括給 每個使用者程序分配單獨的uid和gid,使用程序本身可以防止位址空間的共享,從而避免使用執行緒方式對資料的全域性可見性。使用了uid則對於外存也加了封 鎖,當然這得感謝unix的使用者空間機制。系統層安全機制還包括對裝置訪問的控制,在這個方面,android的做法與傳統有所不同。
android除了給予使用者程序以單獨的uid外,給系統服務也分配了固定的uid,諸如system/core/include/private/android_filesystem_config.h檔案中定義了這些固定的uid:
define aid_system 1000
#define aid_radio 1001
#define aid_bluetooth 1002
#define aid_graphics 1003
#define aid_input 1004
#define aid_audio 1005
#define aid_camera 1006
#define aid_log 1007
......................................
傳統的做法是,除了root,其它全是普通使用者,兩類使用者的許可權在核心裡是規定死的,這也保證了unix核心的安全性。比如dev目錄下的裝置文 件,一般使用者主是root,而且對其他使用者不開放讀寫能力。使用者使用裝置一般通過系統呼叫如ioctl,而系統呼叫屬於受信**。
android的問題是,引入的這些系統使用者,實際上在許可權方面是無法與普通uid區分的,如果系統使用者能訪問乙個裝置,那麼一般使用者也 能。所以,andoid沒有別的選擇,只能預設開啟裝置檔案的全域性讀寫。這在systemcore/init/device.c做了定義: ,
,,.....................................
裝置檔案當然還是存放於/dev目錄下,但dev目錄的填充不是由udev做的,而是由android的init程序做的。這個步驟由make_device函式完成,各個裝置的許可權來自於上述device.c檔案的規定。
這種裝置許可權分配的潛在危險是,任何使用者程序都可以操作裝置,如果底層裝置驅動有漏洞,那麼整個系統的安全性就是存在風險的,而unix系統最大的安全隱患,正是來自於裝置驅動。
在android中,由於沒有mdev和udev,所以它沒有辦法動態的生成裝置節點,那麼它是如何做的呢?
我們可以在system/core/init/下的init.c和devices.c中找到答案:
init.c中的int main(int argc, char **argv)
建立了一些基本的裝置節點。
int main(int argc, char **argv)
return 0; }
我們再來看看handle_device_fd(),該函式定義在devices.c中
void handle_device_fd(int fd) }
而handle_device_event定義如下:
static void handle_device_event(struct uevent *uevent)
...
} make_device定義如下:
static void make_device(const char *path, int block, int major, int minor)
其他動態裝置的節點建立,android也規定好了裝置節點的名字和許可權等。下面這個函式會返回你要建立的裝置節點的許可權,如果列表中沒 有,就會使用預設600,當然這樣的話,應用程式使用裝置就會出現問題,所以,你要把你的裝置加到列表 static struct perms_ devperms 中。
我們看看get_device_perm如下實現:
static mode_t get_device_perm(const char *path, unsigned *uid, unsigned *gid)
else if (get_device_perm_inner(devperms, path, uid, gid, &perm) == 0) else else
/* found perm in partner list. */
*uid = dp->uid;
*gid = dp->gid;
return dp->perm;
} /* default if nothing found. */
*uid = 0;
*gid = 0;
return 0600;
} }
我們最後可以看到在devperms中定義了要生成的裝置節點:
static struct perms_ devperms = ,
, ,
, ,
, ,
, ,
/* logger should be world writable (for logging) but not readable */
, /* the msm hw3d client device node is world writable/readable. */
, /* gpu driver for adreno200 is globally accessible */
, /* these should not be world writable */
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, /* cdma radio inte***ce mux */
, ,
, ,
};
Android網路優化 應用層策略
網路效能指標 1.建立連線的速度 2.傳輸速度 3.到達率 tcp ip底層已經有錯誤重傳機制,但是並不是專門為移動端設計的 4.長連線的存活率 優化切入口 1.dns優化 一般是優化的首選 使用httpdns替代localdns dns是指根據網域名稱查出ip位址,是http協議的前提,所以網路優...
應用層的例項
url檔案 存放物件的伺服器主機名 物件的路徑名 例 1 http請求報文 accept language fr方法字段 url欄位 http版本字段 2 http響應報文 data data data data data 狀態行 協議版本字段 狀態碼 相應狀態資訊 首部行實體體 3 web快取 d...
Android應用層CAN匯流排測試程式
1 can裝置說明 對於can裝置操作是按照網路socket程式設計方式來操作的,在linux命令列方式下,用以下命令來對其進行設定 ip link set can0 type can bitrate 125000 triple sampling on 表示對第一路can can0 裝置設定其波特率...