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

            Android應(yīng)用安裝有如下四種方式
            1. 系統(tǒng)應(yīng)用安裝――開機(jī)時完成,沒有安裝界面
            2. 網(wǎng)絡(luò)下載應(yīng)用安裝――通過market應(yīng)用完成,沒有安裝界面
            3. ADB工具安裝――沒有安裝界面。
            4. 第三方應(yīng)用安裝――通過SD卡里的APK文件安裝,有安裝界面,由packageinstaller.apk應(yīng)用處理安裝及卸載過程的界面。
            應(yīng)用安裝的流程及路徑
            應(yīng)用安裝涉及到如下幾個目錄:
            system
            /app 系統(tǒng)自帶的應(yīng)用程序,無法刪除
            data
            /app 用戶程序安裝的目錄,有刪除權(quán)限。
            安裝時把a(bǔ)pk文件復(fù)制到此目錄
            data
            /data 存放應(yīng)用程序的數(shù)據(jù)
            Data
            /dalvik-cache 將apk中的dex文件安裝到dalvik-cache目錄下(dex文件是dalvik虛擬機(jī)的可執(zhí)行文件,其大小約為原始apk文件大小的四分之一)

            安裝過程:復(fù)制APK安裝包到data
            /app目錄下,解壓并掃描安裝包,把dex文件(Dalvik字節(jié)碼)保存到dalvik-cache目錄,并data/data目錄下創(chuàng)建對應(yīng)的應(yīng)用數(shù)據(jù)目錄。
            卸載過程:刪除安裝過程中在上述三個目錄下創(chuàng)建的文件及目錄。
             

            一、系統(tǒng)應(yīng)用安裝:
            PackageManager Service處理各種應(yīng)用的安裝,卸載,管理等工作,開機(jī)時由systemServer啟動此服務(wù)
            (源文件路徑:android\frameworks\base\services\java\com\android\server\ PackageManagerService.java)
             
             
            PackageManager Service服務(wù)啟動的流程:
            1. 首先掃描安裝“system\framework”目錄下的jar包
            1. scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM,
              scanMode 
            | SCAN_NO_DEX);
             
             
            2.第二步掃描安裝“system\app”目錄下的各個系統(tǒng)應(yīng)用
            scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode);
             
            3.第三步掃描“data\app”目錄,即用戶安裝的第三方應(yīng)用
            scanDirLI(mAppInstallDir, 
            0, scanMode);
             
            4.第四步掃描" data\app-private"目錄,即安裝DRM保護(hù)的APK文件(目前沒有遇到過此類的應(yīng)用)。
            scanDirLI(mDrmAppPrivateInstallDir, 
            0, scanMode | SCAN_FORWARD_LOCKED);

            安裝應(yīng)用的過程
            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獲取到安裝包的信息結(jié)構(gòu) 

            4.mInstaller.install(pkgName, pkg.applicationInfo.uid,
              pkg.applicationInfo.uid); 實(shí)現(xiàn)文件復(fù)制的安裝過程
            (源文件路徑:frameworks\base\cmds\installd\installd.install)
             
            二、從market上下載應(yīng)用:
            Google Market應(yīng)用需要使用gmail賬戶登錄才可以使用,選擇某一應(yīng)用后,開始下載安裝包,此過程中,在手機(jī)的信號區(qū)有進(jìn)度條提示,下載完成后,會自動調(diào)用Packagemanager的接口安裝,調(diào)用接口如下:
            public void installPackage(final Uri packageURI, final IPackageInstallObserver observer, final int flags)
            final Uri packageURI:文件下載完成后保存的路徑
            final IPackageInstallObserver observer:處理返回的安裝結(jié)果
            final int flags:安裝的參數(shù),從market上下載的應(yīng)用,安裝參數(shù)為-r (replace)
            installPackage接口函數(shù)的安裝過程:
            1.public void installPackage(
              
            final Uri packageURI, final IPackageInstallObserver observer, final int flags,
              
            final String installerPackageName)
            final String installerPackageName:安裝完成后此名稱保存在settings里,一般為null,不是關(guān)鍵參數(shù)
            2.File tmpPackageFile = copyTempInstallFile(packageURI, res);
            把a(bǔ)pk文件復(fù)制到臨時目錄下的臨時文件
            3.private void installPackageLI(Uri pPackageURI,
              
            int pFlags, boolean newInstall, String installerPackageName,
              File tmpPackageFile, PackageInstalledInfo res)
            解析臨時文件,獲取應(yīng)用包名pkgName 
            = PackageParser.parsePackageName(
              tmpPackageFile.getAbsolutePath(), 
            0);
            4.判斷如果帶有參數(shù)INSTALL_REPLACE_EXISTING,則調(diào)用replacePackageLI(pkgName,
              tmpPackageFile, 
              destFilePath, destPackageFile, destResourceFile,
              pkg, forwardLocked, newInstall, installerPackageName,
              res)
            5.如果沒有,則調(diào)用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以后的流程,與開機(jī)時的應(yīng)用安裝流程相同。
            三、從ADB工具安裝
            Android Debug Bridge (adb) 是SDK自帶的管理設(shè)備的工具,通過ADB命令行的方式也可以為手機(jī)或模擬器安裝應(yīng)用,其入口函數(shù)源文件為pm.java 
            (源文件路徑:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java)
            ADB命令行的形式為adb install 
            <path_to_apk> ,還可以帶安裝參數(shù)如:"-l" "-r" "-i" "-t"
            函數(shù)runInstall()中判斷參數(shù)
            "-l"――INSTALL_FORWARD_LOCK
             
            "-r"—— INSTALL_REPLACE_EXISTING  
            "-i" ——installerPackageName
            "-t"——INSTALL_ALLOW_TEST
            我們常用的參數(shù)為
            -r,表示覆蓋安裝手機(jī)上已安裝的同名應(yīng)用。從market上下載的應(yīng)用,也是直接傳入這個參數(shù)安裝的。
            runInstall與market調(diào)用同樣的接口完成應(yīng)用安裝。
            public void installPackage(android.net.Uri packageURI, android.content.pm.IPackageInstallObserver observer, int flags, java.lang.String installerPackageName)
            四、第三方應(yīng)用安裝――通過SD卡里的APK文件安裝
            把APK安裝包保存在SD卡中,從手機(jī)里訪問SD卡中的APK安裝包,點(diǎn)擊就可以啟動安裝界面,系統(tǒng)應(yīng)用Packageinstaller.apk處理這種方式下的安裝及卸載界面流程,如下圖:
             
            PackageInstallerActivity負(fù)責(zé)解析包,判斷是否是可用的Apk文件
            創(chuàng)建臨時安裝文件
            /data/data/com.android.packageinstaller/files/ApiDemos.apk
            并啟動安裝確認(rèn)界面startInstallConfirm,列出解析得到的該應(yīng)用基本信息。如果手機(jī)上已安裝有同名應(yīng)用,則需要用戶確認(rèn)是否要替換安裝。
            確認(rèn)安裝后,啟動InstallAppProgress,調(diào)用安裝接口完成安裝。
            pm.installPackage(mPackageURI, observer, installFlags);
            其它:
            1. PackageManagerService.java的內(nèi)部類AppDirObserver實(shí)現(xiàn)了監(jiān)聽app目錄的功能:當(dāng)把某個APK拖到app目錄下時,可以直接調(diào)用scanPackageLI完成安裝。
            2.手機(jī)數(shù)據(jù)區(qū)目錄“data/system/packages.xml”文件中,包含了手機(jī)上所有已安裝應(yīng)用的基本信息,如安裝路徑,申請的permission等信息。
            posted on 2012-04-08 22:29 life02 閱讀(587) 評論(0)  編輯 收藏 引用 所屬分類: android組件學(xué)習(xí)
            国产精品青草久久久久婷婷 | 97精品国产97久久久久久免费| 色婷婷综合久久久中文字幕| 日本高清无卡码一区二区久久 | 亚洲精品乱码久久久久久久久久久久 | 偷窥少妇久久久久久久久| 久久99国产一区二区三区| 东京热TOKYO综合久久精品| 久久人人爽人人爽人人AV东京热| 亚洲女久久久噜噜噜熟女| 久久精品国产亚洲AV不卡| 久久综合亚洲色HEZYO社区 | 亚洲国产精品无码久久九九| 激情综合色综合久久综合| 四虎影视久久久免费| 亚洲午夜精品久久久久久app| 狠狠色丁香久久婷婷综合_中| 热综合一本伊人久久精品| 久久精品桃花综合| 色偷偷久久一区二区三区| 色综合色天天久久婷婷基地| 韩国三级中文字幕hd久久精品| 精品久久久久久久久久中文字幕| 色婷婷久久久SWAG精品| 亚洲va久久久噜噜噜久久男同| 国产精品99久久久久久人| 久久精品女人天堂AV麻| 久久久久久久久久久| 996久久国产精品线观看| 久久国产精品国语对白| 精品熟女少妇AV免费久久| 国产精品久久久久aaaa| 欧美日韩精品久久久久| 亚洲国产精品无码久久一区二区| 2021久久国自产拍精品| 久久久久国产| 成人久久综合网| 伊人久久综合无码成人网| 99久久精品无码一区二区毛片 | 久久久精品人妻一区二区三区四| 久久久青草青青亚洲国产免观|