• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks
            http://topic.csdn.net/u/20110410/23/43571CFA-87B2-4E36-880C-1FA499BA32B0.html
            應用安裝是智能機的主要特點,即用戶可以把各種應用(如游戲等)安裝到手機上,并可以對其進行卸載等管理操作。APK是Android Package的縮寫,即Android安裝包。APK是類似Symbian Sis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器或Android手機中執行即可安裝。

            Android應用安裝有如下四種方式
            1. 系統應用安裝――開機時完成,沒有安裝界面
            2. 網絡下載應用安裝――通過market應用完成,沒有安裝界面
            3. ADB工具安裝――沒有安裝界面。
            4. 第三方應用安裝――通過SD卡里的APK文件安裝,有安裝界面,由packageinstaller.apk應用處理安裝及卸載過程的界面。
            應用安裝的流程及路徑
            應用安裝涉及到如下幾個目錄:
            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目錄下創建對應的應用數據目錄。
            卸載過程:刪除安裝過程中在上述三個目錄下創建的文件及目錄。
             

            一、系統應用安裝:
            PackageManager Service處理各種應用的安裝,卸載,管理等工作,開機時由systemServer啟動此服務
            (源文件路徑:android\frameworks\base\services\java\com\android\server\ PackageManagerService.java)
             
             
            PackageManager Service服務啟動的流程:
            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(File dir, int flags, int scanMode) 遍歷安裝指定目錄下的文件

            2.scanPackageLI(File scanFile,
              File destCodeFile, File destResourceFile, 
            int parseFlags,
              
            int scanMode) 安裝package文件

            3.scanPackageLI(
              File scanFile, File destCodeFile, File destResourceFile,
              PackageParser.Package pkg, 
            int parseFlags, 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 void installPackage(final Uri packageURI, final IPackageInstallObserver observer, final int flags)
            final Uri packageURI:文件下載完成后保存的路徑
            final IPackageInstallObserver observer:處理返回的安裝結果
            final int flags:安裝的參數,從market上下載的應用,安裝參數為-r (replace)
            installPackage接口函數的安裝過程:
            1.public void installPackage(
              
            final Uri packageURI, final IPackageInstallObserver observer, final int flags,
              
            final String installerPackageName)
            final String installerPackageName:安裝完成后此名稱保存在settings里,一般為null,不是關鍵參數
            2.File tmpPackageFile = copyTempInstallFile(packageURI, res);
            把apk文件復制到臨時目錄下的臨時文件
            3.private void installPackageLI(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.private PackageParser.Package scanPackageLI(
              File scanFile, File destCodeFile, File destResourceFile,
              PackageParser.Package pkg, 
            int parseFlags, 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 void installPackage(android.net.Uri packageURI, android.content.pm.IPackageInstallObserver observer, int flags, java.lang.String installerPackageName)
            四、第三方應用安裝――通過SD卡里的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等信息。
            posted on 2012-04-08 22:29 life02 閱讀(587) 評論(0)  編輯 收藏 引用 所屬分類: android組件學習
            国内精品久久久久久麻豆| 久久99精品久久久久久久久久| 欧美粉嫩小泬久久久久久久| 久久精品国产一区二区三区不卡| 国产精品永久久久久久久久久| 免费一级欧美大片久久网| 久久只有这精品99| 久久久久久久久久久久中文字幕 | 中文字幕成人精品久久不卡| 2020最新久久久视精品爱 | 一本色道久久88加勒比—综合| 国产精品成人99久久久久 | 亚洲精品综合久久| 日韩精品无码久久久久久| 日韩精品国产自在久久现线拍| 香蕉久久永久视频| 97精品久久天干天天天按摩| 久久久久噜噜噜亚洲熟女综合| 青草国产精品久久久久久| 精品久久国产一区二区三区香蕉| 久久人妻少妇嫩草AV蜜桃| 日韩亚洲欧美久久久www综合网| 伊人久久亚洲综合影院| 欧美综合天天夜夜久久| 国产亚洲精品久久久久秋霞 | 2021国内久久精品| 日本精品久久久中文字幕| 国产免费久久精品99re丫y| 国产午夜久久影院| 狠狠色丁香婷婷久久综合| 久久99国产精品久久| 亚洲国产精品18久久久久久| 精品乱码久久久久久夜夜嗨 | 99久久精品九九亚洲精品| 精品综合久久久久久98| 精品乱码久久久久久夜夜嗨| .精品久久久麻豆国产精品| 久久精品极品盛宴观看| 久久久久国产精品嫩草影院| 人人狠狠综合久久亚洲婷婷| 久久久女人与动物群交毛片|