2

因此,我一直在圍繞AOSP進行挖掘,試圖找出如何安裝android應用程序。到目前爲止,這是我在哪裏:瞭解如何通過PackageManagerService安裝android應用程序

apk文件將從PackageInstallerActivity發送到InstallAppProgress,它將在其中調用PackageManager方法installPackage()。

先前對PackageManager的調用被定向到PackageManagerService,帶着AIDL的魔力(花了一些時間讓我理解這一點)。

在覈心方法installPackageWithVerification()的PackageHandler的一個實例被創建和消息傳遞發生在魯棒的方式與一羣的像INIT_COPY狀態碼的使用,PACKAGE_VERIFIED等

基於在處理程序中接收的消息的狀態代碼上進行操作。開始INIT_COPY - 將包添加到掛起的安裝列表中,並調用代碼爲的消息MCS_BOUND

這複製了從apk文件中提取的基本文件,如數據文件。

在通道的某個地方發出帶有標記CHECK_PENDING_VERIFICATION的消息,該消息從待處理列表中解析條目,尤其是AndroidManifest文件。驗證和驗證包裹簽名,包裝名稱等等。

然後調用updateSettingLI()這反過來又產生3個更重要的函數調用。

  • moveDexFilesLI()
  • setPermissionsLI() - 提取目錄資源/文件,resources.arsc,的Manifest.xml
  • updatePermissionsLPw() - 電話grantPermissionLPw - 和增加的組識別從清單文件中解析出的權限

在此時間點,Package對象具有各自的groupid,因此unti我現在能夠基本弄清楚權限是如何轉換成groupids的。請原諒我的咆哮,我認爲這可能對某些用戶來說是非常有用的,特別是scanPackageLI方法,它很容易在代碼中迷失方向。

現在的實際問題,我知道比喻在android每個應用程序不過是一個Linux進程控制自己的uid和gid。我們從上面的gids中知道如何從PackageManagerService轉換到linux進程。

我知道「installd」在安裝過程中也起着至關重要的作用。 但我無法找到正在安裝的軟件包(Linux進程)設置權限或訪問權限(根據linux teminology)的鏈接?

請幫助我。

+0

有沒有什麼好的博客或者與此相關的東西,會給出更詳細的信息,如果是的話請分享。 –

+0

http://coltf.blogspot.it/p/android-os-processes-and-zygote.html這是一個很好的起點 –

回答

2

非常好的問題。但要找到你的問題的答案,你需要稍微考慮另一個方向,即流程的開始。正如你在Android中可能知道的那樣,有一個稱爲Zygote的特殊過程。這是一個預先加熱的過程(意思是在它的內存中已經加載了一些庫),並且從這個過程中所有的Android過程都被分離出來。

當你啓動一個應用程序時,Android系統通過套接字向Zygote發送一個命令來創建一個新進程。在這個命令中,還會發送一組基於權限分配給應用程序的gid。在Zygote創建了一個新進程後,它設置了傳遞的gid。因此,分叉進程接收它的uid和gid。但是這個過程只與映射到gid的權限有關。

+0

謝謝您的建議。是的,即使我確實覺得我走錯了路,通過Zygote代碼確實可以幫助我理解權限設置的細微差別。 特別是dalvik_system_Zygote.cpp中的forkAndSpecialize()方法實際上是爲setkeds(gid)爲分叉進程設置組IDids部分。 我的問題是,當我們實際上在android中點擊一個應用程序時,最終調用到這個部分到底是什麼。我想找出路徑。你能否幫我指出一些同樣的問題。謝謝 –

+1

嘗試應用這個鏈接中的信息:http://coltf.blogspot.it/p/android-os-processes-and-zygote.html其實,如果我沒有錯,你需要尋找所謂的方法startActivityMayWait(),由ActivityManagerService的startActivity()方法調用 – Yury

+0

非常感謝Yury。這篇文章確實幫了我很大忙。 –

相關問題