Android bootanimation播放mp4的可行性分析

Android的bootanimation用于控制顯示開(kāi)機(jī)的啟動(dòng)動(dòng)畫(huà)较锡,但是由于Android源碼里只支持一幀一幀的顯示圖片盗迟,從而達(dá)到動(dòng)畫(huà)的效果, bootanimation本身并不支持播放mp4. 那對(duì)于一些對(duì)于流暢度要求很高,或者想要做一些非匙麽酷炫的動(dòng)畫(huà)效果, bootanimation怕是不行了惦积。

那如果把動(dòng)畫(huà)效果做成mp4視頻昔馋,然后在bootanimation里播放筹吐,那會(huì)不會(huì)是一種不錯(cuò)的解決方案呢?
本篇文章主要是對(duì)于bootanimation播放mp4的可行性進(jìn)行分析秘遏。

PS: 筆者已經(jīng)在7.0上試驗(yàn)成功了

轉(zhuǎn)載請(qǐng)標(biāo)注出處: http://www.reibang.com/p/d3e8f1378846

1. Android的啟動(dòng)過(guò)程

安卓的啟動(dòng)過(guò)程大致可以分為三個(gè)階段

  • bootloader
  • kernel
  • init

bootloader啟動(dòng)時(shí)會(huì)顯示一些文字
kernel啟動(dòng)時(shí)會(huì)顯示一張靜態(tài)圖片
init啟動(dòng)時(shí)會(huì)在bootanimation里顯示動(dòng)畫(huà)

老羅的Android系統(tǒng)的開(kāi)機(jī)畫(huà)面顯示過(guò)程分析對(duì)這三個(gè)階段講解得非常清楚丘薛,大家可以去拜讀一下。

2. bootanimation是什么

bootanimation是一個(gè)可執(zhí)行進(jìn)程垄提,位于 /system/bin下
bootanimation的代碼位置: frameworks/base/cmds/bootanimation

在Android 7.0, bootanimation.rc并不是直接放到了init.rc里面榔袋,它放在/etc/init/下,作為一個(gè)單獨(dú)的rc配置文件存在铡俐。

那么bootanimation.rc什么時(shí)候被解析呢
在 init 進(jìn)程里, 準(zhǔn)確說(shuō)是在builtins.cpp文件里被解析的

static void import_late(const std::vector<std::string>& args, size_t start_index, size_t end_index) {
    Parser& parser = Parser::GetInstance();
    if (end_index <= start_index) {
        // Use the default set if no path is given
        //init_directories是保存xxx.rc的地方,
        static const std::vector<std::string> init_directories = {
            "/system/etc/init",
            "/vendor/etc/init",
            "/odm/etc/init"
        };

        for (const auto& dir : init_directories) {
            parser.ParseConfig(dir);
        }
    } else {
        for (size_t i = start_index; i < end_index; ++i) {
            parser.ParseConfig(args[i]);
        }
    }
}

3. bootanimation啟動(dòng)

bootanimation.rc文件定義如下

service bootanim /system/bin/bootanimation
      class core
      user graphics
      group graphics audio
      disabled
      oneshot

從定義可以看出, bootanimation被定義成了init進(jìn)程的一個(gè)service.妥粟,它屬于 core類(lèi)审丘,只能啟動(dòng)運(yùn)行一次(oneshot), 是disabled的, 意思是 class_start core時(shí),并不會(huì)啟動(dòng)它勾给。

那bootanimation是在什么時(shí)候被啟動(dòng)的呢滩报?
在 SurfaceFlinger初始化的最后

void SurfaceFlinger::init() {
    // start boot animation
    startBootAnim();
}

void SurfaceFlinger::startBootAnim() {
    // start boot animation
    property_set("service.bootanim.exit", "0");
    property_set("ctl.start", "bootanim");
}

startBootAnim設(shè)置了ctl.start=bootanim這個(gè)property, 從而會(huì)觸發(fā)init中正在監(jiān)聽(tīng)property的handle_property_set_fd函數(shù)

簡(jiǎn)化后如下

static void handle_property_set_fd()
{
    switch(msg.cmd) {
    case PROP_MSG_SETPROP:     
        if (memcmp(msg.name,"ctl.",4) == 0) {
            if (check_control_mac_perms(msg.value, source_ctx, &cr)) {
                handle_control_message((char*) msg.name + 4, (char*) msg.value);
            }
        } 
}
void handle_control_message(const std::string& msg, const std::string& name) {
    Service* svc = ServiceManager::GetInstance().FindServiceByName(name);
    //找到 bootanim 的service (由bootanim.rc定義), 然后start
    if (msg == "start") {
        svc->Start();
    } else if (msg == "stop") {
        svc->Stop();
    } else if (msg == "restart") {
        svc->Restart();
    }
}

這里先通過(guò)name也就是bootanim去查找service, 然后start這個(gè)service, 這里bootanimation就開(kāi)始運(yùn)行起來(lái)了。

bootanimation的具體代碼的執(zhí)行可以參考老羅的分析播急,在這里就不重復(fù)造輪子了脓钾。

4. bootanimation播放mp4分析

既然 bootanimation 要播放 mp4 文件,那么肯定得相關(guān)服務(wù)已經(jīng)啟動(dòng)了才行桩警,如 MediaPlayer相關(guān). 通過(guò)對(duì)init的log分析 (adb shell dmesg)可训,可以發(fā)現(xiàn) audioserver media相關(guān)的服務(wù)已經(jīng)于bootanim先啟動(dòng)起來(lái),這樣就可以得到 Mediaplayer在bootanim里能正常的播放多媒體文件捶枢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末握截,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烂叔,更是在濱河造成了極大的恐慌谨胞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒜鸡,死亡現(xiàn)場(chǎng)離奇詭異胯努,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)逢防,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)叶沛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胞四,你說(shuō)我怎么就攤上這事恬汁。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵氓侧,是天一觀的道長(zhǎng)脊另。 經(jīng)常有香客問(wèn)我,道長(zhǎng)约巷,這世上最難降的妖魔是什么偎痛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮独郎,結(jié)果婚禮上踩麦,老公的妹妹穿的比我還像新娘。我一直安慰自己氓癌,他們只是感情好谓谦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贪婉,像睡著了一般反粥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疲迂,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天才顿,我揣著相機(jī)與錄音,去河邊找鬼尤蒿。 笑死郑气,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腰池。 我是一名探鬼主播尾组,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼巩螃!你這毒婦竟也來(lái)了演怎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤避乏,失蹤者是張志新(化名)和其女友劉穎爷耀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拍皮,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歹叮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铆帽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咆耿。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖爹橱,靈堂內(nèi)的尸體忽然破棺而出萨螺,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布慰技,位于F島的核電站椭盏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吻商。R本人自食惡果不足惜掏颊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艾帐。 院中可真熱鬧乌叶,春花似錦、人聲如沸柒爸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揍鸟。三九已至兄裂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阳藻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工谈撒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腥泥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓啃匿,卻偏偏與公主長(zhǎng)得像蛔外,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溯乒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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