binder LAZY 模式介紹

一簡(jiǎn)介

從android 10開始袋励,hwbinder引入了lazy service模式,android R正式引入到binder中沟于。使用lazy方式注冊(cè)的binder或者h(yuǎn)idl servicer在client退出后確認(rèn)相關(guān)service沒有client調(diào)用后會(huì)自動(dòng)退出,讓出系統(tǒng)資源,節(jié)省內(nèi)存占用日戈。比較智能。

二 原理

1) hidl service lazy 注冊(cè)接口

class LazyServiceRegistrarImpl {
   public:
    LazyServiceRegistrarImpl() : mClientCallback(new ClientCounterCallback) {}

    status_t registerService(const sp<::android::hidl::base::V1_0::IBase>& service,
                             const std::string& name);

   private:
    sp<ClientCounterCallback> mClientCallback;
};

注冊(cè)hidl service成功后多了個(gè)onClients回調(diào)孙乖,在client連接數(shù)為0時(shí)退出service


/**
 * onClients is oneway, so no need to worry about multi-threading. Note that this means multiple
 * invocations could occur on different threads however.
 */
Return<void> ClientCounterCallback::onClients(const sp<::android::hidl::base::V1_0::IBase>& service,
                                              bool clients) {
    if (clients) {
        mNumConnectedServices++;
    } else {
        mNumConnectedServices--;
    }

    LOG(INFO) << "Process has " << mNumConnectedServices << " (of " << mRegisteredServices.size()
              << " available) client(s) in use after notification " << getDescriptor(service.get())
              << " has clients: " << clients;

    if (mNumConnectedServices == 0) {
        tryShutdown();
    }

    return Status::ok();
}

在hwservicemanager側(cè)注冊(cè)的Hidl service會(huì)判斷當(dāng)前的client數(shù)浙炼,如果有client那么就發(fā)送sendClientCallbackNotifications(true);通知對(duì)應(yīng)的hidl service。如果client為空的話sendClientCallbackNotifications(false)通知hidl service client為空了唯袄。

ssize_t HidlService::forceHandleClientCallbacks(bool isCalledOnInterval) {
    ssize_t count = getNodeStrongRefCount();

    // binder driver doesn't support this feature
    if (count == -1) return count;

    bool hasClients = count > 1; // this process holds a strong count

    if (mGuaranteeClient) {
        // we have no record of this client
        if (!mHasClients && !hasClients) {
            sendClientCallbackNotifications(true);
        }

        // guarantee is temporary
        mGuaranteeClient = false;
    }

    if (hasClients && !mHasClients) {
        // client was retrieved in some other way
        sendClientCallbackNotifications(true);
    }

    // there are no more clients, but the callback has not been called yet
    if (!hasClients && mHasClients && isCalledOnInterval) {
        mNoClientsCounter++;

        if (mNoClientsCounter >= kNoClientRepeatLimit) {
            sendClientCallbackNotifications(false);
        }
    }

    return count;
}

forceHandleClientCallbacks調(diào)用的幾個(gè)時(shí)機(jī):
1) 在client get service時(shí)通知hidl servie mNumConnectedServices++

  1. 取消注冊(cè)時(shí)tryUnregister
    3) ClientCallbackCallback 調(diào)用mManager->handleClientCallbacks();interval是5秒鐘

三 總結(jié)

從android R開始弯屈,binder借鑒了hidl也引入了lazy模式,具體見frameworks/native/libs/binder/LazyServiceRegistrar.cpp恋拷,原理同HIDL方式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末季俩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梅掠,更是在濱河造成了極大的恐慌酌住,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阎抒,死亡現(xiàn)場(chǎng)離奇詭異酪我,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)且叁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門都哭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事欺矫∩葱拢” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵穆趴,是天一觀的道長(zhǎng)脸爱。 經(jīng)常有香客問我,道長(zhǎng)未妹,這世上最難降的妖魔是什么簿废? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮络它,結(jié)果婚禮上族檬,老公的妹妹穿的比我還像新娘。我一直安慰自己化戳,他們只是感情好单料,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著点楼,像睡著了一般扫尖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盟步,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天藏斩,我揣著相機(jī)與錄音,去河邊找鬼却盘。 笑死狰域,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黄橘。 我是一名探鬼主播兆览,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼塞关!你這毒婦竟也來了抬探?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤帆赢,失蹤者是張志新(化名)和其女友劉穎小压,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椰于,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怠益,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘾婿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜻牢。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烤咧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抢呆,到底是詐尸還是另有隱情煮嫌,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布抱虐,位于F島的核電站昌阿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梯码。R本人自食惡果不足惜宝泵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一好啰、第九天 我趴在偏房一處隱蔽的房頂上張望轩娶。 院中可真熱鬧,春花似錦框往、人聲如沸鳄抒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽许溅。三九已至,卻和暖如春秉版,著一層夾襖步出監(jiān)牢的瞬間贤重,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工清焕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留并蝗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓秸妥,卻偏偏與公主長(zhǎng)得像滚停,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粥惧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容