2013-11-03 52 views
2

我已經下載了android源碼。我想了解後端如何驗證應用的權限。如何驗證android權限?

例如,如果一個應用程序試圖訪問攝像頭,操作系統如何驗證其是否已獲得其清單文件中的權限。

更具體地說,我想探索確切的源文件夾。

編輯: 經過幾次挖掘代碼,並感謝來自Stephan的解釋,我能夠發現,在framework/base/data/etc/platform.xml中,我們找到權限列表以及其分配的uid或GID。

位置,聯繫人等似乎有權訪問shell。例如:

<assign-permission name="android.permission.READ_CONTACTS" uid="shell" /> 

這是否意味着,當一個應用程序有READ_CONTACTS許可的清單文件中,默認情況下它可以訪問這樣做呢?我的意思是在哪裏進行驗證。

回答

2

看看這本書了部分答案:Embedded Android

我無法證實,我不得不從本書正確的答案,但這裏是我自己的那本書的解釋,因爲它涉及到你的問題。任何人,請隨時糾正我的解釋。我不假裝知道答案是肯定的。希望我自己對這個權限系統的理解能夠幫助你找到代碼工作的正確位置,因爲我還沒有找到這個部分。

我相信這些類型的權限都是在Linux文件組標識權限級別透明處理的。 Android本質上是一個操作系統,它正在使用另一個操作系統。

在Android中,首先被安裝在系統相機時,Linux分配它自己的用戶ID,與自己的主目錄以來,它得到的東西列出叫服務管理(不要與更高級別的Android困惑服務是完全不同的),並且它還得到一個組ID(一個組ID代表可能有多個攝像頭的入口點:前置攝像頭,後置攝像頭,以及第二個後置攝像頭,以防您擁有3-D手機) 。該組ID(gid)基本上是一個整數,它在安裝時從表示攝像頭權限的字符串常量中映射出來。

在Linux中,每個應用程序都是一個用戶,每個應用程序也是一個目錄,而且在Linux中,一切都是文件,甚至空目錄是文件,設備是文件,甚至io都可以是文件。

這裏是我相信事情有點反直覺的地方。使用Linux,每個用戶應用程序都有自己的空白沙箱,可以運行自己的進程。而在Linux中,Binder使用權限本身來訪問相關係統應用程序的句柄,並將其與您的應用程序綁定。因此,如果沒有系統應用程序的處理以及隨之而來的所有可能的環境變量,那麼您自己的應用程序根本無法知道如何在沙箱外運行任何程序。這就像編寫一個程序並忽略相關的進口聲明。

這就是爲什麼在Android中,當您遺漏了您正在使用的函數的權限時,系統並不直接告訴您「您沒有權限執行此操作」。該系統甚至不知道那麼多。系統只知道你試圖運行一些無法找到/訪問的東西(無論出於何種原因,它可能只是源文件中的一個拼寫錯誤)。所以大多數情況下,當你忘記包含許可時,系統會給你一個很大的困惑,就像你一直在說火星一樣。

最近,Android開發工具創建者已經越來越好地向我們提示我們可能忘記了包含特定權限。忘記許可是一件容易犯的錯誤,特別是在初學者中。使用正確的IDE /工具鏈自動化工具,這是一個可以永久消失的錯誤。

+0

感謝您的回覆。我肯定會深入這本書,你的解釋爲我的理解奠定了基礎。期待您的正確回答:) –

+0

非常感謝您的寶貴意見。我更新的問題是非常具體的,任何進一步的想法表示讚賞。 –