1. 程式人生 > >android開機動畫啟動流程

android開機動畫啟動流程

android的Surface Flinger服務啟動分析知道,開機動畫是在SurfaceFlinger例項通過呼叫startBootAnim()啟動的。

下面我們就一起學習BootAnim是如何啟動和結束的,我精讀程式碼前都喜歡先描出框架圖,以此圖為基礎再去研讀會達到事半功倍的效果。好吧,直接上圖。

技術分享

核心起來後會啟動第一個程序,即init程序。

init程序會根據init.rc配置啟動surfaceflinger程序。

  1. service surfaceflinger /system/bin/surfaceflinger  
  2.     class
     main  
  3.     user system  
  4.     group graphics drmrpc  
  5.     onrestart restart zygote  

surfaceflinger程序便啟動了,跟著就會跑程序的main()函式。

frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp

  1. int main(int argc, char** argv) {  
  2. ....  
  3.     // instantiate surfaceflinger
  4.     sp<SurfaceFlinger> flinger = new
     SurfaceFlinger();//建立surfaceflinger服務例項
  5. ....  
  6.     flinger->init();  
  7.     // publish surface flinger
  8.     sp<IServiceManager> sm(defaultServiceManager());  
  9.     sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);//註冊到service manager裡
  10.     // run in this thread
  11.     flinger->run();//開跑
  12.     return 0;  
  13. }  

首先new一個SurfaceFlinger例項,然後init,然後run

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

  1. void SurfaceFlinger::init() {  
  2.     ALOGI(  "SurfaceFlinger's main thread ready to run. "
  3.             "Initializing graphics H/W...");  
  4.  .....  
  5.     // start boot animation
  6.     startBootAnim();//開始播放動畫
  7. }  

初始化graphics之後,就呼叫startBootAnim()播放開機動畫。
  1. void SurfaceFlinger::startBootAnim() {  
  2.     // start boot animation
  3.     mBootFinished = false;  
  4.     property_set("service.bootanim.exit""0");//這個會有bootanimation程序週期檢測,=1退出動畫
  5.     property_set("ctl.start""bootanim");//通過ctl.start命令啟動bootanim
  6. }  

把service.bootanim.exit屬性設為0,這個屬性bootanimation程序裡會週期檢查,=1時就退出動畫,這裡=0表示要播放動畫。

後面通過ctl.start的命令啟動bootanim程序,動畫就開始播放了。

下面來到bootanimation的實現

frameworks/base/cmds/bootanimation/bootanimation_main.cpp

  1. int main(int argc, char** argv)  
  2. {  
  3.         sp<ProcessState> proc(ProcessState::self());  
  4.         ProcessState::self()->startThreadPool();  
  5.         // create the boot animation object
  6.         sp<BootAnimation> boot = new BootAnimation();//建立BootAnimation例項
  7.         IPCThreadState::self()->joinThreadPool();//binder執行緒池,與surfaceflinger通訊用的。
  8.     }  
  9.     return 0;  
  10. }  

new一個BootAnimation例項,然後建個binder執行緒池,因為BootAnimation在顯示動畫時要與SurfaceFlinger服務程序通訊,所以要啟個binder執行緒池。

frameworks/base/cmds/bootanimation/BootAnimation.cpp

  1. BootAnimation::BootAnimation() : Thread(false)  
  2. {  
  3.     mSession = new SurfaceComposerClient();//建立一個物件
  4. }  

建立例項時,建構函式就會被呼叫,new一個SurfaceComposerClient例項,他是用來與surfaceflinger通訊的
  1. void BootAnimation::onFirstRef() {  
  2.     status_t err = mSession->linkToComposerDeath(this);//註冊surfaceflinger死亡訊息的通知書
  3.     ALOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));  
  4.     if (err == NO_ERROR) {  
  5.         run("BootAnimation", PRIORITY_DISPLAY);//開跑
  6.     }  
  7. }  
linkTocomposerDeath的作用是當surfaceflinger死掉是,BootAnimation就會得到通知。

如下,收到通知後就退出動畫了,因為surfaceflinger都掛掉了,播放不了了。

  1. void BootAnimation::binderDied(const wp<IBinder>& who)  
  2. {  
  3.     // woah, surfaceflinger died!
  4.     ALOGD("SurfaceFlinger died, exiting...");  
  5.     // calling requestExit() is not enough here because the Surface code
  6.     // might be blocked on a condition variable that will never be updated.
  7.     kill( getpid(), SIGKILL );//收到surfaceflinger死亡的訊息,好吧自己也跟著去了。
  8.     requestExit();  
  9. }  

另一個函式run()在BootAnimation的父類Thead裡,用來建立一個執行緒並跑起來。

父類

system/core/libutils/Threads.cpp

  1. status_t Thread::run(constchar* name, int32_t priority, size_t stack)  
  2. {  
  3.     ...  
  4.     if (mCanCallJava) {  
  5.         res = createThreadEtc(_threadLoop,//建立執行緒
  6.                 this, name, priority, stack, &mThread);  
  7.     } else {  
  8.         res = androidCreateRawThreadEtc(_threadLoop,  
  9.                 this, name, priority, stack, &mThread);  
  10.     }  
  11.     ....  
  12. }  

建立_threadLoop執行緒
  1. int Thread::_threadLoop(void* user)  
  2. {  
  3. ....  
  4.     do {  
  5.         bool result;  
  6.         if (first) {  
  7.             first = false;  
  8.             self->mStatus = self->readyToRun();//這個函式被bootanimation重寫了
  9.             result = (self->mStatus == NO_ERROR);  
  10.             if (result && !self->exitPending()) {  
  11.                 ...  
  12.                 result = self->threadLoop();//這個函式被bootanimation重寫了
  13. 相關推薦

    android開機動畫啟動流程

    從android的Surface Flinger服務啟動分析知道,開機動畫是在SurfaceFlinger例項通過呼叫startBootAnim()啟動的。 下面我們就一起學習BootAnim是如何啟動和結束的,我精讀程式碼前都喜歡先描出框架圖,以此圖為基礎再去

    Android開機動畫流程

    Android系統在啟動過程中,最多可以出現三個畫面。第一個開機畫面是在核心啟動的過程中出現,是一個靜態的畫面;第二個畫面是在init程序啟動的過程中出現的,也是一個靜態的畫面;第三個畫面是在系統服務啟動的過程中出現 ,是一個動態的畫面。這三個畫面都是在一個被稱

    android 開機啟動

    end pla extend class ive rec completed 廣播 manifest 原理:Android系統在開機的時候會發出一個廣播。這樣我們就能夠接收這個廣播,然後 啟動我們的應用。廣播接收器必須在xml裏面配置,由於x

    Android 開機啟動應用

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    Android開機動畫的顯示(一)

    參考部落格 主要是跟著老羅的部落格,深入研究學習下Android的UI架構,徹底搞清楚繪製流程。鑑於老羅的部落格寫成時間有點久,分析的Andorid版本也有點低。現在從Android P的原始碼開始分析。 同樣的,從Android啟動顯示的畫面順序依次分析。

    Android開機動畫的顯示(二)

    參考部落格 接著上面Android開機動畫的顯示(一)分析,開機動畫怎麼結束的,又是如何顯示桌面(鎖屏介面)的。 一、程式碼流程 在前面的 Android開機流程 可以知道,SystemServer最後會呼叫到AMS.systemReady 1.1 AMS.

    Android WifiService的啟動流程分析

    轉於: http://blog.csdn.net/lilian0118/article/details/21964423 最近在學習Android WiFi framework的相關知識,這裡總結以下。WiFi framework的內容大致可以分為以下幾個模組: 1

    Android程式入口ActivityThread和Android應用程式啟動流程詳解

              大家初學java時候都知道java的程式入口是從main方法進入,那麼Android是基於java編寫的,那Android的程式入口做了哪些操作呢?還有Android的應用程式到底是怎樣啟動的呢?我們一起來看一下. 首先附上ActivityThread.

    Android App應用啟動流程(二)

    還回到上一篇結束的地方: void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) { // Is this

    Android 系統 Settings 啟動流程詳解

    Settings簡介   Settings 是 Android 系統自帶的一個很重要的應用,給使用者提供了操作 Android 系統功能的介面。它裡面包含了 Wireless & network,device,personal 以及 system 等幾

    Android 元件Activity啟動流程分析

    本篇相關流程分析基於Android4.4原始碼。 通常我們啟動一個Activity都是通過startActivity來完成。下面我們分析一下關鍵流程,本篇中以前應用的主執行緒ActivityThread為界限一分為二。 意圖啟動 首先我們使用上下文物件來

    android 面試Activity啟動流程

    android 面試題之Activity的啟動流程 面試中高階的時候,很多公司都會問對Activity的啟動流程瞭解嗎?這時候內心真是一萬隻草泥馬奔騰而過,都沒準備說啥啊!市場上對Activity啟動這塊分析的文章很多,但是面試過程中簡短的描述就需要很熟悉原始

    Android Hello world程式再分析【Android程式的啟動流程

       HelloWorld幾乎是每一個程式設計師學習過程中必會遇到的,所謂溫故而知新,今天我們來深入瞭解一下Android中的helloworld程式。    首先,在eclipse中新建一個Android專案:    然後在MainActivity的onCreate方法中

    Android 應用程序啟動流程

    我們知道啟動Activity時,在ActivityStackSupervisor.java中函式startSpecificActivityLocked裡面會判斷當前Activity所在application是否已經啟動,如果啟動,則直接建立Activity也即呼叫realS

    Android Activity的啟動流程原始碼解析(8.0)

    一,寫在前面        Activity是Android四大元件之一,用於直接跟使用者進行互動,本篇文章將介紹Activity的啟動流程。使用者啟動Activity的方式大致有兩種:一種是在桌面點選應用程式的圖示,進入應用程式的主介面;另一種是在應用程式中,進入一個新的

    Android 應用程序啟動流程

    閱讀的收益 討論的內容也就是一個應用程序是如何啟動的,私以為這一部分的內容頗為重要,即便不瞭解細節,也要知道其中的大體步驟。特別是針對我們應用開發者而言,理應瞭解我們的 App 是如何被啟動的,App 中的元件是如何被系統服務呼叫和組織的。 講應用程序啟動的文章不是很多,也

    Android開機動畫

        Android系統的開機動畫可分為三個部分,kernel啟動,init程序啟動,android系統服務啟動。這三個開機動畫都是在一個叫做 幀緩衝區(frame buffer)的硬體裝置上進行渲染繪製的。http://hovertree.com/menu/android/ 在Linux核心中,每一個硬

    android開機動畫包製作工具實現

    # coding=utf-8 __author__ = 'snomy' import os import shutil import Image import ImageFilter import zipfile import sys # ---------------------- 函式 -----

    android 開機啟動應用 (詳細)

    android 4.0以後 android就可以實現開機自啟動app了。下面我說一下操作原理: android可以通過 receiver 接收者來接收 android 開機廣播實現開機自動。這樣我們就有機可乘了,放一個 service 在 receiver 中,然後通過這個

    Android開機啟動程式設定及控制方法

    Android系統通過應用程式自行在系統中登記註冊事件(即Intent)來響應系統產生的各類訊息。 例如Android實現系統開機自啟動程需要在Manifest中加入如下Intent-filter及許可權Uses-permission即可。     <intent-f