android開機動畫啟動流程
從android的Surface Flinger服務啟動分析知道,開機動畫是在SurfaceFlinger例項通過呼叫startBootAnim()啟動的。
下面我們就一起學習BootAnim是如何啟動和結束的,我精讀程式碼前都喜歡先描出框架圖,以此圖為基礎再去研讀會達到事半功倍的效果。好吧,直接上圖。
核心起來後會啟動第一個程序,即init程序。
init程序會根據init.rc配置啟動surfaceflinger程序。
- service surfaceflinger /system/bin/surfaceflinger
-
class
- user system
- group graphics drmrpc
- onrestart restart zygote
surfaceflinger程序便啟動了,跟著就會跑程序的main()函式。
frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp
- int main(int argc, char** argv) {
- ....
- // instantiate surfaceflinger
-
sp<SurfaceFlinger> flinger = new
- ....
- flinger->init();
- // publish surface flinger
- sp<IServiceManager> sm(defaultServiceManager());
- sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);//註冊到service manager裡
- // run in this thread
-
flinger->run();//開跑
- return 0;
- }
首先new一個SurfaceFlinger例項,然後init,然後run
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
- void SurfaceFlinger::init() {
- ALOGI( "SurfaceFlinger's main thread ready to run. "
- "Initializing graphics H/W...");
- .....
- // start boot animation
- startBootAnim();//開始播放動畫
- }
初始化graphics之後,就呼叫startBootAnim()播放開機動畫。
- void SurfaceFlinger::startBootAnim() {
- // start boot animation
- mBootFinished = false;
- property_set("service.bootanim.exit", "0");//這個會有bootanimation程序週期檢測,=1退出動畫
- property_set("ctl.start", "bootanim");//通過ctl.start命令啟動bootanim
- }
把service.bootanim.exit屬性設為0,這個屬性bootanimation程序裡會週期檢查,=1時就退出動畫,這裡=0表示要播放動畫。
後面通過ctl.start的命令啟動bootanim程序,動畫就開始播放了。
下面來到bootanimation的實現
frameworks/base/cmds/bootanimation/bootanimation_main.cpp
- int main(int argc, char** argv)
- {
- sp<ProcessState> proc(ProcessState::self());
- ProcessState::self()->startThreadPool();
- // create the boot animation object
- sp<BootAnimation> boot = new BootAnimation();//建立BootAnimation例項
- IPCThreadState::self()->joinThreadPool();//binder執行緒池,與surfaceflinger通訊用的。
- }
- return 0;
- }
new一個BootAnimation例項,然後建個binder執行緒池,因為BootAnimation在顯示動畫時要與SurfaceFlinger服務程序通訊,所以要啟個binder執行緒池。
frameworks/base/cmds/bootanimation/BootAnimation.cpp
- BootAnimation::BootAnimation() : Thread(false)
- {
- mSession = new SurfaceComposerClient();//建立一個物件
- }
建立例項時,建構函式就會被呼叫,new一個SurfaceComposerClient例項,他是用來與surfaceflinger通訊的
- void BootAnimation::onFirstRef() {
- status_t err = mSession->linkToComposerDeath(this);//註冊surfaceflinger死亡訊息的通知書
- ALOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));
- if (err == NO_ERROR) {
- run("BootAnimation", PRIORITY_DISPLAY);//開跑
- }
- }
如下,收到通知後就退出動畫了,因為surfaceflinger都掛掉了,播放不了了。
- void BootAnimation::binderDied(const wp<IBinder>& who)
- {
- // woah, surfaceflinger died!
- ALOGD("SurfaceFlinger died, exiting...");
- // calling requestExit() is not enough here because the Surface code
- // might be blocked on a condition variable that will never be updated.
- kill( getpid(), SIGKILL );//收到surfaceflinger死亡的訊息,好吧自己也跟著去了。
- requestExit();
- }
另一個函式run()在BootAnimation的父類Thead裡,用來建立一個執行緒並跑起來。
父類
system/core/libutils/Threads.cpp
- status_t Thread::run(constchar* name, int32_t priority, size_t stack)
- {
- ...
- if (mCanCallJava) {
- res = createThreadEtc(_threadLoop,//建立執行緒
- this, name, priority, stack, &mThread);
- } else {
- res = androidCreateRawThreadEtc(_threadLoop,
- this, name, priority, stack, &mThread);
- }
- ....
- }
建立_threadLoop執行緒
- int Thread::_threadLoop(void* user)
- {
- ....
- do {
- bool result;
- if (first) {
- first = false;
- self->mStatus = self->readyToRun();//這個函式被bootanimation重寫了
- result = (self->mStatus == NO_ERROR);
- if (result && !self->exitPending()) {
- ...
- result = self->threadLoop();//這個函式被bootanimation重寫了
-
相關推薦
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