frameworks 之SystemServer


上文 Zygote 孵化出来后会创建 SystemServcer, 该类会创建出系统服务 。涉及到的类如下

  • frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  • frameworks/base/core/java/com/android/internal/os/ZygoteCommandBuffer.java
  • frameworks/base/core/java/com/android/internal/os/ZygoteArguments.java
  • frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
  • frframeworks/base/core/jni/AndroidRuntime.cpp
  • frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
  • frameworks/base/services/java/com/android/server/SystemServer.java

反射创建 SystemServer

上文可以看到 调用 forkSystemServer 会创建一个新进程。重要的参数在 com.android.server.SystemServer 后续会通过该参数反射调用类。parsedArgs = ZygoteArguments.getInstance(commandBuffer) 解析参数,并该最后的一个参数放到 remainArg 里

String[] args = {
                "--setuid=1000",
                "--setgid=1000",
                "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
                        + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011,3012",
                "--capabilities=" + capabilities + "," + capabilities,
                "--nice-name=system_server",
                "--runtime-args",
                "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
                "com.android.server.SystemServer",
        };
        ZygoteArguments parsedArgs;

        int pid;

        try {
            ZygoteCommandBuffer commandBuffer = new ZygoteCommandBuffer(args);
            try {
            // 解析参数
                parsedArgs = ZygoteArguments.getInstance(commandBuffer);
            } catch (EOFException e) {
                throw new AssertionError("Unexpected argument error for forking system server", e);
            }
            commandBuffer.close();
            Zygote.applyDebuggerSystemProperty(parsedArgs);
            Zygote.applyInvokeWithSystemProperty(parsedArgs);

            if (Zygote.nativeSupportsMemoryTagging()) {
                /* The system server has ASYNC MTE by default, in order to allow
                 * system services to specify their own MTE level later, as you
                 * can't re-enable MTE once it's disabled. */
                String mode = SystemProperties.get("arm64.memtag.process.system_server", "async");
                if (mode.equals("async")) {
                    parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_ASYNC;
                } else if (mode.equals("sync")) {
                    parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_SYNC;
                } else if (!mode.equals("off")) {
                    /* When we have an invalid memory tag level, keep the current level. */
                    parsedArgs.mRuntimeFlags |= Zygote.nativeCurrentTaggingLevel();
                    Slog.e(TAG, "Unknown memory tag level for the system server: \"" + mode + "\"");
                }
            } else if (Zygote.nativeSupportsTaggedPointers()) {
                /* Enable pointer tagging in the system server. Hardware support for this is present
                 * in all ARMv8 CPUs. */
                parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_TBI;
            }

            /* Enable gwp-asan on the system server with a small probability. This is the same
             * policy as applied to native processes and system apps. */
            parsedArgs.mRuntimeFlags |= Zygote.GWP_ASAN_LEVEL_LOTTERY;

            if (shouldProfileSystemServer()) {
                parsedArgs.mRuntimeFlags |= Zygote.PROFILE_SYSTEM_SERVER;
            }

            /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.mUid, parsedArgs.mGid,
                    parsedArgs.mGids,
                    parsedArgs.mRuntimeFlags,
                    null,
                    parsedArgs.mPermittedCapabilities,
                    parsedArgs.mEffectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

        /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }
			// 因为是新创建的另一个进程 不需要zygote的进程
            zygoteServer.closeServerSocket();
            return handleSystemServerProcess(parsedArgs);
        }

其中 ZygoteArguments 会解析参数并把没解析的参数 放到 mRemainingArgs 中, 接着会判断pid 等于 0 调用handleSystemServerProcess方法。里面通过调用 Os.getenv(“SYSTEMSERVERCLASSPATH”) 获取对应的环境变量(可以通过 adb shell 后 通过 env | grep SYSTEMSERVERCLASSPATH)查看该环境变量值 并获取 mRemainingArgs 传入 ZygoteInit.zygoteInit 方法

private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {
	final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
	...
	return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
                    parsedArgs.mDisabledCompatChanges,
                    parsedArgs.mRemainingArgs, cl);
}

zygoteInit 方法里面主要有 nativeZygoteInit 主要是用来启动一个Binder线程池这样SystemServer进程就可以与其他进程进行通信了,zygote进程没有bidner,该方法不在zygote.cpp里面,而是在AndroidRuntime.cpp里面 ,可以全局搜索 grep “_nativeZygoteInit” ./ -rn 搜索出。

public static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,
            String[] argv, ClassLoader classLoader) {
        if (RuntimeInit.DEBUG) {
            Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");
        }

        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");
        RuntimeInit.redirectLogStreams();

        RuntimeInit.commonInit();
        // 创建binder线程池
        ZygoteInit.nativeZygoteInit();
        return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,
                classLoader);
    }

/*framework/base/core/jni/AndroidRuntime.cpp*/
static void com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jobject clazz) {
    //此处的gCurRuntime为AppRuntime,是在AndroidRuntime.cpp中定义的
    gCurRuntime->onZygoteInit();
}
 
 
/*framework/base/cmds/app_process_app_main.cpp*/
virtual void onZygoteInit() {
    sp<ProcessState> proc = ProcessState::self();
    proc->startThreadPool(); //启动新binder线程, 关于binder线程的介绍,后续专题介绍
}

applicationInit 方法又会调用 findStaticMain 方法。

protected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges,
            String[] argv, ClassLoader classLoader) {
        ...
        // Remaining arguments are passed to the start class's static main
        return findStaticMain(args.startClass, args.startArgs, classLoader);
    }

findStaticMain 方法会解析一开始的参数 用反射获取对应类 和 main 方法, 最后 MethodAndArgsCaller 启动 Runnable 方法。 通过里面的run方法 调用 main。

protected static Runnable findStaticMain(String className, String[] argv,
            ClassLoader classLoader) {
        ...
        // 获取类
		try {
            cl = Class.forName(className, true, classLoader);
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException(
                    "Missing class when invoking static main " + className,
                    ex);
        }
        // 获取 main 方法
        Method m;
        try {
            m = cl.getMethod("main", new Class[] { String[].class });
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException(
                    "Missing static main on " + className, ex);
        } catch (SecurityException ex) {
            throw new RuntimeException(
                    "Problem getting static main on " + className, ex);
        }
        ...
        return new MethodAndArgsCaller(m, argv);
}

static class MethodAndArgsCaller implements Runnable {
		...
		public void run() {
            try {
            // 启动 main 方法
                mMethod.invoke(null, new Object[] { mArgs });
            } catch (IllegalAccessException ex) {
                throw new RuntimeException(ex);
            } catch (InvocationTargetException ex) {
                Throwable cause = ex.getCause();
                if (cause instanceof RuntimeException) {
                    throw (RuntimeException) cause;
                } else if (cause instanceof Error) {
                    throw (Error) cause;
                }
                throw new RuntimeException(ex);
            }
        }
}

SystemServer 启动服务

进入 main 方法后,调用 run。 run方法里面有主要几个事项,设置线程池的属性,
初始化 prepareMainLooper
创建上下文 createSystemContext
初始化 SystemServiceManager
添加到缓存 LocalServices.addService
启动系统相关 startBootstrapServices
启动核心服务 startCoreServices
启动其他服务 startOtherServices

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

private void run() {
			...
			// 设置线程优先级
			// Ensure binder calls into the system always run at foreground priority.
            BinderInternal.disableBackgroundScheduling(true);
            // 设置线程数 为31
            // Increase the number of binder threads in system_server
            BinderInternal.setMaxThreads(sMaxBinderThreads);
            // Prepare the main looper thread (this thread).
            android.os.Process.setThreadPriority(
                    android.os.Process.THREAD_PRIORITY_FOREGROUND);
            android.os.Process.setCanSelfBackground(false);
            // Looper 创建对于的looper 
            Looper.prepareMainLooper();
            ...
            // 加载so库
            System.loadLibrary("android_servers");
            ...
            // 初始化 上下文
            // Initialize the system context.
            createSystemContext();
            ...
            // 初始化 SystemServiceManager
            // Create the system service manager.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            // 添加到服务缓存
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            ...
            // 启动各种服务
            // Start services.
        try {
            t.traceBegin("StartServices");
            startBootstrapServices(t);
            startCoreServices(t);
            startOtherServices(t);
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            t.traceEnd(); // StartServices
        }
}

private void createSystemContext() {
		// 此处并不是线程的概念,只是一个对象而已
        ActivityThread activityThread = ActivityThread.systemMain();
        // 获取system context
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
		//获取systemui context
        final Context systemUiContext = activityThread.getSystemUiContext();
        systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}

启动服务服务的 IBind 服务都会保存在 ServiceManager 他类似一个DNS路由器,保存各种 AIDL。添加AMS 服务是通过 startService 启动 ActivityTaskManagerService.Lifecycle.class 后 在通过 getService()

private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
	...
	// 添加 AMS 服务
	ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
}

startService 里面通过 反射创建对应的类, 在调用 start 方法。

public <T extends SystemService> T startService(Class<T> serviceClass) {
			try {
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
            } 
            // 调用 startService
            startService(service);
}

public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);
       	try {
       		// 调用 onStart 方法
            service.onStart();
        } catch (RuntimeException ex) {
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        }
    }

AMS 对应的start 方法如下 会启动start , 里面的 publishBinderService 会将该服务添加到 ServiceManager

public static final class Lifecycle extends SystemService {
		private final ActivityTaskManagerService mService;
		public Lifecycle(Context context) {
            super(context);
            mService = new ActivityTaskManagerService(context);
        }

        @Override
        public void onStart() {
            publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
            mService.start();
        }
}
// frameworks/base/services/core/java/com/android/server/SystemService.java
protected final void publishBinderService(String name, IBinder service,
            boolean allowIsolated, int dumpPriority) {
        ServiceManager.addService(name, service, allowIsolated, dumpPriority);
    }

// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
private void start() {
     LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
 }

其中一些 wms input 也会直接 直接 add到 ServiceManager 里面

			// 初始化 后直接 add 
			wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
                    new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
            ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
                    DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
            ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
                    /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值