<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                pm_command代碼如下: **commandline.c** ~~~ static int pm_command(transport_type transport,char* serial, int argc, char** argv) { charbuf[4096]; snprintf(buf,sizeof(buf), "shell:pm"); ......//準備參數 //發送"shell:pm install 參數"給手機端的adbd send_shellcommand(transport, serial, buf); return0; } ~~~ 手機端的adbd在收到客戶端發來的shellpm命令時會啟動一個shell,然后在其中執行pm。pm是什么?為什么可以在shell下執行? * * * * * **提示**:讀者可以通過adb shell登錄到自己手機,然后執行pm,看看會發現什么。 * * * * * pm實際上是一個腳本,其內容如下: **pm** ~~~ # Script to start "pm" on the device,which has a very rudimentary # shell. # base=/system export CLASSPATH=$base/frameworks/pm.jar exec app_process $base/bincom.android.commands.pm.Pm "$@" ~~~ 在編譯system.image時,Android.mk中會將該腳本復制到system/bin目錄下。從pm腳本的內容來看,它就是通過app_process執行pm.jar包的main函數。在卷I第4章分析Zygote時,已經介紹了app_process是一個Native進程,它通過創建虛擬機啟動了Zygote,從而轉變為一個Java進程。實際上,app_process還可以通過類似的方法(即先創建Dalvik虛擬機,然后執行某個類的main函數)來轉變成其他Java程序。 >[info] **注意**:Android系統中常用的monkeytest、pm、am等(這些都是腳本文件)都是以這種方式啟動的,所以嚴格地說,app_process才是Android Java進程的老祖宗。 下面來分析pm.java,app_process執行的就是它定義的main函數,它相當于Java進程的入口函數,其代碼如下: **pm.java** ~~~ public static void main(String[] args) { newPm().run(args);//創建一個Pm對象,并執行它的run函數 } //直接分析run函數 public void run(String[] args) { boolean validCommand = false; ...... //獲取PKMS的binder客戶端 mPm= IPackageManager.Stub.asInterface( ServiceManager.getService("package")); ...... mArgs = args; String op = args[0]; mNextArg = 1; ......//處理其他命令,這里僅考慮install的處理 if("install".equals(op)) { runInstall(); return; } ...... } ~~~ 接下來分析pm.java的runInstall函數,代碼如下: **pm.java** ~~~ private void runInstall() { intinstallFlags = 0; String installerPackageName = null; String opt; while ((opt=nextOption()) != null) { if (opt.equals("-l")) { installFlags |= PackageManager.INSTALL_FORWARD_LOCK; } else if (opt.equals("-r")) { installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; } else if (opt.equals("-i")) { installerPackageName = nextOptionData(); ...... //參數解析 } ...... } final Uri apkURI; final Uri verificationURI; final String apkFilePath = nextArg(); System.err.println("/tpkg: " + apkFilePath); if(apkFilePath != null) { apkURI = Uri.fromFile(new File(apkFilePath)); }...... //獲取Verification Package的文件位置 final String verificationFilePath = nextArg(); if(verificationFilePath != null) { verificationURI = Uri.fromFile(new File(verificationFilePath)); }else { verificationURI = null; } //創建PackageInstallObserver,用于接收PKMS的安裝結果 PackageInstallObserver obs = new PackageInstallObserver(); try{ //①調用PKMS的installPackageWithVerification完成安裝 mPm.installPackageWithVerification(apkURI, obs, installFlags,installerPackageName, verificationURI,null); synchronized (obs) { while(!obs.finished) { try{ obs.wait();//等待安裝結果 } ...... } if(obs.result == PackageManager.INSTALL_SUCCEEDED) { System.out.println("Success");//安裝成功,打印Success }......//安裝失敗,打印失敗原因 } ...... } ~~~ Pm解析參數后,最終通過PKMS的Binder客戶端調用installPackageWithVerification以完成后續的安裝工作,所以,下面進入PKMS看看安裝到底是怎么一回事。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看