android應用程序的安裝方式與原理(轉載)

android應用程序的安裝方式與原理

四種安裝方式:

1.系統應用安裝――開機時完成,沒有安裝界面

2.網絡下載應用安裝――通過market應用完成,沒有安裝界面

3.ADB工具安裝――沒有安裝界面。

4.第三方應用安裝――通過SD卡里的APK文件安裝,有安裝界面,由packageinstaller.apk應用處理安裝及卸載過程的界面。

 

應用安裝的流程及路徑 
應用安裝涉及到如下幾個目錄:        

system/app ---------------系統自帶的應用程序,獲得adb root權限才能刪除

data/app  ---------------用戶程序安裝的目錄。安裝時把                                                                                                      apk文件複製到此目錄
data/data ---------------存放應用程序的數據
data/dalvik-cache--------將apk中的dex文件安裝到dalvik-cache目錄下(dex文件是dalvik虛擬機的可執行文件,其大小約爲原始apk文件大小的四分之一)

安裝過程:

複製APK安裝包到data/app目錄下,解壓並掃描安裝包,把dex文件(Dalvik字節碼)保存到dalvik-cache目錄,並data/data目錄下創建對應的應用數據目錄。

卸載過程:

刪除安裝過程中在上述三個目錄下創建的文件及目錄。

 

安裝過程詳解

 

安裝應用的過程解析

一.開機安裝 
PackageManagerService處理各種應用的安裝,卸載,管理等工作,開機時由systemServer啓動此服務

(源文件路徑:android\frameworks\base\services\java\com\android\server\PackageManagerService.java

PackageManagerService服務啓動的流程:

1.首先掃描安裝“system\framework”目錄下的jar包

2.掃描安裝系統system/app的應用程序

3.製造商的目錄下/vendor/app應用包

4.掃描“data\app”目錄,即用戶安裝的第三方應用

5.掃描" data\app-private"目錄,即安裝DRM保護的APK文件(一個受保護的歌曲或受保 護的視頻是使用 DRM 保護的文件)

並且從該掃描方法中可以看出調用了scanPackageList()

private PackageParser.Package scanPackageList(File scanFile,int parseFlags, int scanMode, long currentTime)

跟蹤scanPackageList()方法後發現,程序經過很多次的if else 的篩選,最後判定可以安裝後調用了 mInstaller.install

mInstaller.install()  通過    

  LocalSocketAddress address = new LocalSocketAddress(

                "installd", LocalSocketAddress.Namespace.RESERVED);

指揮installd在C語言的文件中完成工作

PackageManagerService小節 :

1)從apk, xml中載入pacakge信息, 存儲到內部成員變量中, 用於後面的查找. 關鍵的方法

    是scanPackageList().

2)各種查詢操作, 包括query Intent操作.
3)install package和delete package的操作. 還有後面的關鍵方法是installPackageList().

二、從網絡上下載應用:

  下載完成後,會自動調用Packagemanager的安裝方法installPackage()   

   PackageManagerService類的installPackage()函數

   其中是通過PackageHandler的實例mhandler.sendMessage(msg)把信息發給繼承Handler的類HandleMessage()方法......最後終於回到了和開機安裝一樣的地方.與開機方式安裝調用統一方法。

三、從ADB工具安裝 

   其入口函數源文件爲pm.java 

   (源文件路徑:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java)

   其中\system\framework\pm.jar 包管理庫

   包管理腳本 \system\bin\pm 解析

   其中的PackageInstallObserver obs = new PackageInstallObserver();             

   mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,

                    installerPackageName);   

四、從SD卡安裝

      系統調用PackageInstallerActivity.java(/home/zhongda/androidSRC/vortex-8inch-for-hoperun/packages/apps/PackageInstaller/src/com/android/packageinstaller)

進入這個Activity會判斷信息是否有錯,然後調用

      private void initiateInstall()判斷是否曾經有過同名包的安裝,或者包已經安裝

通過後執行private void startInstallConfirm() 點擊OK按鈕後經過一系列的安裝

轉自:http://www.eoeandroid.com/thread-199461-1-1.html

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