Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41)

文章目錄

  • Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41)
    • 1.開機動畫的啟動過程概述
    • 2.為什么設置了屬性之后就會播放?

Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41)

1.開機動畫的啟動過程概述

下面就是BootAnimation的重要部分。

開機動畫主要跟三個東西有關系

bootanimation surfaceflinger init

在這里插入圖片描述

查看下Android.bp編譯文件,cc_binary就是我們編譯出來的可執行文件

在這里插入圖片描述

最終的輸出路徑是在

在這里插入圖片描述

系統啟動的第一個進程是init,init進程會根據init.rc配置啟動surfaceflinger進程。就是下面這個.rc進程

在這里插入圖片描述

但是此時的Bootanim.rc不會啟動。是disabled。

在這里插入圖片描述

一般一個進程啟動了,都會有一個對應的main方法。

路徑frameworks/native/services/surfaceflinger

在這里插入圖片描述

int main(int, char**) {signal(SIGPIPE, SIG_IGN);hardware::configureRpcThreadpool(1 /* maxThreads */,false /* callerWillJoin */);startGraphicsAllocatorService();// When SF is launched in its own process, limit the number of// binder threads to 4.ProcessState::self()->setThreadPoolMaxThreadCount(4);// start the thread poolsp<ProcessState> ps(ProcessState::self());ps->startThreadPool();// instantiate surfaceflinger//創建對象sp<SurfaceFlinger> flinger = surfaceflinger::createSurfaceFlinger();setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);set_sched_policy(0, SP_FOREGROUND);// Put most SurfaceFlinger threads in the system-background cpuset// Keeps us from unnecessarily using big cores// Do this after the binder thread pool initif (cpusets_enabled()) set_cpuset_policy(0, SP_SYSTEM);// initialize before clients can connect//執行init方法flinger->init();// publish surface flingersp<IServiceManager> sm(defaultServiceManager());sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false,IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL | IServiceManager::DUMP_FLAG_PROTO);startDisplayService(); // dependency on SF getting registered abovestruct sched_param param = {0};param.sched_priority = 2;if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {ALOGE("Couldn't set SCHED_FIFO");}// run surface flinger in this thread//執行run方法flinger->run();return 0;
}

首先進入init方法
在這里插入圖片描述

開啟一個線程,Start()之后這個線程就運行起來了。

在這里插入圖片描述

線程run起來

在這里插入圖片描述

bootanim設置屬性,控制bootanim的一個服務要啟動起來,就是這里設置屬性之后就會起來了,就開始播放開機動畫。

property_set("service.bootanim.exit", "0");// Start BootAnimation if not startedproperty_set("ctl.start", "bootanim");

2.為什么設置了屬性之后就會播放?

/system/core/init.cpp

啟動屬性服務

在這里插入圖片描述

在這里插入圖片描述

跨進程通信CreateSocket

void StartPropertyService(Epoll* epoll) {selinux_callback cb;cb.func_audit = SelinuxAuditCallback;selinux_set_callback(SELINUX_CB_AUDIT, cb);property_set("ro.property_service.version", "2");//獲取fdproperty_set_fd = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,false, 0666, 0, 0, nullptr);if (property_set_fd == -1) {PLOG(FATAL) << "start_property_service socket creation failed";}//監聽fd句柄listen(property_set_fd, 8);if (auto result = epoll->RegisterHandler(property_set_fd, handle_property_set_fd); !result) {PLOG(FATAL) << result.error();}
}

回調方法handle_property_set_fd,然后調用下面這個方法

在這里插入圖片描述

然后進到HandleControlMessage,此時我們發現這個方法不知道是哪個頭文件引入進來的,所以得搜索一下。

遞歸搜索當前目錄以及子目錄。

grep "HandleControlMessage"  ./ -rn

在這里插入圖片描述

通過名字查找服務,也就是前面設置的屬性值bootanim

找到對應的map,根據msg獲取服務的狀態是什么樣子的,然后根據name名字去找到對應設置的服務。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

繪制圖像需要依賴surfaceflinger來繪制,所以開機動畫是在surfaceflinger之后啟動的。

init啟動。surfaceflinger進程的init執行,然后StartPropetySetThread線程的啟動,然后再通知init進程啟動開機動畫進程,然后是bootanimation的main方法執行,

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23463.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移動app測試重要性體現在哪些方面?專業app測試報告獲取

移動app測試是指對手機應用進行各種測試和評估的過程&#xff0c;以確保應用的功能、性能和用戶體驗達到要求。在現代社會中&#xff0c;移動應用已經成為人們日常生活的一部分。無論是社交娛樂、購物支付還是工作學習&#xff0c;移動應用都發揮著不可替代的作用。因此&#x…

常微分方程 (ODE) 和 隨機微分方程 (SDE)

常微分方程&#xff08;Ordinary Differential Equations, ODE&#xff09;和隨機微分方程&#xff08;Stochastic Differential Equations, SDE&#xff09;是數學中描述系統動態行為的重要工具。它們有一些相似之處&#xff0c;但在處理隨機性方面存在顯著差異。 常微分方程…

Oracle數據庫面試題-5

81. 請解釋Oracle數據庫中的自動空間重新壓縮&#xff08;Automatic Space Recompression&#xff09;的概念。 Oracle 數據庫中的自動空間重新壓縮&#xff08;Automatic Space Recompression&#xff09; 自動空間重新壓縮是 Oracle 數據庫中的另一個重要特性&#xff0c;它…

Vue響應式系統分支切換與cleanup - 清除遺留的副作用函數

文章目錄 前言分支切換與cleanup分支切換的問題依賴集合的收集cleanup的實現完整的代碼展示 前言 本篇文章代碼思路來自 Vue3.0 源碼, 部分理解來源于霍春陽 《Vue.js設計與實現》這本書的理解, 感興趣的小伙伴可以自行購買閱讀。可以非常明確的感受到作者對 Vue 的深刻理解以及…

每天寫java到期末考試(6.6)-java文件輸入輸出流實驗

1、用字節流讀寫二進制文件 要求:用DataOutputStreamFileOutputStream類將1,2,…,100,這100個數字寫入到文件 d:\out1.bin里,然后再用DatalnputStreamFilelnputStream類將d:\out1.bin的內讀出來,并輸出到屏幕上。 用DataOutputStreamFileOutputStream寫入二進制數據時,直接調…

單元測試AIR原則:提升代碼質量的秘密武器

文章目錄 引言一、AIR原則1. Automatic&#xff08;自動化&#xff09;2. Independent&#xff08;獨立性&#xff09;3. Repeatable&#xff08;可重復性&#xff09; 二、Automatic&#xff08;自動化&#xff09;三、Independent&#xff08;獨立性&#xff09;四、Repeatab…

【MySQL】sql語句之表操作(上)

序言 在上一篇的數據庫操作的內容中&#xff0c;學習了兩種屬性和常用的七種操作&#xff0c;學習是循序漸進的&#xff0c;庫的操作學完了&#xff0c;就要開始學習表的操作了&#xff0c;而表可與數據強相關&#xff0c;比如DDL&#xff0c;即數據定義語言&#xff0c;DML&am…

DVWA-XSS(Stored)

Low 觀察后端代碼&#xff0c;對輸入進行了一些過濾和轉義。trim(string,charlist) 函數用于移除字符串兩側的空白字符或其他預定義字符&#xff0c;charlist 參數可以規定從字符串中刪除哪些字符。stripslashes() 函數用于刪除反斜杠。mysqli_real_escape_string() 函數用于對…

SAAS系統架構設計剖析

多租戶數據隔離 用戶擔心數據安全性&#xff0c;也就是要做數據隔離&#xff0c;不允許 A 租戶查到 B 租戶的數據 1、軟隔離 數據在一起&#xff0c;只不過帶著租戶 id 查詢 在底層驅動 jar 上進行封裝&#xff0c;強制帶上租戶 id 比如&#xff1a;MySQL、MQ、Redis&#…

【論文精讀】DCRNN-擴散圖卷積循環神經網絡

DCRNN 模型是南加州大學的 Li 等人發表在 I C L R 2018 ICLR 2018 ICLR2018 會議上一個用于交通預測的時空預測模型,論文題目為: 《DIFFUSION CONVOLUTIONAL RECURRENT NEURAL NETWORK: DATA-DRIVEN TRAFFIC FORECASTING》,文章地址為: https://arxiv.org/abs/1707.01926。 …

vs中運行程序時,報不能運行解決方式

問題 在vs中編譯運行程序中&#xff0c;如果程序還在運行&#xff0c;編譯會報錯&#xff0c;但是在后臺又找不到對應的程序 解決方式 1、tasklist | find “進程名” 2、taskkill /PID

【實戰】kafka3.X kraft模式集群搭建

文章目錄 前言kafka2.0與3.x對比準備工作JDK安裝kafka安裝服務器增加hosts 修改Kraft協議配置文件格式化存儲目錄 啟動集群停止集群測試Kafka集群創建topic查看topic列表查看消息詳情生產消息消費消息查看消費者組查看消費者組列表 前言 相信很多同學都用過Kafka2.0吧&#xf…

二叉樹的鏡像--c++【做題記錄】

【問題描述】 給定擴展二叉樹的前序序列&#xff0c;構建二叉樹。 求這課二叉樹的鏡像&#xff0c;并輸出其前序遍歷序列。 【輸入形式】 輸入擴展二叉樹的前序序列。 【輸出形式】 輸出鏡像二叉樹的前序遍歷序列。 【樣例輸入】 ab##cd##e## 【樣例輸出】 鏡像后二叉樹的前序遍…

功能問題:如何防止接口重復請求?

大家好&#xff0c;我是大澈&#xff01; 本文約 1400 字&#xff0c;整篇閱讀約需 3 分鐘。 防止接口重復請求在軟件開發中非常重要&#xff0c;重復請求必然會導致服務器資源的浪費。 因為每次請求都需要服務器進行處理&#xff0c;如果請求是重復的&#xff0c;那么服務…

乘船過河(ship)

合肥市第33屆信息學競賽&#xff08;2016年&#xff09; 題目描述 Description 卡卡西和小朋友們要乘船過河了&#xff0c;港口有很多條船可以租到&#xff0c;并且之間沒有區別&#xff0c;每條船的出租費用也是一樣的。但是一條船最多只能乘坐兩個人&#xff0c;且乘客的總…

STM32 IIC 使用 HAL 庫操作eeprom

在STM32上通過I2C接口&#xff08;注意&#xff1a;在標準STM32庫中&#xff0c;I2C接口通常被寫為"I2C"而不是"IIC"&#xff09;與EEPROM芯片通信時&#xff0c;你需要遵循I2C通信協議&#xff0c;并使用STM32的HAL庫或標準外設庫&#xff08;如果適用&am…

tomcat配置請求的最大參數個數和請求數據大小

maxParameterCount"10000" maxPostSize"10485760" maxParameterCount&#xff1a;單個請求最大請求參數個數&#xff1b; maxPostSize&#xff1a;單個請求最大數據大小&#xff0c;1048576010M&#xff1b;

基本算法——位運算

a^b 原題鏈接&#xff1a;登錄—專業IT筆試面試備考平臺_牛客網 題目描述 運行代碼 #include<iostream> using namespace std; long long a,b,c,t1; int main() {cin>>a>>b>>c;for(;b;b/2){if(b&1)tt*a%c;aa*a%c;}cout<<t%c; } 代碼思路…

汽車軟件 OTA技術解析

汽車軟件 OTA 技術概述 在當今汽車行業中,軟件定義汽車的概念逐漸深入人心。隨著汽車智能化和網聯化的發展,汽車軟件的重要性日益凸顯。而汽車軟件 OTA(Over-the-Air)技術作為一種重要的軟件升級和維護方式,正逐漸成為汽車行業的熱點話題。 汽車軟件 OTA 技術是指通過無線…

邏輯回歸及python實現

概述 logistic回歸是一種廣義線性回歸&#xff08;generalized linear model&#xff09;&#xff0c;因此與多重線性回歸分析有很多相同之處。它們的模型形式基本上相同&#xff0c;都具有 w‘xb&#xff0c;其中w和b是待求參數&#xff0c;其區別在于他們的因變量不同&#x…