<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### **概述** Android系統里面的應用程序進程有一個特點,那就是它們是被系統托管的。也就是說,系統根據需要來創建進程以及回收進程。進程創建發生在組件啟動時,它們是由Zygote進程負責創建。Zygote進程是由系統中的第一個進程init負責啟動。此外,用來運行各種系統服務的System Server進程也是由Zygote進程創建的。進程回收發生在內存緊張時,由Low Memory Killer執行。此外,組件管理服務ActivityManagerService和窗口管理服務WindowManagerService也會在適當的時候主動進行進程回收。每一個應用程序進程根據運行情況被賦予優先級,當需要回收進程的時候,就按照優先級從低到高的順序進行回收。 主要講Android應用程序進程的啟動和回收,主要涉及到Zygote進程、System Server進程,以及組件管理服務ActivityManagerService、窗口服務WindowManagerService,還有專用驅動Low Memory Killer。通過了解Android系統對應用程序進程的管理,我們就能更清楚應用程序的運行機制。 * Android系統啟動概述 * Zygote進程啟動過程分析 * System Server進程啟動過程分析 * Android應用程序進程啟動過程分析 * Android應用程序進程回收機制 #### **Android系統啟動概述** ![](https://box.kancloud.cn/645e9c852b0f6a8589b988fa74d363a4_654x574.jpg) #### **Zygote進程啟動過程分析** **Zygote進程由Init進程啟動** ![](https://box.kancloud.cn/09c3c00db3db5d603e73be7b9c703a54_645x142.png) * 加載文件:/system/app_process * --start-system-server:啟動System Server進程 * 創建名稱為zygote的socket:用來和ActivityManagerService通信 **app_process** ![](https://box.kancloud.cn/8d48058d23772392e460f8030809b43e_519x304.png) **AndroidRuntime::start** ![](https://box.kancloud.cn/6ee694ef0f6eddd177a6ea921f94ff19_599x511.png) **啟動Dalvik虛擬機** * 創建一個Dalvik虛擬機實例 * 加載Java核心類及其JNI方法 * 初始化主線程的JNI環境 **加載部分Android核心類及其JNI方法** * android.os.* * android.graphics.* * android.opengl.* * android.hardware.* * android.media.* * …… **ZygoteInit.main** ![](https://box.kancloud.cn/ec79009573d4dad2ee87a99bbbc074f2_455x433.png) **Preload Classes** * 參考frameworks/base/preloaded-classes文件 * android.accounts.* * android.app.* * android.view.* * …… ![](https://box.kancloud.cn/0546d509c4350bafba5af7450d44ce73_645x358.png) **Preload Drawables** * 參考frameworks/base/core/res/res/values$/arrays.xml文件 * @drawable/toast_frame_holo * @drawable/btn_check_on_pressed_holo_light * @drawable/btn_check_on_pressed_holo_dark * …… ![](https://box.kancloud.cn/ccc4077543342863d109796d135de604_644x362.png) **Preload Color State List** * 參考frameworks/base/core/res/res/values$/arrays.xml文件 * @color/primary_text_dark * @color/primary_text_dark_disable_only * @color/primary_text_dark_nodisable * …… ![](https://box.kancloud.cn/07dbe665b359697928bee34030265864_644x351.png) **runSelectLoopMode** ![](https://box.kancloud.cn/57777c0cba975060a3c84b2aeef345e5_556x561.png) **Zygote進程啟動完成后的地址空間** ![](https://box.kancloud.cn/80e15f559f49997ed9ae57eff6dace18_591x447.png) #### **System Server進程啟動過程分析** **Zygote在啟動的過程中創建System Server進程** ![](https://box.kancloud.cn/41fe6a64c19d5dec909ddd237b73ee1d_455x433.png) **startSystemServer** ![](https://box.kancloud.cn/b2bfa15b915443cd2720296023330750_753x564.png) **備注** 用戶組ID定義參考system/core/include/private/android_filesystem_config.h Capability權限定義參考kernel/goldfish/include/linux/capability.h **handleSystemServerProcess** ![](https://box.kancloud.cn/4a2a8bf4306efb417f7370bb74bc88f8_884x431.png) **RuntimeInit.zygoteInit** ![](https://box.kancloud.cn/0df5b6e1c59f6bdf3b6baab6baf9c590_695x185.png) **nativeZygoteInit--啟動Binder線程池** ![](https://box.kancloud.cn/76b1a1d777c548e15310ef7a17bbff36_841x70.png) ![](https://box.kancloud.cn/f271357457d502cd24efb9e5435eb924_512x242.png) **applicationInit—調用SystemServer.main** ![](https://box.kancloud.cn/7c820776e1f920ebc3890235c7190541_703x358.png) **SystemServer.main** ![](https://box.kancloud.cn/50a258cfc64516c90c30668b859210a3_452x190.png) **Init1—啟動C/C++ Rutime Framework Service** ![](https://box.kancloud.cn/5584d00313d6410a1787d005df26cc72_556x564.png) **Init2—啟動Java Runtime Framework Service** ![](https://box.kancloud.cn/40f79adb2fcad60ae59887192011c571_490x198.png) **ServerThread.run** ![](https://box.kancloud.cn/c94e0ec28b620f8f99264e0303092959_614x533.png) **System Server進程啟動完成后的地址空間** ![](https://box.kancloud.cn/3508c7c8e1fe9fb500b6d2e1d5d949f2_675x465.png) #### **Android應用程序進程啟動過程分析** **ActivityManagerService.startProcessLocked** ![](https://box.kancloud.cn/a92b45a7de116e86a1e1799f0f44a9a8_695x556.png) **Process.start** ![](https://box.kancloud.cn/66e4361b6275323d946789054fe9f383_690x338.png) **Process.startViaZygote** ![](https://box.kancloud.cn/b4bf6ed73eb846dd10a07ec89d3691e7_652x558.png) **Process.zygoteSendArgsAndGetResult** ![](https://box.kancloud.cn/97d2c2b39ed1bf96db82fc7b684f70ac_629x527.png) **ZygoteConnection.runOnce** ![](https://box.kancloud.cn/1bc4a18848ad3401cfa82e9c58c1e67f_682x559.png) **ZygoteConnection.handleChildProc** ![](https://box.kancloud.cn/1b2c78950a039f17dddb6618f17d530a_794x309.png) **RuntimeInit.zygoteInit** * nativeZygoteInit * applicationInit * Invoke main of ActivityThread **ActivityThread.main** ![](https://box.kancloud.cn/754b52ab968f4ebb332f41d3b9889497_684x273.png) #### **Android應用程序進程回收機制** **Linux的內存回收機制--Out of Memory Killer** * 每一個進程都有一個oom_adj值,取值范圍[-17,15],可以通過`/proc/<pid>/oom_a`dj訪問 * 每一個進程的oom_adj初始值都等于其父進程的oom_adj值 * oom_adj值越小,越不容易被殺死,其中,-17表示不會被殺死 * 內存緊張時,OOM Killer綜合進程的內存消耗量、CPU時間、存活時間和oom_adj值來決定是否要殺死一個進程來回收內存 **備注**: oom_adj值定義可以參考kernel/goldfish/include/linux/oom.h **Android的內存回收機制—Low Memory Killer** * 進程的oom_adj值由ActivityManagerService根據運行在進程里面的組件的狀態來計算 * 進程的oom_adj值取值范圍為[-16,15], oom_adj值越小,就不容易被殺死 * 內存緊張時, LMK基于oom_adj值來決定是否要回收一個進程 * ActivityManagerService和WindowManagerService在特定情況下也會進行進程回收 **LMK的進程回收策略** * 當系統內存小于i時,在oom_adj值大于等于j的進程中,選擇一個oom_adj值最大并且消耗內存最多的進程來回收 ![](https://box.kancloud.cn/2d71992bf1b34112c5419c2c4b8326ca_685x366.png) * 應用程序進程的oom_adj值 * SYSTEM_ADJ(-16):System Server進程 * PERSISTENT_PROC_ADJ(-12):android:persistent屬性為true的系統App進程,如PhoneApp * FOREGROUND_APP_ADJ(0):包含前臺Activity的進程 * VISIBLE_APP_ADJ(1):包含可見Activity的進程 * PERCEPTIBLE_APP_ADJ(2):包含狀態為Pausing、Paused、Stopping的Activity的進程,以及運行有Foreground Service的進程 * HEAVY_WEIGHT_APP_ADJ(3):重量級進程, android: cantSaveState屬性為true的進程,目前還不開放 * BACKUP_APP_ADJ(4):正在執行備份操作的進程 * SERVICE_ADJ(5):最近有活動的Service進程 * HOME_APP_ADJ(6):HomeApp進程 * PREVIOUS_APP_ADJ(7):前一個App運行在的進程 * SERVICE_B_ADJ(8):SERVICE_ADJ進程數量達到一定值時,最近最不活動的Service進程 * HIDDEN_APP_MIN_ADJ(9)和HIDDEN_APP_MAX_ADJ(15):含有不可見Activity的進程,根據LRU原則賦予[9,15]中的一個值 * Init進程的oom_adj值被設置為-16,由Init進程所啟動的daemon和service進程的oom_adj值也等于-16 * 如果運行在進程A中的Content Provider或者Service被綁定到進程B,并且進程B的oom_adj值比進程A的oom_adj小,那么進程A的oom_adj值就會被設置為進程B的oom_adj值,但是不能小于FOREGROUND_APP_ADJ **注意**: android: cantSaveState保存在ApplicationInfo中,ApplicationInfo由PackageManagerService維護,應用程序不能修改 **ActivityManagerService在以下四種情況下會更新應用程序進程的oom_adj值,以及殺掉那些已經被卸載了的App所運行在的應用程序進程** * activityStopped:停止Activity * setProcessLimit:設置進程數量限制 * unregisterReceiver:注銷Broadcast Receiver * ?finishReceiver:結束Broadcast Receiver **WindowManagerService在處理窗口的過程中發生Out Of Memroy時,也會通知ActivityManagerService殺掉那些包含有窗口的應用程序進程**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看