赞
踩
SystemServer进程在android系统中占了举足轻重的地位,系统的所有服务和SystemUI都是由它启动。
- //frameworks/base/services/java/com/android/server/SystemServer.java
- /** * The main entry point from zygote. */
- public static void main(String[] args) {
- new SystemServer().run();
- }
SystemServer的入口函数同样是main,调用顺序先是构造函数,再是run,构造函数没有什么重点地方后文dump详细介绍,主要流程主要还是run方法。run里面哦流程其实还是遵循普遍的三部曲:初始化上下文->启动服务->进入loop循环
- //frameworks/base/services/java/com/android/server/SystemServer.java
- private void run() {
- TimingsTraceAndSlog t = new TimingsTraceAndSlog();
- try {
- t.traceBegin("InitBeforeStartServices");
- //.....一些属性的初始化....
- // The system server should never make non-oneway calls
- Binder.setWarnOnBlocking(true);
- // The system server should always load safe labels
- PackageItemInfo.forceSafeLabels();
- // Default to FULL within the system server.
- SQLiteGlobal.sDefaultSyncMode = SQLiteGlobal.SYNC_MODE_FULL;
- // Deactivate SQLiteCompatibilityWalFlags until settings provider is initialized
- SQLiteCompatibilityWalFlags.init(null);
- // Here we go!
- Slog.i(TAG, "Entered the Android system server!");
- final long uptimeMillis = SystemClock.elapsedRealtime(); //记录开始启动的时间错,调试系统启动时间的时候需要关注
- // Mmmmmm... more memory!
- VMRuntime.getRuntime().clearGrowthLimit();
- // Some devices rely on runtime fingerprint generation, so make sure we've defined it before booting further.
- Build.ensureFingerprintProperty();
- // Within the system server, it is an error to access Environment paths without explicitly specifying a user.
- Environment.setUserRequired(true);
- // Within the system server, any incoming Bundles should be defused to avoid throwing BadParcelableException.
- BaseBundle.setShouldDefuse(true);
- // Within the system server, when parceling exceptions, include the stack trace
- Parcel.setStackTraceParceling(true);
- // Ensure binder calls into the system always run at foreground priority.
- BinderInternal.disableBackgroundScheduling(true);
- // 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.prepareMainLooper();
- Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
- SystemServiceRegistry.sEnableServiceNotFoundWtf = true;
- // Initialize native services.
- System.loadLibrary("android_servers");
- // Allow heap / perf profiling.
- initZygoteChildHeapProfiling();
- // Check whether we failed to shut down last time we tried. This call may not return.
- performPendingShutdown();
- // Initialize the system context.
- createSystemContext();
- // Call per-process mainline module initialization.
- ActivityThread.initializeMainlineModules();
- } finally {
- t.traceEnd(); // InitBeforeStartServices
- }
- //frameworks/base/services/java/com/android/server/SystemServer.java
- // Start services.
- try {
- t.traceBegin("StartServices");
- startBootstrapServices(t); //启动BOOT服务(即没有这些服务系统无法运行)
- startCoreServices(t); //启动核心服务
- startOtherServices(t); //启动其他服务
- startApexServices(t); //启动APEX服务,此服务必现要在前面的所有服务启动之后才能启动,为了防止OTA相关问题
- // Only update the timeout after starting all the services so that we use
- // the default timeout to start system server.
- updateWatchdogTimeout(t);
- } catch (Throwable ex) {
- Slog.e("System", "******************************************");
- Slog.e("System", "************ Failure starting system services", ex);
- throw ex;
- } finally {
- t.traceEnd(); // StartServices
- }
- /**
- * Starts system services defined in apexes.
- * <p>Apex services must be the last category of services to start. No other service must be
- * starting after this point. This is to prevent unnecessary stability issues when these apexes
- * are updated outside of OTA; and to avoid breaking dependencies from system into apexes.
- */
- private void startApexServices(@NonNull TimingsTraceAndSlog t) {
- t.traceBegin("startApexServices");
- // TODO(b/192880996): get the list from "android" package, once the manifest entries are migrated to system manifest.
- List<ApexSystemServiceInfo> services = ApexManager.getInstance().getApexSystemServices();
- for (ApexSystemServiceInfo info : services) {
- String name = info.getName();
- String jarPath = info.getJarPath();
- t.traceBegin("starting " + name);
- if (TextUtils.isEmpty(jarPath)) {
- mSystemServiceManager.startService(name);
- } else {
- mSystemServiceManager.startServiceFromJar(name, jarPath);
- }
- t.traceEnd();
- }
- // make sure no other services are started after this point
- mSystemServiceManager.sealStartedServices();
- t.traceEnd(); // startApexServices
- }
如上代码大体启动了四类服务:
- //frameworks/base/services/java/com/android/server/SystemServer.java
- StrictMode.initVmDefaults(null);
- if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
- final long uptimeMillis = SystemClock.elapsedRealtime();
- final long maxUptimeMillis = 60 * 1000;
- if (uptimeMillis > maxUptimeMillis) {
- Slog.wtf(SYSTEM_SERVER_TIMING_TAG, "SystemServer init took too long. uptimeMillis=" + uptimeMillis);
- }
- }
- // Loop forever.
- Looper.loop();
- throw new RuntimeException("Main thread loop unexpectedly exited");
和之前讲的binder一样,基本上所有的进程最后都会进入loop进行循环,轮询主线程相关的handle消息和binder消息,如下日志堆栈,表示handle消息处理过程中发生异常:
- SystemServer:
- Runtime restart: false
- Start count: 1
- Runtime start-up time: +8s0ms
- Runtime start-elapsed time: +8s0ms
-
- SystemServiceManager:
- Current phase: 1000
- Current user not set!
- 1 target users: 0(full)
- 172 started services:
- com.transsion.hubcore.server.TranBootstrapServiceManagerService
- com.android.server.security.FileIntegrityService
- com.android.server.pm.Installer
- com.android.server.os.DeviceIdentifiersPolicyService
- com.android.server.uri.UriGrantsManagerService.Lifecycle
- com.android.server.powerstats.PowerStatsService
- com.android.server.permission.access.AccessCheckingService
- com.android.server.wm.ActivityTaskManagerService.Lifecycle
- com.android.server.am.ActivityManagerService.Lifecycle
- ......
-
- com.android.server.Watchdog:
- WatchdogTimeoutMillis=60000
-
- SystemServerInitThreadPool:
- has instance: false
- number of threads: 8
- service: java.util.concurrent.ThreadPoolExecutor@7bf04fb[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 351]
- is shutdown: true
- no pending tasks
-
- AdServices:
- mAdServicesModuleName: com.google.android.adservices
- mAdServicesModuleVersion: 341131050
- mHandlerThread: Thread[AdServicesManagerServiceHandler,5,main]
- mAdServicesPackagesRolledBackFrom: {}
- mAdServicesPackagesRolledBackTo: {}
- ShellCmd enabled: false
- UserInstanceManager
- mAdServicesBaseDir: /data/system/adservices
- mConsentManagerMapLocked: {}
- mAppConsentManagerMapLocked: {}
- mRollbackHandlingManagerMapLocked: {}
- mBlockedTopicsManagerMapLocked={}
- TopicsDbHelper
- CURRENT_DATABASE_VERSION: 1
- mDbFile: /data/system/adservices_topics.db
- mDbVersion: 1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。