天天看點

android8.1啟動過程(八) SystemServer 下

SystemServer程序被建立後

  1.啟動Binder線程池 這樣就可以與其他程序進行通信

  2.建立SystemServiceManager,用于對系統的服務進行建立、啟動和聲明周期管理

  3.啟動各種系統服務

上一篇文章說到調用到了"com.android.server.SystemServer"的main方法    frameworks/base/services/java/com/android/server/SystemServer.java

public static void main(String[] args) {
   new SystemServer().run();
}
           

run()   frameworks/base/services/java/com/android/server/SystemServer.java

接下來分析run方法中的代碼   

// The system server should never make non-oneway calls
Binder.setWarnOnBlocking(true);
           

這句話主要是用來設定  Binder調用時候 設定oneway  如果在系統程序發生阻塞那麼發出警告如果在此程序中生成任何阻塞綁定器事務,則發出警告。這通常隻對系統程序有用,以阻止調用外部不受信任代碼。

 run()   frameworks/base/services/java/com/android/server/SystemServer.java 

Looper.prepareMainLooper();
           

這裡4兩個連結

https://blog.csdn.net/u014292433/article/details/22445293?spm=1001.2014.3001.5501

https://blog.csdn.net/u014292433/article/details/22480983?spm=1001.2014.3001.5501

 run()   frameworks/base/services/java/com/android/server/SystemServer.java 

System.loadLibrary("android_servers");
           

加載so庫  查找一下看看代碼在哪

[email protected]:~/godv/AOSP/android-8.1.0_r1/frameworks$ grep "android_servers" ./ -rn 
./base/services/Android.mk:68:LOCAL_MODULE:= libandroid_servers
./base/services/java/com/android/server/SystemServer.java:367:            System.loadLibrary("android_servers");
           

Android.mk     AOSP/frameworks/base/services/Android.mk  

# native library
# =============================================================

include $(CLEAR_VARS)

LOCAL_SRC_FILES :=
LOCAL_SHARED_LIBRARIES :=

# include all the jni subdirs to collect their sources
include $(wildcard $(LOCAL_PATH)/*/jni/Android.mk)

LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES -DGL_GLEXT_PROTOTYPES

LOCAL_MODULE:= libandroid_servers

include $(BUILD_SHARED_LIBRARY)
           

就是包含在這個路徑下的 所有子產品中帶有jni的mk都包含進來了

 run()   frameworks/base/services/java/com/android/server/SystemServer.java   

 建立系統上下文

// Initialize the system context.
createSystemContext();
           

建立SystemServiceManager  會對系統服務進行建立、啟動、和生命周期管理 

run()     frameworks/base/services/java/com/android/server/SystemServer.java

// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
           

run()     frameworks/base/services/java/com/android/server/SystemServer.java

把剛建立的 SystemServiceManager存到LocalServices中

LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
           

run()     frameworks/base/services/java/com/android/server/SystemServer.java

啟動引導服務  在這個方法中利用 建立的SystemServiceManager啟動了ActivityManagerService、PowerManagerService、PackageManagerService等服務

startBootstrapServices();
           

1.啟動系統服務使用 mSystemServiceManager.startService  來啟動

這裡以啟動ActivityManagerService為例  

// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
           

 調用了startService其中在注釋環節已經提示這個類必須是SystemService的子類

  對傳遞進來的class進行執行個體化并且調用startService方法

startService()    frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

   被啟動的service(例如ActivityManagerService)  需要使用自身内部一個繼承自SystemService的内部類(以下簡稱内部類)

   利用SystemServiceManager(上文初始化過)對象 調用startService方法傳遞進去Class對象

   此時這個對象(内部類)被存放在SystemServiceManager的mServices成員變量中  這個變量為一個ArrayList

// Services that should receive lifecycle events.
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
           
/**
     * Creates and starts a system service. The class must be a subclass of
     * {@link com.android.server.SystemService}.
     * ...
     */
    @SuppressWarnings("unchecked")
    public <T extends SystemService> T startService(Class<T> serviceClass) {
            ...
            try {
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
            } catch (InstantiationException ex) {
            ...

            startService(service);
            return service;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }
           
public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);
        // Start it.
        long time = SystemClock.elapsedRealtime();
        try {
            service.onStart();
        } catch (RuntimeException ex) {
        ...
    }
           
public static final class Lifecycle extends SystemService {
        private final ActivityManagerService mService;

        public Lifecycle(Context context) {
            super(context);
            mService = new ActivityManagerService(context);
        }

        @Override
        public void onStart() {
            mService.start();
        }

        @Override
        public void onCleanupUser(int userId) {
            mService.mBatteryStatsService.onCleanupUser(userId);
        }

        public ActivityManagerService getService() {
            return mService;
        }
    }
           

mService = new ActivityManagerService(context);  這塊實際上就是new出來binder的通信類

private void start() {
        ...
        LocalServices.addService(ActivityManagerInternal.class, new LocalService());
        ...
    }
           

run()     frameworks/base/services/java/com/android/server/SystemServer.java

為系統程序設定應用程式執行個體并開始

// Set up the Application instance for the system process and get started.
traceBeginAndSlog("SetSystemProcess");
mActivityManagerService.setSystemProcess();
           

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

程式在這個時候把建立好的ActivityManagerService放入ServiceManager這樣第三方應用就可以利用跨程序通信調用到了

public void setSystemProcess() {
        try {
            ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
            ServiceManager.addService("meminfo", new MemBinder(this));
            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
            ServiceManager.addService("dbinfo", new DbBinder(this));
            ...
    }
           

對于這個服務可以使用  service list  指令檢視

generic_x86_64:/ # service list | grep activity                                
91	activity: [android.app.IActivityManager]
           

2.啟動系統服務使用PackageManagerService.main調用

這裡以PackageManagerService為例  最後也是調用了ServiceManager.addService

main()    frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

public static PackageManagerService main(Context context, Installer installer,
            boolean factoryTest, boolean onlyCore) {
        // Self-check for initial settings.
        PackageManagerServiceCompilerMapping.checkProperties();

        PackageManagerService m = new PackageManagerService(context, installer,
                factoryTest, onlyCore);
        m.enableSystemUserPackages();
        ServiceManager.addService("package", m);
        final PackageManagerNative pmn = m.new PackageManagerNative();
        ServiceManager.addService("package_native", pmn);
        return m;
    }
           

run()     frameworks/base/services/java/com/android/server/SystemServer.java

開啟消息循環

// Loop forever.
Looper.loop();
           

最後介紹幾個系統服務及其作用

引導服務  startBootstrapServices();

    Installer                                      系統安裝APK時的一個服務類,啟動完成Installer服務之後才能啟動其他的系統服務

    ActivityManagerService             負責四大元件的啟動、切換、排程

    PowerManagerService              計算系統中和Power相關的計算,然後決策系統應該如何反應

    LightService                               管理和顯示背光LED

    DisplayManagerService             用來管理所有的顯示裝置

    UserManagerService                 多使用者模式管理

    SensorService                            為系統提供各種感應服務

    PackageManagerService           用來對apk進行安裝、解析、删除、解除安裝等操作

    ...

核心服務  startCoreServices();

    DropBoxManagerService           用于生成和管理系統運作時的一些日志檔案

    BatteryService                            管理電池相關的服務   

    UsageStatsService                     收集使用者使用每一個APP的頻率、使用時長

    WebViewUpdateService             WebView更新服務

其他服務  startOtherServices();

    CameraService                           攝像頭相關服務

    AudioService                               音頻相關管理服務

    BluetoothService                         藍牙管理服務

    InputManagerService                  管理輸入事件

    WindowsManagerService            視窗管理服務

    LocationManagerService             定位管理服務

    DeviceStorageMonitorService     存儲相關管理服務

    NotificationManagerService         通知管理服務

    VrManagerService                       VR模式管理服務

    AlarmManagerService                 全局定時器管理服務

   ...