Android應用安裝過程及原理

來源:互聯網
上載者:User

標籤:

#標籤:讀部落格



看了一圈我就笑了,其實最後安裝都回到了PMS的調用。 

:)

本文轉載自:http://www.miui.com/thread-759958-1-1.html

Android應用安裝的流程及路徑:

應用安裝涉及到如下幾個目錄:

system/app               系統內建的應用程式,無法刪除

data/app                   使用者程式安裝的目錄,有刪除許可權。安裝時把apk檔案複製到此目錄

data/data                   存放應用程式的資料

Data/dalvik-cache   將apk中的dex檔案安裝到dalvik-cache目錄下(dex檔案是dalvik虛擬機器的可執行檔,其大小約為原始apk檔案大小的四分之一)

安裝過程:

複製APK安裝包到data/app目錄下,解壓並掃描安裝包,把dex檔案(Dalvik位元組碼)儲存到dalvik-cache目錄,並data/data目錄下建立對應的應用資料目錄。

卸載過程:

刪除安裝過程中在上述三個目錄下建立的檔案及目錄。

Android應用安裝的四種方式:

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

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

(源檔案路徑:android\frameworks\base\services\java\com\android\server\PackageManagerService.java)

PackageManagerService服務啟動的流程:

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

1. scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM,

                    scanMode | SCAN_NO_DEX);


2.第二步掃描安裝“system\app”目錄下的各個系統應用

scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM, scanMode);


3.第三步掃描“data\app”目錄,即使用者安裝的第三方應用

scanDirLI(mAppInstallDir, 0, scanMode);


4.第四步掃描" data\app-private"目錄,即安裝DRM保護的APK檔案(目前沒有遇到過此類的應用)。

scanDirLI(mDrmAppPrivateInstallDir,0, scanMode | SCAN_FORWARD_LOCKED);


安裝應用的過程

1.scanDirLI(Filedir, int flags, int scanMode) 遍曆安裝指定目錄下的檔案

2.scanPackageLI(FilescanFile,

            File destCodeFile, FiledestResourceFile, int parseFlags,

            int scanMode)                安裝package檔案

3.scanPackageLI(

        File scanFile, File destCodeFile, FiledestResourceFile,

        PackageParser.Package pkg, intparseFlags, int scanMode)

通過解析安裝包parsePackage擷取到安裝包的資訊結構

4.mInstaller.install(pkgName,pkg.applicationInfo.uid,

              pkg.applicationInfo.uid);   實現檔案複製的安裝過程

(源檔案路徑:frameworks\base\cmds\installd\installd.install)

網路下載應用安裝:通過market應用完成,沒有安裝介面

Google Market應用需要使用gmail賬戶登入才可以使用,選擇某一應用後,開始下載安裝包,此過程中,在手機的訊號區有進度條提示,下載完成後,會自動調用Packagemanager的介面安裝,調用介面如下:

public voidinstallPackage(final Uri packageURI, final IPackageInstallObserver observer,final int flags)

final Uri packageURI:檔案下載完成後儲存的路徑

final IPackageInstallObserver observer:處理返回的安裝結果

final int flags:安裝的參數,從market上下載的應用,安裝參數為-r (replace)

installPackage介面函數的安裝過程:

1.public voidinstallPackage(

            final Uri packageURI, final IPackageInstallObserverobserver, final int flags,

            final String installerPackageName)

final StringinstallerPackageName:安裝完成後此名稱儲存在settings裡,一般為null,不是關鍵參數

2.FiletmpPackageFile = copyTempInstallFile(packageURI, res);

把apk檔案複製到臨時目錄下的臨時檔案

3.private voidinstallPackageLI(Uri pPackageURI,

            int pFlags, boolean newInstall,String installerPackageName,

           File tmpPackageFile, PackageInstalledInfo res)

解析臨時檔案,擷取應用程式套件名pkgName = PackageParser.parsePackageName(

                   tmpPackageFile.getAbsolutePath(), 0);

4.判斷如果帶有參數INSTALL_REPLACE_EXISTING,則調用replacePackageLI(pkgName,

                        tmpPackageFile,

                        destFilePath,destPackageFile, destResourceFile,

                        pkg, forwardLocked,newInstall, installerPackageName,

                        res)

5.如果沒有,則調用installNewPackageLI(pkgName,

                        tmpPackageFile,

                        destFilePath,destPackageFile, destResourceFile,

                        pkg,forwardLocked, newInstall, installerPackageName,

                        res);

6.privatePackageParser.Package scanPackageLI(

        File scanFile, File destCodeFile, FiledestResourceFile,

        PackageParser.Package pkg, intparseFlags, int scanMode)

scanPackageLI以後的流程,與開機時的應用安裝流程相同。

ADB工具安裝:沒有安裝介面。

Android Debug Bridge (adb) 是SDK內建的管理裝置的工具,通過ADB命令列的方式也可以為手機或模擬器安裝應用,其入口函數源檔案為pm.java

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

ADB命令列的形式為adb install <path_to_apk> ,還可以帶安裝參數如:"-l""-r" "-i" "-t"

函數runInstall()中判斷參數

"-l"――INSTALL_FORWARD_LOCK

"-r"——INSTALL_REPLACE_EXISTING 

"-i" ——installerPackageName

"-t"——INSTALL_ALLOW_TEST

我們常用的參數為-r,表示覆蓋安裝手機上已安裝的同名應用。從market上下載的應用,也是直接傳入這個參數安裝的。

runInstall與market調用同樣的介面完成應用安裝。

public voidinstallPackage(android.net.Uri packageURI,android.content.pm.IPackageInstallObserver observer, int flags,java.lang.String installerPackageName)

4.第三方應用安裝:通過SD卡裡的APK檔案安裝,有安裝介面,由packageinstaller.apk應用處理安裝及卸載過程的介面。

把APK安裝包儲存在SD卡中,從手機裡訪問SD卡中的APK安裝包,點擊就可以啟動安裝介面,系統應用Packageinstaller.apk處理這種方式下的安裝及卸載介面流程,如:


PackageInstallerActivity負責解析包,判斷是否是可用的Apk檔案

建立臨時安裝檔案/data/data/com.android.packageinstaller/files/ApiDemos.apk

並啟動安裝確認介面startInstallConfirm,列出解析得到的該應用基本資料。如果手機上已安裝有同名應用,則需要使用者確認是否要替換安裝。

確認安裝後,啟動InstallAppProgress,調用安裝介面完成安裝。

pm.installPackage(mPackageURI,observer, installFlags);

其它: 

1. PackageManagerService.java的內部類AppDirObserver實現了監聽app目錄的功能:當把某個APK拖到app目錄下時,可以直接調用scanPackageLI完成安裝。

2.行動數據區目錄“data/system/packages.xml”檔案中,包含了手機上所有已安裝應用的基本資料,如安裝路徑,申請的permission等資訊。



安裝是個啥意思?

1. 把組件資訊統一放入PMS中管理

2. 把apk檔案copy到指定目錄(中間可能經曆臨時目錄/data/local/tmp或者/sdcard/tmp),並且做過dexopt的檔案放在/data/dalvik-cache目錄

3. copy的同時也建立了資料目錄


把流程搞清楚,代碼就是手冊,用的時候,或者需要的時候查手冊就可以了。-----我的Boss是這樣說的.


merlin

2015/10/22



Android應用安裝過程及原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.