android 9.0 开机动画,Android bootanim开机动画启动流程
1. system進(jìn)程在啟動過程中會調(diào)用SurfaceFlinger類的靜態(tài)成員函數(shù)instantiate來啟動SurfaceFlinger服務(wù)。啟動過程中,首先創(chuàng)建一個SurfaceFlinger實例,此實例會被一個SP 指針引用。當(dāng)一個對象被一個智能指針第一次引用的時候,該類的onFirstRef方法將被調(diào)用:
void SurfaceFlinger::onFirstRef()
{
mEventQueue.init(this);
}
2. SurfaceFlinger類繼承自Thread類,因此當(dāng)它的run方法被調(diào)用的時候,系統(tǒng)就會創(chuàng)建一個新的線程。這個線程在第一次運(yùn)行之前,會調(diào)用該類的readToRun方法。并且調(diào)用mReadyToRunBarrier的wait讓主線程(init進(jìn)程)處于等待狀態(tài)。readyToRun方法會進(jìn)行主屏幕以及openGL庫的初始化,完成后會調(diào)用mReadyToRunBarrier的open來喚醒主線程。緊接著開始啟動動畫:
void SurfaceFlinger::startBootAnim() {
// start boot animation
property_set("service.bootanim.exit", "0");
property_set("ctl.start", "bootanim");
}
3. 當(dāng)系統(tǒng)屬性發(fā)生改變時,init進(jìn)程就會收到一個系統(tǒng)屬性變化的通知,這個通知最終由在init進(jìn)程中的函數(shù)handle_property_set_fd來處理。由于此系統(tǒng)屬性是以ctrl.開頭的控制類型的屬性,因此當(dāng)屬性變更時會啟動一個名字為“bootanim”的服務(wù)。通過這個名字,可以找到對應(yīng)的應(yīng)用程序為/system/bin/bootanimation。于是應(yīng)用程序的入口函數(shù)main函數(shù)將被調(diào)用:
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服務(wù)通信,因此,應(yīng)用程序bootanimation就需要啟動一個binder線程池。當(dāng)一個BootAnimation對象第一個被一個只能智能指針引用的時候,BootAnimation的onFirstRef方法將被調(diào)用:
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中聲明的服務(wù)此時將被啟動
service bootanim /system/bin/bootanimation
class core
user graphics
group graphics audio
disabled
oneshot
5. BootAnimation類繼承自Thread類,當(dāng)它的run方法被調(diào)用時,將會調(diào)用該類的readToRun方法。在/data/local/bootanimation.zip、/system/media/bootanimation.zip、/system/media/bootanimation-encrypted.zip(加密動畫)查找是否存在相應(yīng)的動畫壓縮包,若存在則使用用戶自定義的動畫,否則使用android默認(rèn)的開機(jī)動畫
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. 當(dāng)線程準(zhǔn)備好運(yùn)行時,其threadLoop方法會被調(diào)用,完整動畫zip的解析顯示。
7. 停止動畫。當(dāng)系統(tǒng)啟動完成時,會調(diào)用SurfaceFlinger中的bootFinished方法,通過設(shè)定系統(tǒng)參數(shù)的方式結(jié)束動畫的播放
property_set("service.bootanim.exit", "1");
總結(jié)
以上是生活随笔為你收集整理的android 9.0 开机动画,Android bootanim开机动画启动流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打开网页字体变大
- 下一篇: 微博上看到的,小白兔系列