android8.1启动过程 SystemServer 下

Posted we1less

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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库  查找一下看看代码在哪

godv@godv-OptiPlex-7070:~/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启动了ActivityManagerServicePowerManagerServicePackageManagerService等服务

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                 全局定时器管理服务

   ...

以上是关于android8.1启动过程 SystemServer 下的主要内容,如果未能解决你的问题,请参考以下文章

android8.1启动过程 SystemServer

android8.1启动过程 SystemServer启动FallbackHome2

android8.1启动过程 zygote进程分析2

android8.1开机动画启动分析

App启动流程

Android Framework实战视频--BootAnimation的启动源码分析(Android8.1)