SystemServer.java revision cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02
1/* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.server; 18 19import android.accounts.AccountManagerService; 20import android.app.ActivityManagerNative; 21import android.bluetooth.BluetoothAdapter; 22import android.content.ComponentName; 23import android.content.ContentResolver; 24import android.content.ContentService; 25import android.content.Context; 26import android.content.Intent; 27import android.content.pm.IPackageManager; 28import android.content.res.Configuration; 29import android.media.AudioService; 30import android.net.wifi.p2p.WifiP2pService; 31import android.os.Looper; 32import android.os.RemoteException; 33import android.os.ServiceManager; 34import android.os.StrictMode; 35import android.os.SystemClock; 36import android.os.SystemProperties; 37import android.provider.Settings; 38import android.server.BluetoothA2dpService; 39import android.server.BluetoothService; 40import android.server.search.SearchManagerService; 41import android.util.DisplayMetrics; 42import android.util.EventLog; 43import android.util.Slog; 44import android.view.WindowManager; 45 46import com.android.internal.app.ShutdownThread; 47import com.android.internal.os.BinderInternal; 48import com.android.internal.os.SamplingProfilerIntegration; 49import com.android.server.accessibility.AccessibilityManagerService; 50import com.android.server.am.ActivityManagerService; 51import com.android.server.net.NetworkPolicyManagerService; 52import com.android.server.net.NetworkStatsService; 53import com.android.server.pm.PackageManagerService; 54import com.android.server.usb.UsbService; 55import com.android.server.wm.WindowManagerService; 56 57import dalvik.system.VMRuntime; 58import dalvik.system.Zygote; 59 60import java.io.File; 61import java.util.Timer; 62import java.util.TimerTask; 63 64class ServerThread extends Thread { 65 private static final String TAG = "SystemServer"; 66 67 ContentResolver mContentResolver; 68 69 @Override 70 public void run() { 71 EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, 72 SystemClock.uptimeMillis()); 73 74 Looper.prepare(); 75 76 android.os.Process.setThreadPriority( 77 android.os.Process.THREAD_PRIORITY_FOREGROUND); 78 79 BinderInternal.disableBackgroundScheduling(true); 80 android.os.Process.setCanSelfBackground(false); 81 82 // Check whether we failed to shut down last time we tried. 83 { 84 final String shutdownAction = SystemProperties.get( 85 ShutdownThread.SHUTDOWN_ACTION_PROPERTY, ""); 86 if (shutdownAction != null && shutdownAction.length() > 0) { 87 boolean reboot = (shutdownAction.charAt(0) == '1'); 88 89 final String reason; 90 if (shutdownAction.length() > 1) { 91 reason = shutdownAction.substring(1, shutdownAction.length()); 92 } else { 93 reason = null; 94 } 95 96 ShutdownThread.rebootOrShutdown(reboot, reason); 97 } 98 } 99 100 String factoryTestStr = SystemProperties.get("ro.factorytest"); 101 int factoryTest = "".equals(factoryTestStr) ? SystemServer.FACTORY_TEST_OFF 102 : Integer.parseInt(factoryTestStr); 103 104 LightsService lights = null; 105 PowerManagerService power = null; 106 BatteryService battery = null; 107 AlarmManagerService alarm = null; 108 NetworkManagementService networkManagement = null; 109 NetworkStatsService networkStats = null; 110 NetworkPolicyManagerService networkPolicy = null; 111 ConnectivityService connectivity = null; 112 WifiP2pService wifiP2p = null; 113 IPackageManager pm = null; 114 Context context = null; 115 WindowManagerService wm = null; 116 BluetoothService bluetooth = null; 117 BluetoothA2dpService bluetoothA2dp = null; 118 WiredAccessoryObserver wiredAccessory = null; 119 DockObserver dock = null; 120 UsbService usb = null; 121 UiModeManagerService uiMode = null; 122 RecognitionManagerService recognition = null; 123 ThrottleService throttle = null; 124 NetworkTimeUpdateService networkTimeUpdater = null; 125 126 // Critical services... 127 try { 128 Slog.i(TAG, "Entropy Service"); 129 ServiceManager.addService("entropy", new EntropyService()); 130 131 Slog.i(TAG, "Power Manager"); 132 power = new PowerManagerService(); 133 ServiceManager.addService(Context.POWER_SERVICE, power); 134 135 Slog.i(TAG, "Activity Manager"); 136 context = ActivityManagerService.main(factoryTest); 137 138 Slog.i(TAG, "Telephony Registry"); 139 ServiceManager.addService("telephony.registry", new TelephonyRegistry(context)); 140 141 AttributeCache.init(context); 142 143 Slog.i(TAG, "Package Manager"); 144 pm = PackageManagerService.main(context, 145 factoryTest != SystemServer.FACTORY_TEST_OFF); 146 147 ActivityManagerService.setSystemProcess(); 148 149 mContentResolver = context.getContentResolver(); 150 151 // The AccountManager must come before the ContentService 152 try { 153 Slog.i(TAG, "Account Manager"); 154 ServiceManager.addService(Context.ACCOUNT_SERVICE, 155 new AccountManagerService(context)); 156 } catch (Throwable e) { 157 Slog.e(TAG, "Failure starting Account Manager", e); 158 } 159 160 Slog.i(TAG, "Content Manager"); 161 ContentService.main(context, 162 factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL); 163 164 Slog.i(TAG, "System Content Providers"); 165 ActivityManagerService.installSystemProviders(); 166 167 Slog.i(TAG, "Lights Service"); 168 lights = new LightsService(context); 169 170 Slog.i(TAG, "Battery Service"); 171 battery = new BatteryService(context, lights); 172 ServiceManager.addService("battery", battery); 173 174 Slog.i(TAG, "Vibrator Service"); 175 ServiceManager.addService("vibrator", new VibratorService(context)); 176 177 // only initialize the power service after we have started the 178 // lights service, content providers and the battery service. 179 power.init(context, lights, ActivityManagerService.getDefault(), battery); 180 181 Slog.i(TAG, "Alarm Manager"); 182 alarm = new AlarmManagerService(context); 183 ServiceManager.addService(Context.ALARM_SERVICE, alarm); 184 185 Slog.i(TAG, "Init Watchdog"); 186 Watchdog.getInstance().init(context, battery, power, alarm, 187 ActivityManagerService.self()); 188 189 Slog.i(TAG, "Window Manager"); 190 wm = WindowManagerService.main(context, power, 191 factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL); 192 ServiceManager.addService(Context.WINDOW_SERVICE, wm); 193 194 ((ActivityManagerService)ServiceManager.getService("activity")) 195 .setWindowManager(wm); 196 197 // Skip Bluetooth if we have an emulator kernel 198 // TODO: Use a more reliable check to see if this product should 199 // support Bluetooth - see bug 988521 200 if (SystemProperties.get("ro.kernel.qemu").equals("1")) { 201 Slog.i(TAG, "No Bluetooh Service (emulator)"); 202 } else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) { 203 Slog.i(TAG, "No Bluetooth Service (factory test)"); 204 } else { 205 Slog.i(TAG, "Bluetooth Service"); 206 bluetooth = new BluetoothService(context); 207 ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, bluetooth); 208 bluetooth.initAfterRegistration(); 209 bluetoothA2dp = new BluetoothA2dpService(context, bluetooth); 210 ServiceManager.addService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE, 211 bluetoothA2dp); 212 bluetooth.initAfterA2dpRegistration(); 213 214 int airplaneModeOn = Settings.System.getInt(mContentResolver, 215 Settings.System.AIRPLANE_MODE_ON, 0); 216 int bluetoothOn = Settings.Secure.getInt(mContentResolver, 217 Settings.Secure.BLUETOOTH_ON, 0); 218 if (airplaneModeOn == 0 && bluetoothOn != 0) { 219 bluetooth.enable(); 220 } 221 } 222 223 } catch (RuntimeException e) { 224 Slog.e("System", "Failure starting core service", e); 225 } 226 227 DevicePolicyManagerService devicePolicy = null; 228 StatusBarManagerService statusBar = null; 229 InputMethodManagerService imm = null; 230 AppWidgetService appWidget = null; 231 NotificationManagerService notification = null; 232 WallpaperManagerService wallpaper = null; 233 LocationManagerService location = null; 234 CountryDetectorService countryDetector = null; 235 TextServicesManagerService tsms = null; 236 237 if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { 238 try { 239 Slog.i(TAG, "Device Policy"); 240 devicePolicy = new DevicePolicyManagerService(context); 241 ServiceManager.addService(Context.DEVICE_POLICY_SERVICE, devicePolicy); 242 } catch (Throwable e) { 243 Slog.e(TAG, "Failure starting DevicePolicyService", e); 244 } 245 246 try { 247 Slog.i(TAG, "Status Bar"); 248 statusBar = new StatusBarManagerService(context, wm); 249 ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar); 250 } catch (Throwable e) { 251 Slog.e(TAG, "Failure starting StatusBarManagerService", e); 252 } 253 254 try { 255 Slog.i(TAG, "Clipboard Service"); 256 ServiceManager.addService(Context.CLIPBOARD_SERVICE, 257 new ClipboardService(context)); 258 } catch (Throwable e) { 259 Slog.e(TAG, "Failure starting Clipboard Service", e); 260 } 261 262 try { 263 Slog.i(TAG, "Input Method Service"); 264 imm = new InputMethodManagerService(context, statusBar); 265 ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm); 266 } catch (Throwable e) { 267 Slog.e(TAG, "Failure starting Input Manager Service", e); 268 } 269 270 try { 271 Slog.i(TAG, "NetworkManagement Service"); 272 networkManagement = NetworkManagementService.create(context); 273 ServiceManager.addService(Context.NETWORKMANAGEMENT_SERVICE, networkManagement); 274 } catch (Throwable e) { 275 Slog.e(TAG, "Failure starting NetworkManagement Service", e); 276 } 277 278 try { 279 Slog.i(TAG, "Text Service Manager Service"); 280 tsms = new TextServicesManagerService(context); 281 ServiceManager.addService(Context.TEXT_SERVICES_MANAGER_SERVICE, tsms); 282 } catch (Throwable e) { 283 Slog.e(TAG, "Failure starting Text Service Manager Service", e); 284 } 285 286 try { 287 Slog.i(TAG, "NetworkStats Service"); 288 networkStats = new NetworkStatsService(context, networkManagement, alarm); 289 ServiceManager.addService(Context.NETWORK_STATS_SERVICE, networkStats); 290 } catch (Throwable e) { 291 Slog.e(TAG, "Failure starting NetworkStats Service", e); 292 } 293 294 try { 295 Slog.i(TAG, "NetworkPolicy Service"); 296 networkPolicy = new NetworkPolicyManagerService( 297 context, ActivityManagerService.self(), power, 298 networkStats, networkManagement); 299 ServiceManager.addService(Context.NETWORK_POLICY_SERVICE, networkPolicy); 300 } catch (Throwable e) { 301 Slog.e(TAG, "Failure starting NetworkPolicy Service", e); 302 } 303 304 try { 305 Slog.i(TAG, "Wi-Fi P2pService"); 306 wifiP2p = new WifiP2pService(context); 307 ServiceManager.addService(Context.WIFI_P2P_SERVICE, wifiP2p); 308 } catch (Throwable e) { 309 Slog.e(TAG, "Failure starting Wi-Fi P2pService", e); 310 } 311 312 try { 313 Slog.i(TAG, "Connectivity Service"); 314 connectivity = new ConnectivityService(context, networkManagement, networkPolicy); 315 ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity); 316 networkStats.bindConnectivityManager(connectivity); 317 networkPolicy.bindConnectivityManager(connectivity); 318 wifiP2p.connectivityServiceReady(); 319 } catch (Throwable e) { 320 Slog.e(TAG, "Failure starting Connectivity Service", e); 321 } 322 323 try { 324 Slog.i(TAG, "Throttle Service"); 325 throttle = new ThrottleService(context); 326 ServiceManager.addService( 327 Context.THROTTLE_SERVICE, throttle); 328 } catch (Throwable e) { 329 Slog.e(TAG, "Failure starting ThrottleService", e); 330 } 331 332 try { 333 Slog.i(TAG, "Accessibility Manager"); 334 ServiceManager.addService(Context.ACCESSIBILITY_SERVICE, 335 new AccessibilityManagerService(context)); 336 } catch (Throwable e) { 337 Slog.e(TAG, "Failure starting Accessibility Manager", e); 338 } 339 340 try { 341 /* 342 * NotificationManagerService is dependant on MountService, 343 * (for media / usb notifications) so we must start MountService first. 344 */ 345 Slog.i(TAG, "Mount Service"); 346 ServiceManager.addService("mount", new MountService(context)); 347 } catch (Throwable e) { 348 Slog.e(TAG, "Failure starting Mount Service", e); 349 } 350 351 try { 352 Slog.i(TAG, "Notification Manager"); 353 notification = new NotificationManagerService(context, statusBar, lights); 354 ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification); 355 networkPolicy.bindNotificationManager(notification); 356 } catch (Throwable e) { 357 Slog.e(TAG, "Failure starting Notification Manager", e); 358 } 359 360 try { 361 Slog.i(TAG, "Device Storage Monitor"); 362 ServiceManager.addService(DeviceStorageMonitorService.SERVICE, 363 new DeviceStorageMonitorService(context)); 364 } catch (Throwable e) { 365 Slog.e(TAG, "Failure starting DeviceStorageMonitor service", e); 366 } 367 368 try { 369 Slog.i(TAG, "Location Manager"); 370 location = new LocationManagerService(context); 371 ServiceManager.addService(Context.LOCATION_SERVICE, location); 372 } catch (Throwable e) { 373 Slog.e(TAG, "Failure starting Location Manager", e); 374 } 375 376 try { 377 Slog.i(TAG, "Country Detector"); 378 countryDetector = new CountryDetectorService(context); 379 ServiceManager.addService(Context.COUNTRY_DETECTOR, countryDetector); 380 } catch (Throwable e) { 381 Slog.e(TAG, "Failure starting Country Detector", e); 382 } 383 384 try { 385 Slog.i(TAG, "Search Service"); 386 ServiceManager.addService(Context.SEARCH_SERVICE, 387 new SearchManagerService(context)); 388 } catch (Throwable e) { 389 Slog.e(TAG, "Failure starting Search Service", e); 390 } 391 392 try { 393 Slog.i(TAG, "DropBox Service"); 394 ServiceManager.addService(Context.DROPBOX_SERVICE, 395 new DropBoxManagerService(context, new File("/data/system/dropbox"))); 396 } catch (Throwable e) { 397 Slog.e(TAG, "Failure starting DropBoxManagerService", e); 398 } 399 400 try { 401 Slog.i(TAG, "Wallpaper Service"); 402 wallpaper = new WallpaperManagerService(context); 403 ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper); 404 } catch (Throwable e) { 405 Slog.e(TAG, "Failure starting Wallpaper Service", e); 406 } 407 408 try { 409 Slog.i(TAG, "Audio Service"); 410 ServiceManager.addService(Context.AUDIO_SERVICE, new AudioService(context)); 411 } catch (Throwable e) { 412 Slog.e(TAG, "Failure starting Audio Service", e); 413 } 414 415 try { 416 Slog.i(TAG, "Dock Observer"); 417 // Listen for dock station changes 418 dock = new DockObserver(context, power); 419 } catch (Throwable e) { 420 Slog.e(TAG, "Failure starting DockObserver", e); 421 } 422 423 try { 424 Slog.i(TAG, "Wired Accessory Observer"); 425 // Listen for wired headset changes 426 wiredAccessory = new WiredAccessoryObserver(context); 427 } catch (Throwable e) { 428 Slog.e(TAG, "Failure starting WiredAccessoryObserver", e); 429 } 430 431 try { 432 Slog.i(TAG, "USB Service"); 433 // Manage USB host and device support 434 usb = new UsbService(context); 435 ServiceManager.addService(Context.USB_SERVICE, usb); 436 } catch (Throwable e) { 437 Slog.e(TAG, "Failure starting UsbService", e); 438 } 439 440 try { 441 Slog.i(TAG, "UI Mode Manager Service"); 442 // Listen for UI mode changes 443 uiMode = new UiModeManagerService(context); 444 } catch (Throwable e) { 445 Slog.e(TAG, "Failure starting UiModeManagerService", e); 446 } 447 448 try { 449 Slog.i(TAG, "Backup Service"); 450 ServiceManager.addService(Context.BACKUP_SERVICE, 451 new BackupManagerService(context)); 452 } catch (Throwable e) { 453 Slog.e(TAG, "Failure starting Backup Service", e); 454 } 455 456 try { 457 Slog.i(TAG, "AppWidget Service"); 458 appWidget = new AppWidgetService(context); 459 ServiceManager.addService(Context.APPWIDGET_SERVICE, appWidget); 460 } catch (Throwable e) { 461 Slog.e(TAG, "Failure starting AppWidget Service", e); 462 } 463 464 try { 465 Slog.i(TAG, "Recognition Service"); 466 recognition = new RecognitionManagerService(context); 467 } catch (Throwable e) { 468 Slog.e(TAG, "Failure starting Recognition Service", e); 469 } 470 471 try { 472 Slog.i(TAG, "DiskStats Service"); 473 ServiceManager.addService("diskstats", new DiskStatsService(context)); 474 } catch (Throwable e) { 475 Slog.e(TAG, "Failure starting DiskStats Service", e); 476 } 477 478 try { 479 // need to add this service even if SamplingProfilerIntegration.isEnabled() 480 // is false, because it is this service that detects system property change and 481 // turns on SamplingProfilerIntegration. Plus, when sampling profiler doesn't work, 482 // there is little overhead for running this service. 483 Slog.i(TAG, "SamplingProfiler Service"); 484 ServiceManager.addService("samplingprofiler", 485 new SamplingProfilerService(context)); 486 } catch (Throwable e) { 487 Slog.e(TAG, "Failure starting SamplingProfiler Service", e); 488 } 489 490 try { 491 Slog.i(TAG, "NetworkTimeUpdateService"); 492 networkTimeUpdater = new NetworkTimeUpdateService(context); 493 } catch (Throwable e) { 494 Slog.e(TAG, "Failure starting NetworkTimeUpdate service"); 495 } 496 } 497 498 // Before things start rolling, be sure we have decided whether 499 // we are in safe mode. 500 final boolean safeMode = wm.detectSafeMode(); 501 if (safeMode) { 502 ActivityManagerService.self().enterSafeMode(); 503 // Post the safe mode state in the Zygote class 504 Zygote.systemInSafeMode = true; 505 // Disable the JIT for the system_server process 506 VMRuntime.getRuntime().disableJitCompilation(); 507 } else { 508 // Enable the JIT for the system_server process 509 VMRuntime.getRuntime().startJitCompilation(); 510 } 511 512 // It is now time to start up the app processes... 513 514 if (devicePolicy != null) { 515 devicePolicy.systemReady(); 516 } 517 518 if (notification != null) { 519 notification.systemReady(); 520 } 521 522 wm.systemReady(); 523 524 if (safeMode) { 525 ActivityManagerService.self().showSafeModeOverlay(); 526 } 527 528 // Update the configuration for this context by hand, because we're going 529 // to start using it before the config change done in wm.systemReady() will 530 // propagate to it. 531 Configuration config = wm.computeNewConfiguration(); 532 DisplayMetrics metrics = new DisplayMetrics(); 533 WindowManager w = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 534 w.getDefaultDisplay().getMetrics(metrics); 535 context.getResources().updateConfiguration(config, metrics); 536 537 power.systemReady(); 538 try { 539 pm.systemReady(); 540 } catch (RemoteException e) { 541 } 542 543 // These are needed to propagate to the runnable below. 544 final Context contextF = context; 545 final BatteryService batteryF = battery; 546 final NetworkManagementService networkManagementF = networkManagement; 547 final NetworkStatsService networkStatsF = networkStats; 548 final NetworkPolicyManagerService networkPolicyF = networkPolicy; 549 final ConnectivityService connectivityF = connectivity; 550 final DockObserver dockF = dock; 551 final UsbService usbF = usb; 552 final ThrottleService throttleF = throttle; 553 final UiModeManagerService uiModeF = uiMode; 554 final AppWidgetService appWidgetF = appWidget; 555 final WallpaperManagerService wallpaperF = wallpaper; 556 final InputMethodManagerService immF = imm; 557 final RecognitionManagerService recognitionF = recognition; 558 final LocationManagerService locationF = location; 559 final CountryDetectorService countryDetectorF = countryDetector; 560 final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater; 561 final TextServicesManagerService textServiceManagerServiceF = tsms; 562 563 // We now tell the activity manager it is okay to run third party 564 // code. It will call back into us once it has gotten to the state 565 // where third party code can really run (but before it has actually 566 // started launching the initial applications), for us to complete our 567 // initialization. 568 ((ActivityManagerService)ActivityManagerNative.getDefault()) 569 .systemReady(new Runnable() { 570 public void run() { 571 Slog.i(TAG, "Making services ready"); 572 573 startSystemUi(contextF); 574 if (batteryF != null) batteryF.systemReady(); 575 if (networkManagementF != null) networkManagementF.systemReady(); 576 if (networkStatsF != null) networkStatsF.systemReady(); 577 if (networkPolicyF != null) networkPolicyF.systemReady(); 578 if (connectivityF != null) connectivityF.systemReady(); 579 if (dockF != null) dockF.systemReady(); 580 if (usbF != null) usbF.systemReady(); 581 if (uiModeF != null) uiModeF.systemReady(); 582 if (recognitionF != null) recognitionF.systemReady(); 583 Watchdog.getInstance().start(); 584 585 // It is now okay to let the various system services start their 586 // third party code... 587 588 if (appWidgetF != null) appWidgetF.systemReady(safeMode); 589 if (wallpaperF != null) wallpaperF.systemReady(); 590 if (immF != null) immF.systemReady(); 591 if (locationF != null) locationF.systemReady(); 592 if (countryDetectorF != null) countryDetectorF.systemReady(); 593 if (throttleF != null) throttleF.systemReady(); 594 if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemReady(); 595 if (textServiceManagerServiceF != null) textServiceManagerServiceF.systemReady(); 596 } 597 }); 598 599 // For debug builds, log event loop stalls to dropbox for analysis. 600 if (StrictMode.conditionallyEnableDebugLogging()) { 601 Slog.i(TAG, "Enabled StrictMode for system server main thread."); 602 } 603 604 Looper.loop(); 605 Slog.d(TAG, "System ServerThread is exiting!"); 606 } 607 608 static final void startSystemUi(Context context) { 609 Intent intent = new Intent(); 610 intent.setComponent(new ComponentName("com.android.systemui", 611 "com.android.systemui.SystemUIService")); 612 Slog.d(TAG, "Starting service: " + intent); 613 context.startService(intent); 614 } 615} 616 617public class SystemServer { 618 private static final String TAG = "SystemServer"; 619 620 public static final int FACTORY_TEST_OFF = 0; 621 public static final int FACTORY_TEST_LOW_LEVEL = 1; 622 public static final int FACTORY_TEST_HIGH_LEVEL = 2; 623 624 static Timer timer; 625 static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr 626 627 // The earliest supported time. We pick one day into 1970, to 628 // give any timezone code room without going into negative time. 629 private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000; 630 631 /** 632 * This method is called from Zygote to initialize the system. This will cause the native 633 * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back 634 * up into init2() to start the Android services. 635 */ 636 native public static void init1(String[] args); 637 638 public static void main(String[] args) { 639 if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { 640 // If a device's clock is before 1970 (before 0), a lot of 641 // APIs crash dealing with negative numbers, notably 642 // java.io.File#setLastModified, so instead we fake it and 643 // hope that time from cell towers or NTP fixes it 644 // shortly. 645 Slog.w(TAG, "System clock is before 1970; setting to 1970."); 646 SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); 647 } 648 649 if (SamplingProfilerIntegration.isEnabled()) { 650 SamplingProfilerIntegration.start(); 651 timer = new Timer(); 652 timer.schedule(new TimerTask() { 653 @Override 654 public void run() { 655 SamplingProfilerIntegration.writeSnapshot("system_server", null); 656 } 657 }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); 658 } 659 660 // Mmmmmm... more memory! 661 dalvik.system.VMRuntime.getRuntime().clearGrowthLimit(); 662 663 // The system server has to run all of the time, so it needs to be 664 // as efficient as possible with its memory usage. 665 VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); 666 667 System.loadLibrary("android_servers"); 668 init1(args); 669 } 670 671 public static final void init2() { 672 Slog.i(TAG, "Entered the Android system server!"); 673 Thread thr = new ServerThread(); 674 thr.setName("android.server.ServerThread"); 675 thr.start(); 676 } 677} 678