日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 9.0 开机动画,Android bootanim开机动画启动流程

發布時間:2023/12/18 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 9.0 开机动画,Android bootanim开机动画启动流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. system進程在啟動過程中會調用SurfaceFlinger類的靜態成員函數instantiate來啟動SurfaceFlinger服務。啟動過程中,首先創建一個SurfaceFlinger實例,此實例會被一個SP 指針引用。當一個對象被一個智能指針第一次引用的時候,該類的onFirstRef方法將被調用:

void SurfaceFlinger::onFirstRef()

{

mEventQueue.init(this);

}

2. SurfaceFlinger類繼承自Thread類,因此當它的run方法被調用的時候,系統就會創建一個新的線程。這個線程在第一次運行之前,會調用該類的readToRun方法。并且調用mReadyToRunBarrier的wait讓主線程(init進程)處于等待狀態。readyToRun方法會進行主屏幕以及openGL庫的初始化,完成后會調用mReadyToRunBarrier的open來喚醒主線程。緊接著開始啟動動畫:

void SurfaceFlinger::startBootAnim() {

// start boot animation

property_set("service.bootanim.exit", "0");

property_set("ctl.start", "bootanim");

}

3. 當系統屬性發生改變時,init進程就會收到一個系統屬性變化的通知,這個通知最終由在init進程中的函數handle_property_set_fd來處理。由于此系統屬性是以ctrl.開頭的控制類型的屬性,因此當屬性變更時會啟動一個名字為“bootanim”的服務。通過這個名字,可以找到對應的應用程序為/system/bin/bootanimation。于是應用程序的入口函數main函數將被調用:

int main()

{

setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

char value[PROPERTY_VALUE_MAX];

property_get("debug.sf.nobootanimation", value, "0");

int noBootAnimation = atoi(value);

ALOGI_IF(noBootAnimation, "boot animation disabled");

if (!noBootAnimation) {

sp proc(ProcessState::self());

ProcessState::self()->startThreadPool();

// create the boot animation object

sp boot = new BootAnimation();

IPCThreadState::self()->joinThreadPool();

}

return 0;

}

4. 由于BootAnimation對象在顯示動畫時需要與SurfaceFlinger服務通信,因此,應用程序bootanimation就需要啟動一個binder線程池。當一個BootAnimation對象第一個被一個只能智能指針引用的時候,BootAnimation的onFirstRef方法將被調用:

void BootAnimation::onFirstRef() {

status_t err = mSession->linkToComposerDeath(this);

ALOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));

if (err == NO_ERROR) {

run("BootAnimation", PRIORITY_DISPLAY);

}

}

在init.rc中聲明的服務此時將被啟動

service bootanim /system/bin/bootanimation

class core

user graphics

group graphics audio

disabled

oneshot

5. BootAnimation類繼承自Thread類,當它的run方法被調用時,將會調用該類的readToRun方法。在/data/local/bootanimation.zip、/system/media/bootanimation.zip、/system/media/bootanimation-encrypted.zip(加密動畫)查找是否存在相應的動畫壓縮包,若存在則使用用戶自定義的動畫,否則使用android默認的開機動畫

status_t BootAnimation::readyToRun() {

mAssets.addDefaultAssets();

.......

.......

.......

if (encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0)) {

mZipFileName = SYSTEM_ENCRYPTED_BOOTANIMATION_FILE;

}

else if (access(OEM_BOOTANIMATION_FILE, R_OK) == 0) {

mZipFileName = OEM_BOOTANIMATION_FILE;

}

else if (access(USER_BOOTANIMATION_FILE, R_OK) == 0) {

mZipFileName = USER_BOOTANIMATION_FILE;

}

else if (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) {

mZipFileName = SYSTEM_BOOTANIMATION_FILE;

}

return NO_ERROR;

}

6. 當線程準備好運行時,其threadLoop方法會被調用,完整動畫zip的解析顯示。

7. 停止動畫。當系統啟動完成時,會調用SurfaceFlinger中的bootFinished方法,通過設定系統參數的方式結束動畫的播放

property_set("service.bootanim.exit", "1");

總結

以上是生活随笔為你收集整理的android 9.0 开机动画,Android bootanim开机动画启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。