Android 層級分析
這個(gè)圖中 kernel 和 native 層的通信是 syscall,這個(gè)大家都很熟悉,就是系統(tǒng)調(diào)用,畢竟 C++ 調(diào)用 C 語言還是很簡單的。
而 FrameWork 層和 Native 層通信就比較復(fù)雜了,java 如何調(diào)用 C++ 語言,這里會有一個(gè) JNI 機(jī)制,JNI 有特定的語法,類似于 C 語言但又不是 C 語言,他可以實(shí)現(xiàn) java 調(diào)用 C++的函數(shù),這個(gè)過程需要 Android Runtime(ART) 安卓虛擬機(jī)的配合。
在 Native 層中,有很多 C++ 寫的系統(tǒng)服務(wù),供上層使用,比如最重要的ServiceManager,管理所有其他服務(wù)的服務(wù)。
案例分析
手機(jī) app 想要控制喇叭、LED 等硬件,要從 app 傳遞到 kernel,操作硬件,這個(gè)流程要比 Linux 的應(yīng)用程序復(fù)雜得多。并且方式不止一種,舉例:
1、app 通過直接讀寫 kernel 節(jié)點(diǎn),向其寫入數(shù)據(jù),這就類似于在 Linux 命令行直接 echo,這是最簡單的方式。因?yàn)?java 本身也有文件讀寫函數(shù),有按字節(jié)讀寫和字符串讀寫兩種方式。
2、app 的 java 語言調(diào)用 JNI 文件,JNI 調(diào)用 C 語言,在 C 函數(shù)中去操作節(jié)點(diǎn)。
3、也可以用 C++ 寫一個(gè) Native 服務(wù),APP 通過 binder 通信訪問這個(gè)服務(wù),在這個(gè)服務(wù)中操作節(jié)點(diǎn)。當(dāng)然 socket 通信也可以。
Android 權(quán)限問題
當(dāng)然,以上所有的操作都需要權(quán)限,安卓系統(tǒng)的權(quán)限限制的比較嚴(yán)格,防止黑客破解。
如果你有 root 權(quán)限,那么你可以在安卓系統(tǒng)命令行中輸入 setenforce 0 來關(guān)閉Android 系統(tǒng)的 SELinux 檢查機(jī)制,那基本上你所有操作都可以被允許。
在 Linux 系統(tǒng)中,安全機(jī)制是:我是 root,我派出去的程序訪問任何東西也應(yīng)該是 root 權(quán)限,沒有人可以阻止我。
在 Andorid 系統(tǒng)中,安全機(jī)制是:不管你是誰,做任何事情都要提前申請,否則會被 SELinux 檢查,沒有提前申請的行為都會被拒絕,看 log 會發(fā)現(xiàn)很多 avc deny。
舉個(gè)形象一點(diǎn)的例子:一個(gè)公司老板,派他的兒子去自己的公司上班,按理來說是應(yīng)該類似于 root 權(quán)限,誰能擋我?實(shí)際上呢,到公司上班可以,因?yàn)槔习逄崆罢f了,但是去衛(wèi)生間要申請權(quán)限,用電腦要申請權(quán)限,用打印機(jī)要申請權(quán)限,除了過來上班,其余任何沒有提前說明的行為都會被拒絕。
這就是 Andorid 系統(tǒng)嚴(yán)格的安全機(jī)制,防止了黑客破解 root 權(quán)限以后亂搞你的手機(jī),比如:內(nèi)置一個(gè)程序,定期訪問你的 xxx 文件,然后通過網(wǎng)絡(luò)發(fā)出去。
-
Android
+關(guān)注
關(guān)注
12文章
3917瀏覽量
127036 -
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208717 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4277瀏覽量
62323 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1006瀏覽量
21292
發(fā)布評論請先 登錄
相關(guān)推薦
評論