淺析android中的權限管理--用戶安裝的apk的uid,gid是如何分配的

Android的開發者一般分爲兩類,一類是做framework開發,一類是做第三方APP開發。兩者最大的區別就是能夠使用到的系統權限不一樣。網上也有好多關於如何獲得root權限的討論和文章。我這裏就不討論這些了。主要還是從Android framework的設計出發,從代碼中看看Android是如何給各種用戶設定不同的uid,如何管理它們的。


當用戶點擊一個APK時或是從market下載了一個APK後, 通常是觸發一個Intent, 然後最總交由PackageManagerService.java來負責。該文件可能是真個android framework中最長的一個文件之一了,它的類的註釋,強調了它的重要性!!!警告說任何改動之後,都需要運行鍼對該類的所有UT。(還有一個ActivityManagerService.java的文件更長!!!)

先來看看它的構造函數:

    1. 初始化了Settings相關的一些數據(uid, gid的初始值等等)

    2. 初始化了Installer(mydroid/frameworks/base/services/java/com/android/server/Installer.java), 這個是一個與jni相關的真正做install事情的接口(它是installd這個daemon).

    3. 初始化並check以下的關鍵數據:boot class, dexopt相關操作

    4. 處理base frameworks, system packages, vendor packages

    5. 處理已經安裝的apk及上一次啓動以來沒有完成的apk。

    6. 處理如果上一次啓動之間發生了系統升級,如果permission有變化需要更新


接着就來看看負責安裝的installd daemon。

    它的代碼在:mydroid/frameworks/base/cmds/installd

    從install.c中可以看出它接收的都是從上面所說的java層的Installer.java發來的cmds。真正的各條命令的實現參見commands.c。

   代碼比較清晰易懂。其中關於dexopt相關的操作,就需要去看dalvik下關於dexopt的相關代碼了。這個就比較複雜了,需要參看我後面會寫的關於dalvik的文章。


分析上述過程之後,有以下幾個疑問:

    中間多次看到跟encryption相關的字眼,不太確定哪裏需要encryption?

        猜測是後續版本會支持對某些目錄支持原生的加密如/system/(system.img)等等。


各個新安裝的應用程序的uid和gid是如何獲得的?

    是由PackageManagerService在調用installd時傳遞過去的。而具體每個apk所分配的uid, gid(包括SharedId這個屬性)都是在PackageManagerService由動態的一個Setting來管理並維護。初始是從10000開始(參見Process.java中的FIRST_APPLICATION_UID定義)。

    實際上分配給apk的linux下看到的uid, gid都是最終當用戶點擊啓動該apk後,由dalvik的zygote來進行的。詳細需要參看與dalvik相關分析的文章。


最後,當然還可以通過ADB的install命令(當然ant的install也是最終調用adb install來完成的). adb是通過socket把host與client之間聯繫起來的.具體可參考另外一片關於我對ADB分析的文章.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章