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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                上面提到的switch/case語句,將實現IServiceManager中定義的各個業務函數,我們重點看do_add_service這個函數,它最終完成了對addService請求的處理實現,代碼如下所示: **Service_manager.c** ~~~ int do_add_service(struct binder_state *bs,uint16_t*s, unsigned len, void*ptr, unsigned uid) { structsvcinfo *si; if (!ptr|| (len == 0) || (len > 127)) return -1; //svc_can_register函數比較注冊進程的uid和名字。 if(!svc_can_register(uid, s)) { return -1; ...... ~~~ 將上面的函數暫時放一下,先介紹svc_can_register函數。 1. 不是什么都可以注冊的 do_add_service函數中的svc_can_register,是用來判斷注冊服務的進程是否有權限的,代碼如下所示: **Service_manager.c** ~~~ int svc_can_register(unsigned uid, uint16_t *name) { unsignedn; //如果用戶組是root用戶或者system用戶,則權限夠高,允許注冊 if ((uid== 0) || (uid == AID_SYSTEM)) return 1; for (n =0; n < sizeof(allowed) / sizeof(allowed[0]); n++) if((uid == allowed[n].uid) && str16eq(name, allowed[n].name)) return 1; return 0; } ~~~ allowed結構數組,控制那些權限達不到root和system的進程,它的定義如下所示: ~~~ static struct { unsigneduid; constchar *name; } allowed[] = { #ifdef LVMX {AID_MEDIA, "com.lifevibes.mx.ipc" }, #endif {AID_MEDIA, "media.audio_flinger" }, {AID_MEDIA, "media.player" }, {AID_MEDIA, "media.camera" }, {AID_MEDIA, "media.audio_policy" }, {AID_RADIO, "radio.phone" }, {AID_RADIO, "radio.sms" }, {AID_RADIO, "radio.phonesubinfo" }, {AID_RADIO, "radio.simphonebook" }, {AID_RADIO, "phone" }, {AID_RADIO, "isms" }, {AID_RADIO, "iphonesubinfo" }, {AID_RADIO, "simphonebook" }, }; ~~~ 所以,如果Server進程權限不夠root和system,那么請記住要在allowed中添加相應的項。 2. 添加服務項 再回到我們的do_add_service,如下所示: **Service_manager.c** ~~~ int do_add_service(struct binder_state *bs,uint16_t*s, unsigned len, void *ptr, unsigned uid){ ...... //接前面的代碼 si =find_svc(s, len); if (si) { if(si->ptr) { return -1; } si->ptr = ptr; } else { si =malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t)); if(!si) { return -1; } //ptr是關鍵數據,可惜為void*類型。只有分析驅動的實現才能知道它的真實含義了。 si->ptr = ptr; si->len = len; memcpy(si->name, s, (len + 1) * sizeof(uint16_t)); si->name[len] = '\0'; si->death.func = svcinfo_death;//service退出的通知函數 si->death.ptr = si; //這個svclist是一個list,保存了當前注冊到ServiceManager中的信息。 si->next = svclist; svclist = si; } binder_acquire(bs,ptr); /* 我們希望當服務進程退出后,ServiceManager能有機會做一些清理工作,例如釋放前面malloc出來的si。 binder_link_to_death完成這項工作,每當有服務進程退出時,ServiceManager都會得到來自 Binder設備的通知。 */ binder_link_to_death(bs, ptr, &si->death); return 0; } ~~~ 至此,服務注冊分析完畢。可以知道,ServiceManager不過就是保存了一些服務的信息。那么,這樣做又有什么意義呢?
                  <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>

                              哎呀哎呀视频在线观看