色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Android Zygote啟動流程

哆啦安全 ? 來源:程序員Android ? 2023-07-10 14:27 ? 次閱讀

Android系統包含netd、servicemanager、surfaceflinger、zygote、media、installd、bootanimation等基本服務,具體作用請看下圖。

ae4569de-1d25-11ee-962d-dac502259ad0.jpg

Android 系統基本服務

二、虛擬機創建和第一個Java 程序引導

為了讓APK在不同的虛擬機都可以運行,Google采取了適配器模式,在讓虛擬機運行之前先執行dexopt,即將dex文件優化成odex文件,可以讓虛擬機更加優化的執行。

在ART虛擬機中,dexopt將dex文件優化成二進制格式的問題,從而可以讓ART虛擬機執行。dexopt會調用dex2oat進行優化,dex2oat的任務是將原來的dex文件進行預翻譯,從而可以加快app運行的時間,但是由于某些app比較復雜,所以優化的時間就比較長。
優化是以dex文件中的Method方法為單位,dex2oat在優化時候,會根據需求優化一定量的Method,即不是所有的Method都回翻譯成oat模式。

ae636254-1d25-11ee-962d-dac502259ad0.jpg

虛擬機創建和第一個Java 程序引導

三、Dalvik 虛擬機基本配置

在Android系統中,Dalvik虛擬機 和ART、應用程序進程,以及運行系統的關鍵服務SystemServer進程都是由Zygote進程創建孵化的。

1.Dalvik 虛擬機基本配置

ae7a69c2-1d25-11ee-962d-dac502259ad0.jpg

Dalvik 虛擬機基本配置

四、Zygote 啟動流程

1.Zygote 啟動代碼

Zygote服務時通過init.rc進程啟動的,Zygote的classname為main.
init.rc文件配置代碼如下:

... ... 
on nonencrypted
    class_start main
    class_start late_start

on property:sys.init_log_level=*
    loglevel ${sys.init_log_level}

... ...

詳細可以參考init.rc啟動分析。
Android init 啟動流程

2.Zygote main 函數

app_main.cpp是Zygote進程的main函數,frameworksasecmdsapp_processapp_main.cpp

Zygote是由init.rc腳本啟動,在init腳本中,我們可以看到會導入import /init.${ro.zygote}.rc腳本

# Copyright (C) 2012 The Android Open Source Project
#
# IMPORTANT: Do not create world writable files or directories.
# This is a common source of Android security bugs.
#

import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /init.usb.configfs.rc
... ...
import /init.${ro.zygote}.rc

... ...

在system/core/rootdir目錄下,會根據ro.zygote屬性值不同,啟動不同的腳本,主要包含以下四個zygote腳本。

1.init.zygote32.rc 支持32為系統

2.init.zygote32_64.rc

3.init.zygote64.rc

4.init.zygote64_32.rc

ae9918b8-1d25-11ee-962d-dac502259ad0.jpg

init.zygte.rc腳本

aeb63e3e-1d25-11ee-962d-dac502259ad0.jpg

Zygote 啟動流程

五、Zygote 啟動分析

aeda2010-1d25-11ee-962d-dac502259ad0.jpg

Zygote 啟動分析

六、Zygote 創建system_server主要方法

af0f1dba-1d25-11ee-962d-dac502259ad0.jpg

Zygote 創建system_server主要方法

七、Zygote 創建System_server 分析

af25fce2-1d25-11ee-962d-dac502259ad0.jpg

Zygote 創建System_server

八、Zygote 創建應用

af37ce72-1d25-11ee-962d-dac502259ad0.jpg

Zygote 創建應用

九、Zygote 創建應用流程

af625b56-1d25-11ee-962d-dac502259ad0.jpg

Zygote 創建應用流程

十、Zygote 預加載資源

af7fd0dc-1d25-11ee-962d-dac502259ad0.jpg

Zygote 預加載資源

afa5b4f0-1d25-11ee-962d-dac502259ad0.jpg

preloadClasses()

afbb346a-1d25-11ee-962d-dac502259ad0.jpg

preloadResources()

十一、Zygote 預加載的目的

afd7eb14-1d25-11ee-962d-dac502259ad0.jpg

Zygote 預加載的目的

十二、優化Zygote 啟動方法:線程池

1.Zygote 啟動優化

1:加載類和資源是可重入操作,所以在并行模式下,不存在互斥的場景

2:Android提供了Executors和ExecutorService多線程類,因此可以使用多線程來加載類和資源。

3:硬件平臺最好是多核,否則加速也不明顯;

aff8972e-1d25-11ee-962d-dac502259ad0.jpg

線程池 優化Zygote 啟動

2.Zygote 啟動優化實質

使我們的進程最大限度的搶占CPU

十三、fork SystemServer

經過一系列初始化后,在ZygoteInit類中forkSystemServer,為啟動SystemServer做準備。ZygoteInit.java代碼路徑如下:alpsframeworksasecorejavacomandroidinternalosygoteInit.java

    /**
     * Prepare the arguments and forks for the system server process.
     *
     * Returns an {@code Runnable} that provides an entrypoint into system_server code in the
     * child process, and {@code null} in the parent.
     */
    private static Runnable forkSystemServer(String abiList, String socketName,
            ZygoteServer zygoteServer) {
        long capabilities = posixCapabilitiesAsBits(
            OsConstants.CAP_IPC_LOCK,
            OsConstants.CAP_KILL,
            OsConstants.CAP_NET_ADMIN,
            OsConstants.CAP_NET_BIND_SERVICE,
            OsConstants.CAP_NET_BROADCAST,
            OsConstants.CAP_NET_RAW,
            OsConstants.CAP_SYS_MODULE,
            OsConstants.CAP_SYS_NICE,
            OsConstants.CAP_SYS_PTRACE,
            OsConstants.CAP_SYS_TIME,
            OsConstants.CAP_SYS_TTY_CONFIG,
            OsConstants.CAP_WAKE_ALARM,
            OsConstants.CAP_BLOCK_SUSPEND
        );
        /* Containers run without some capabilities, so drop any caps that are not available. */
        StructCapUserHeader header = new StructCapUserHeader(
                OsConstants._LINUX_CAPABILITY_VERSION_3, 0);
        StructCapUserData[] data;
        try {
            data = Os.capget(header);
        } catch (ErrnoException ex) {
            throw new RuntimeException("Failed to capget()", ex);
        }
        capabilities &= ((long) data[0].effective) | (((long) data[1].effective) << 32);

        /* Hardcoded command line to start the system server */
        String args[] = {
            "--setuid=1000",
            "--setgid=1000",
            /// M: [Wi-Fi Hotspot Manager] system_server add dhcp (1014) group to access
            /// "/data/misc/dhcp/dnsmasq.leases"
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1014,1018,1021,1023," +
                        "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
            "--capabilities=" + capabilities + "," + capabilities,
            "--nice-name=system_server",
            "--runtime-args",
            "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
            "com.android.server.SystemServer",
        };
        ZygoteConnection.Arguments parsedArgs = null;

        int pid;

        try {
            parsedArgs = new ZygoteConnection.Arguments(args);
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

            boolean profileSystemServer = SystemProperties.getBoolean(
                    "dalvik.vm.profilesystemserver", false);
            if (profileSystemServer) {
                parsedArgs.runtimeFlags |= Zygote.PROFILE_SYSTEM_SERVER;
            }

            /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.runtimeFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

        /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            zygoteServer.closeServerSocket();
            return handleSystemServerProcess(parsedArgs);
        }

        return null;
    }

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3943

    瀏覽量

    127742
  • JAVA
    +關注

    關注

    19

    文章

    2974

    瀏覽量

    104973
  • 應用程序
    +關注

    關注

    38

    文章

    3292

    瀏覽量

    57846
  • 虛擬機
    +關注

    關注

    1

    文章

    931

    瀏覽量

    28359
  • ART
    ART
    +關注

    關注

    0

    文章

    26

    瀏覽量

    10495

原文標題:十三、fork SystemServer

文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    關于ok6410 android 自己編譯的源碼不啟動問題

    關于ok6410 android 自己編譯的源碼不啟動問題最近發現很多用戶在自己編譯android系統,啟動android過程中出現如下
    發表于 01-14 14:39

    關于ok6410 android 自己編譯的源碼不啟動問題

    關于ok6410 android 自己編譯的源碼不啟動問題最近發現很多朋友在自己編譯android系統,啟動android過程中出現如下
    發表于 01-16 10:42

    [資料分享]+Android框架揭秘

    :通過啟動程序了解android框架的概要,移植android以及如何開發適合各種機器的應用程序,分析android框架所需的基礎知識,jni(java native interfac
    發表于 09-26 09:47

    安卓底層開發學習經驗第十五期

    ``這一期我們來學習一下Android的一些基本的服務與Zygote啟動首先我們來看一下在init腳本中配置的一些服務我們的服務包括netd服務,它主要做的是網絡管理,第二個是比較
    發表于 10-13 15:44

    Android程序的執行流程分析

    《大話企業級Android應用開發實戰》這是一本能夠讓你學出幸福感并在還沒有學完時就能夠勝任Android應用軟件工程師工作的書。本書所有的內容都是基于企業內部的Android實際開發需要和問題而著。本節為
    發表于 07-11 08:02

    瘋殼Android嵌入式Linux平板開發教程4-1Linux引導過程

    /su_fHnaDyD1o.jspLinux引導過程Linux內核與Android系統linux內核有什么區別?什么是引導裝載程序?什么是Zygote?什么是init.rc?什么是系統服務?第一節Android
    發表于 02-19 14:36

    關于Android系統啟動的理解

    雖然第2章Android系統啟動看得比較暈,但還是想把一些總結性的內容做個筆記,加深自己對Android系統啟動的理解。1. init進程啟動
    發表于 07-28 07:05

    Android系統啟動流程總結

    Android系統是如何啟動的?Android系統的啟動過程是怎樣的?
    發表于 10-22 07:14

    【嵌入式開發教程1】手把手教你做平板電腦-Linux 引導過程

    會為不同的應用分配不同的內存。但如果 Android 系統為每一個應用啟動不同的 Dalvik 虛擬機實例,就會消耗大量的內存以及時間。因此,為了克服這個問題,Android 系統創造了”Zy
    發表于 05-31 15:21

    【嵌入式開發教程1】瘋殼·平板電腦-Linux 引導過程

    會為不同的應用分配不同的內存。但如果 Android 系統為每一個應用啟動不同的 Dalvik 虛擬機實例,就會消耗大量的內存以及時間。因此,為了克服這個問題,Android 系統創造了”Zy
    發表于 07-18 17:06

    【開發教程1】手把手教你做平板電腦-Linux 引導過程

    會為不同的應用分配不同的內存。但如果 Android 系統為每一個應用啟動不同的 Dalvik 虛擬機實例,就會消耗大量的內存以及時間。因此,為了克服這個問題,Android 系統創造了”Zy
    發表于 08-04 18:55

    基于ARM的Bootloader啟動流程研究

    基于ARM的Bootloader啟動流程研究
    發表于 10-30 16:22 ?10次下載
    基于ARM的Bootloader<b class='flag-5'>啟動</b><b class='flag-5'>流程</b>研究

    基于Android系統自啟動程序設計

    Android是在移動設備上執行應用程序的環境,自啟動應用程序會給用戶帶來便利。通過對Android的系統架構與啟動流程分析,結合具體編程,
    發表于 12-12 19:20 ?5次下載

    Android 9.0 Crash機制調用鏈

    Android系統啟動系列文章,已講述過上層應用都是由Zygote fork孵化而來,分為system_server系統進程和各種應用進程,在這些進程創建之初會設置未捕獲異常的處理器,當系統拋出未捕獲的異常時,最終都交給異常處
    的頭像 發表于 05-09 11:43 ?993次閱讀
    <b class='flag-5'>Android</b> 9.0 Crash機制調用鏈

    Android安全機制介紹及實踐

    Android系統運行于Linux內核之上,init進程是用戶空間啟動的第一個進程,職責主要為fork出系統關鍵進(Daemons)、servicemanager、zygote等;提供屬性服務管理系統屬性等。
    的頭像 發表于 11-14 09:35 ?1240次閱讀
    <b class='flag-5'>Android</b>安全機制介紹及實踐
    主站蜘蛛池模板: chinese东北老年tv视频 | 最懂男人心论坛 | 无敌在线视频观看免费 | 中文字幕在线不卡精品视频99 | 一个人免费观看完整视频日本 | 国产亚洲va在线电影 | 国产人成高清在线视频99 | 野花韩国视频中文播放 | 果冻传媒剧情在线观看 | 久久WWW免费人成一看片 | 日本夜爽爽一区二区三区 | 免费国产成人高清在线观看视频 | 边摸边吃奶边做下面视频 | 亚洲AV久久无码精品蜜桃 | 妖精视频在线观看高清 | 越南美女内射BBWXZ | 解开白丝老师的短裙猛烈进入 | 久久综合色视频 | 久久99热只有频精品 | 天天爽夜夜爽夜夜爽 | 久久99热狠狠色一区二区 | 厕所xxxxx| 和I儿媳妇激情 | 欧美一级情欲片在线 | 久久久大香菇 | 99免费在线 | 人人听力网mp3下载 人人舔人人爱 | 国产精品人妻无码久久久蜜桃臀 | 99国产精品白浆在线观看免费 | 亚洲精品无码葡京AV天堂 | 一个人免费完整观看日本 | 久久性色AV亚洲电影无码 | 92看看福利午夜影院 | 国产亚洲精品久久久久久国 | 国产成人精品自线拍 | 99精品电影一区二区免费看 | 国产精品日本不卡一区二区 | 伊人伊人伊人 | 久久精品国产首叶 | 国产精品点击进入在线影院高清 | 俄罗斯人与动ZOZ0 |