<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                PackageManagerService是本書分析的第一個核心服務,也是Android系統中最常用的服務之一。它負責系統中Package的管理,應用程序的安裝、卸載、信息查詢等。圖4-1展示了PackageManagerService及客戶端的類家族。 :-: ![](http://img.blog.csdn.net/20150803110319692?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 圖4-1 PackageManagerService及客戶端類家族 由圖4-1可知: - IPackageManager接口類中定義了服務端和客戶端通信的業務函數,還定義了內部類Stub,該類從Binder派生并實現了IPackageManager接口。 - PackageManagerService繼承自IPackageManager.Stub類,由于Stub類從Binder派生,因此PackageManagerService將作為服務端參與Binder通信。 - Stub類中定義了一個內部類Proxy,該類有一個IBinder類型(實際類型為BinderProxy)的成員變量mRemote,根據第2章介紹的Binder系統的知識,mRemote用于和服務端PackageManagerService通信。 - IPackageManager接口類中定義了許多業務函數,但是出于安全等方面的考慮,Android對外(即SDK)提供的只是一個子集,該子集被封裝在抽象類PackageManager中。客戶端一般通過Context的getPackageManager函數返回一個類型為PackageManager的對象,該對象的實際類型是PackageManager的子類ApplicationPackageManager。這種基于接口編程的方式,雖然極大降低了模塊之間的耦合性,卻給代碼分析帶來了不小的麻煩。 - ApplicationPackageManager類繼承自PackageManager類。它并沒有直接參與Binder通信,而是通過mPM成員變量指向一個IPackageManager.Stub.Proxy類型的對象。 * * * * * **提示**:讀者在源碼中可能找不到IPackageManager.java文件。該文件在編譯過程中是經aidl工具處理IPackageManager.aidl后得到,最終的文件位置在Android源碼/out/target /common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/content/pm/目錄中。如果讀者沒有整體編譯過源碼,也可使用aidl工具單獨處理IPackageManager.aidl。 * * * * * aidl工具生成的結果文件有著相似的代碼結構。讀者不妨看看下面這個筆者通過編譯生成的IPackageManager.java文件。注意,aidl工具生成的結果文件沒有格式縮進,所以看起來慘不忍睹,讀者可用Eclipse中的源文件格式化命令處理它。 **IPackageManager.java** ~~~ public interface IPackageManager extendsandroid.os.IInterface { //定義內部類Stub,派生自Binder,實現IPackageManager接口 publicstatic abstract class Stub extends android.os.Binder implements android.content.pm.IPackageManager { privatestatic final java.lang.String DESCRIPTOR = "android.content.pm.IPackageManager"; publicStub() { this.attachInterface(this,DESCRIPTOR); } ...... //定義Stub的內部類Proxy,實現IPackageManager接口 privatestatic class Proxy implements android.content.pm.IPackageManager{ //通過mRemote變量和服務端交互 private android.os.IBinder mRemote; Proxy(android.os.IBinderremote) { mRemote = remote; } ...... } ...... } ~~~ 接下來分析PackageManagerService,為書寫方便起見,以后將其簡稱為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>

                              哎呀哎呀视频在线观看