韌館-LearnHouse

[轉]Android的開機流程及對應的程式碼位置

資料來源:https://www.cnblogs.com/l2rf/p/6605987.html

1.系統引導bootloader
1)源碼:bootable/bootloader/*
2)說明:加電後,CPU將先執行bootloader程序,此處有三種選擇
a)開機按Camera+Power啟動到fastboot,即命令或SD卡燒寫模式,不加載內核及文件系統,此處可以進行工廠模式的燒寫
b)開機按Home+Power啟動到recovery模式,加載recovery.img,recovery.img包含內核,基本的文件系統,用於工程模式的燒寫
c)開機按Power,正常啟動系統,加載boot.img,boot.img包含內核,基本文件系統,用於正常啟動手機(以下只分析正常啟動的情況)


2.內核kernel
1)源碼:kernel/*
2)說明:kernel由bootloader加載

3.文件系統及應用init
1)源碼:system/core/init/*
2)配置文件:system/rootdir/init.rc,
3)說明:init是一個由內核啟動的用戶級進程,它按照init.rc中的設置執行:啟動服務(這裡的服務指Linux底層服務,如adbd提供adb支持,vold提供SD卡掛載等),執行命令和按其中的配置語句執行相應功能

4.重要的後台程序zygote
1)源碼:frameworks/base/cmds/app_process/app_main.cpp等
2)說明:zygote是一個在init.rc中被指定啟動的服務,該服務對應的命令是/system/bin/app_process
a)建立Java Runtime,建立虛擬機
b)建立Socket接收ActivityManangerService的請求,用於Fork應用程序
c)啟動System Server

5.系統服務system server
1)源碼:frameworks/base/services/Java/com/Android/server/SystemServer.java
2)說明:被zygote啟動,通過System Manager管理android的服務(這裡的服務指frameworks/base/services下的服務,如衛星定位服務,剪切板服務等)

Android 5.1中SystemServer.java的代碼中的startOtherServices方法有相關變量開關決定是否啟動服務

boolean disableStorage = SystemProperties.getBoolean("config.disable_storage", false);
boolean disableMedia = SystemProperties.getBoolean("config.disable_media", false);
boolean disableBluetooth = SystemProperties.getBoolean("config.disable_bluetooth", false);
boolean disableTelephony = SystemProperties.getBoolean("config.disable_telephony", false);
boolean disableLocation = SystemProperties.getBoolean("config.disable_location", false);
boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);
boolean disableNonCoreServices = SystemProperties.getBoolean("config.disable_noncore", false);
boolean disableNetwork = SystemProperties.getBoolean("config.disable_network", false);
boolean disableNetworkTime = SystemProperties.getBoolean("config.disable_networktime", false);
boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");

 

6.桌面launcher
1)源碼:ActivityManagerService.java為入口,packages/apps/launcher*實現
2)說明:系統啟動成功後SystemServer使用xxx.systemReady()通知各個服務,系統已經就緒,桌面程序Home就是在ActivityManagerService.systemReady()通知的過程中建立的,最終調用startHomeActivityLocked()啟launcher

7.解鎖
1)源碼:frameworks/base/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
2)說明:系統啟動成功後SystemServer調用wm.systemReady()通知WindowManagerService,進而調用PhoneWindowManager的systemReady()

在Android5.1中,keyguard本身不再是一個獨立的apk,而是跟SystemUI進行了合併,作為SystemUI的靜態庫進行調用。所以,系統調試鎖屏,只需要單獨編譯SystemUI模塊,然後替換SystemUI.apk即可。

參考:http://blog.csdn.net/wzy_1988/article/details/49659935

8.開機自啟動的第三方應用程序
1)源碼:

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

2)說明:系統啟動成功後SystemServer調用ActivityManagerNative.getDefault().systemReady()通知ActivityManager啟動成功,ActivityManager會通過置變量mBooting,通知它的另一線程,該線程會發送廣播android.intent.action.BOOT_COMPLETED以告知已註冊的第三方程序在開機時自動啟動。

Android5.1中的finishBooting方法設置“sys.boot_completed”系統屬性為“1”,並且發送android.intent.action.BOOT_COMPLETED廣播

final void finishBooting() {
       ....
       ....
       ....
       ....

       
                SystemProperties.set("sys.boot_completed", "1");

                // And trigger dev.bootcomplete if we are not showing encryption progress
                if (!"trigger_restart_min_framework".equals(SystemProperties.get("vold.decrypt"))
                    || "".equals(SystemProperties.get("vold.encrypt_progress"))) {
                    SystemProperties.set("dev.bootcomplete", "1");
                }
                for (int i=0; i<mStartedUsers.size(); i++) {
                    UserStartedState uss = mStartedUsers.valueAt(i);
                    if (uss.mState == UserStartedState.STATE_BOOTING) {
                        uss.mState = UserStartedState.STATE_RUNNING;
                        final int userId = mStartedUsers.keyAt(i);
                        Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
                        intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
                        intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
                        broadcastIntentLocked(null, null, intent, null,
                                new IIntentReceiver.Stub() {
                                    @Override
                                    public void performReceive(Intent intent, int resultCode,
                                            String data, Bundle extras, boolean ordered,
                                            boolean sticky, int sendingUser) {
                                        synchronized (ActivityManagerService.this) {
                                            requestPssAllProcsLocked(SystemClock.uptimeMillis(),
                                                    true, false);
                                        }
                                    }
                                },
                                0, null, null,
                                android.Manifest.permission.RECEIVE_BOOT_COMPLETED,
                                AppOpsManager.OP_BOOT_COMPLETED, true, false,
                                MY_PID, Process.SYSTEM_UID, userId);
                    }
       ....
       ....
       ....
       ....
                
                
            }
        }
    }

 

9.總結
綜上所述,系統層次關於啟動最核心的部分是zygote(即app_process)和system server,zygote它負責最基本的虛擬機的建立,以支持各個應用程序的啟動,而system server用於管理android後台服務,啟動步驟及順序。

10. 參考

http://blog.csdn.net/basonjiang_sz/category/648399.aspx

 

 

2019年2 月 posted by admin in 程式&軟體 and have No Comments

Place your comment

Please fill your data and comment below.
名稱:
信箱:
網站:
您的評論: