Android:播放系統(tǒng)效果音導(dǎo)致ANR問題分析

最近遇到一個問題,在瘋狂點擊按鈕后胆绊,手機出現(xiàn)ANR

步驟一:通過查看ANR的log氨鹏,發(fā)現(xiàn)AudioTrack占用了將近100%的CPU

步驟二:分析AudioTrack的代碼

通過AudioTrack的PID,確認(rèn)到這個AudioTrack屬于system_server压状。
而這個AudioTrack是在播放按鈕的效果音仆抵。

步驟三:分析AudioTrack的代碼是否存在循環(huán)

bool AudioTrack::AudioTrackThread::threadLoop()
{
    ..................
        if (mPaused) {
            mMyCond.wait(mMyLock);
            // caller will check for exitPending()
            return true;
        }
    nsecs_t ns = mReceiver.processAudioBuffer();
   ...................
}

通過加log發(fā)現(xiàn),AudioTrack線程在threadLoop中瘋狂的循環(huán)种冬,這個就是導(dǎo)致CPU占用高的原因镣丑。我關(guān)閉掉系統(tǒng)效果音之后,ANR就沒法復(fù)現(xiàn)了碌廓。
理論上,這個threadLoop()會在mMyCond.wait停下來剩盒,但是現(xiàn)在沒有停下來谷婆,說明mPaused變量一直沒false,說明AudioTrack::stop函數(shù)一直沒有被調(diào)用辽聊。

步驟四:尋找AudioTrack::stop的入口

最后發(fā)現(xiàn)是在SoundPool.cpp的run函數(shù)中調(diào)用stop的

int SoundPool::run()
{
    mRestartLock.lock();
    while (!mQuit) {
        mCondition.wait(mRestartLock);
        ALOGV("awake");
        if (mQuit) break;
        while (!mStop.empty()) {
            SoundChannel* channel;
            ALOGV("Getting channel from stop list");
            List<SoundChannel* >::iterator iter = mStop.begin();
            channel = *iter;
              this, channel->mChannelID);
            mStop.erase(iter);
            mRestartLock.unlock();
            if (channel != 0) {
                Mutex::Autolock lock(&mLock);
                channel->stop();   //這里去stop
            }
            mRestartLock.lock();
            if (mQuit) break;
        }

        while (!mRestart.empty()) {
            SoundChannel* channel;
            ALOGV("Getting channel from list");
            List<SoundChannel*>::iterator iter = mRestart.begin();
            channel = *iter;
            mRestart.erase(iter);
            mRestartLock.unlock();
            if (channel != 0) {
                Mutex::Autolock lock(&mLock);
                channel->nextEvent();
            }
            mRestartLock.lock();
            if (mQuit) break;
        }
    }
    mStop.clear();
    mRestart.clear();
    mCondition.signal();
    mRestartLock.unlock();
    ALOGV("goodbye");
    return 0;
}

那為什么沒有調(diào)用到channel->stop纪挎,最后分析發(fā)現(xiàn)卡在了mCondition.wait中,而通過分析發(fā)現(xiàn)下面函數(shù)的signal已經(jīng)調(diào)用了跟匆,但卻沒有喚醒

void SoundPool::addToStopList(SoundChannel* channel)
{
    Mutex::Autolock lock(&mRestartLock);
    if (!mQuit) {
        mStop.push_back(channel);
        mCondition.signal();
        KPOC_LOGE("addToStopList.signal mQuit= %d",mQuit);
    }
}

這種情況异袄,我分析是cpu占用過高了,導(dǎo)致喚醒非常地慢玛臂。當(dāng)然這個只是猜測烤蜕。

接下來能做什么?對比processAudioBuffer的流程迹冤。查看R狀態(tài)死鎖讽营。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泡徙,隨后出現(xiàn)的幾起案子橱鹏,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莉兰,死亡現(xiàn)場離奇詭異挑围,居然都是意外死亡,警方通過查閱死者的電腦和手機糖荒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門杉辙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寂嘉,你說我怎么就攤上這事奏瞬。” “怎么了泉孩?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵硼端,是天一觀的道長。 經(jīng)常有香客問我寓搬,道長珍昨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任句喷,我火速辦了婚禮镣典,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唾琼。我一直安慰自己兄春,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布锡溯。 她就那樣靜靜地躺著赶舆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祭饭。 梳的紋絲不亂的頭發(fā)上芜茵,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音倡蝙,去河邊找鬼九串。 笑死,一個胖子當(dāng)著我的面吹牛寺鸥,可吹牛的內(nèi)容都是我干的猪钮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胆建,長吁一口氣:“原來是場噩夢啊……” “哼躬贡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眼坏,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拂玻,失蹤者是張志新(化名)和其女友劉穎酸些,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檐蚜,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡魄懂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闯第。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片市栗。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡秕重,死狀恐怖岭辣,靈堂內(nèi)的尸體忽然破棺而出砂竖,到底是詐尸還是另有隱情坠韩,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布笋熬,位于F島的核電站术吝,受9級特大地震影響弄痹,放射性物質(zhì)發(fā)生泄漏勾效。R本人自食惡果不足惜嘹悼,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望层宫。 院中可真熱鬧杨伙,春花似錦、人聲如沸萌腿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毁菱。三九已至米死,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鼎俘,已是汗流浹背哲身。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工辩涝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贸伐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓怔揩,卻偏偏與公主長得像捉邢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子商膊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355