系統啟動, init
init程式, 啟動的第一個使用者程式,程式id 為1
init-建立 zygote程式,提供屬性服務(property service);
(1)zygote的建立
(2)property service
init的入口函式在init.cpp->main()
在這裡會解析init.rc
parser.ParseConfig("/init.rc");```
init.rc裡面會啟動zygote程式,zygote程式是Android系統其他程式的孵化程式
on zygote-start && property:ro.crypto.state=unencrypted
# A/B update verifier that marks a successful boot.
exec_start update_verifier_nonencrypted
start netd
start zygote
start zygote_secondary
property的兩個相關函式都在init:
main(){
property_init(); //初始化property,建立一塊儲存區域
property_load_boot_defaults(); //載入預設的prop
start_property_service(); //開啟property service
}
property_service.cpp
//property_init()->__system_property_area_init()
void property_init() {
if (__system_property_area_init()) { //建立一塊儲存區域
LOG(ERROR) << "Failed to initialize property area";
exit(1);
}
}
//property_load_boot_defaults
void property_load_boot_defaults() {
//載入下面的幾個prop檔案
load_properties_from_file("/default.prop", NULL);
load_properties_from_file("/odm/default.prop", NULL);
load_properties_from_file("/vendor/default.prop", NULL);
update_sys_usb_config();
}
//start_property_service()
void start_property_service() {
//建立property socket
property_set_fd = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
false, 0666, 0, 0, nullptr, sehandle);
//註冊handler
register_epoll_handler(property_set_fd, handle_property_set_fd);
}
/-------截止到上面的步驟, 是init程式啟動時開啟property service的部分--------/
後續property set通過socket進行通訊, 伺服器端和客戶端處理如下:
伺服器端處理函式
property_service.cpp
handle_property_set_fd(){
SocketConnection socket(s, cr); //建立socket連線
switch (cmd) {
case PROP_MSG_SETPROP: {
handle_property_set(socket, prop_value, prop_value, true);
break;
}
}
}
static void handle_property_set(SocketConnection& socket,
const std::string& name,
const std::string& value,
bool legacy_protocol){
uint32_t result = property_set(name, value);
}
客戶端呼叫prpperty_set:
system/core/libcutils/properties.cpp
int property_set(const char *key, const char *value) {
return __system_property_set(key, value); //呼叫設定
}
相關文章
- Android系統啟動:init程式與init語言Android
- UNIX/LINUX 系統啟動方式INITLinux
- Android系統啟動流程(一)解析init程式Android
- Linux系統 init 6 重啟不了,reboot -n 卻可以重新啟動Linuxboot
- (連載)Android 8.0 : 系統啟動流程之init程式(二)Android
- (連載)Android 8.0 : 系統啟動流程之init程式(一)Android
- Android 系統開發_啟動階段篇 — 深入鑽研 initAndroid
- 【Android】【init】解析init程式啟動過程Android
- OpenHarmony的init程式、init配置與啟動項配置
- Android 9.0 init 啟動流程Android
- Debian init 開機啟動管理
- init.cssd程式啟動失敗CSS
- Android系統啟動流程(四)Launcher啟動過程與系統啟動流程Android
- CentOS的System V init啟動指令碼CentOS指令碼
- Slackware的啟動(init)過程(轉)
- oracle 隨系統開啟,自動啟動Oracle
- 系統的啟動流程
- Linux的啟動過程及init程式Linux
- OpenHarmony系統使用gdb除錯init除錯
- 系統初始化之sys init
- 3.1.5.8 隨系統啟動自動啟動資料庫資料庫
- 《10分鐘剖析》系統啟動2——啟動zygoteGo
- Android系統啟動自動開啟mtklogAndroid
- 使用 flutter 啟動系統桌面Flutter
- mac系統如何啟動mysqlMacMySql
- Android 系統啟動流程Android
- 【android 7.1.2】系統啟動Android
- 啟動 HP-UX 系統UX
- android系統啟動之PMS啟動原始碼解析Android原始碼
- redhat as 4.0系統啟動到一半不能啟動!Redhat
- Linux Oracle 隨系統自動啟動LinuxOracle
- Android 啟動過程簡析(一)之 init 程式Android
- 修改yocto系統啟動logoGo
- 抖音推薦系統冷啟動
- Android 系統啟動過程Android
- AIX sshd不隨系統啟動AI
- 用grub命令列啟動系統命令列
- Linux系統啟動流程圖Linux流程圖