Android的System Server
16lz
2022-05-21
System Server是Android系统的核心,他在Dalvik虚拟机启动后立即开始初始化和运行。其它的系统服务在System Server进程的环境中运行。/base/services/java/com/android/server/SystemServer.java
Java代码- /**
- *ThismethodiscalledfromZygotetoinitializethesystem.Thiswillcausethenative
- *services(SurfaceFlinger,AudioFlinger,etc..)tobestarted.Afterthatitwillcallback
- *upintoinit2()tostarttheAndroidservices.
- */
- nativepublicstaticvoidinit1(String[]args);
- publicstaticvoidmain(String[]args){
- if(System.currentTimeMillis()<EARLIEST_SUPPORTED_TIME){
- //Ifadevice'sclockisbefore1970(before0),alotof
- //APIscrashdealingwithnegativenumbers,notably
- //java.io.File#setLastModified,soinsteadwefakeitand
- //hopethattimefromcelltowersorNTPfixesit
- //shortly.
- Slog.w(TAG,"Systemclockisbefore1970;settingto1970.");
- SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
- }
- if(SamplingProfilerIntegration.isEnabled()){
- SamplingProfilerIntegration.start();
- timer=newTimer();
- timer.schedule(newTimerTask(){
- @Override
- publicvoidrun(){
- SamplingProfilerIntegration.writeSnapshot("system_server");
- }
- },SNAPSHOT_INTERVAL,SNAPSHOT_INTERVAL);
- }
- //Thesystemserverhastorunallofthetime,soitneedstobe
- //asefficientaspossiblewithitsmemoryusage.
- VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
- System.loadLibrary("android_servers");
- init1(args);
- }
- publicstaticfinalvoidinit2(){
- Slog.i(TAG,"EnteredtheAndroidsystemserver!");
- Threadthr=newServerThread();
- thr.setName("android.server.ServerThread");
- thr.start();
- }
/** * This method is called from Zygote to initialize the system. This will cause the native * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back * up into init2() to start the Android services. */ native public static void init1(String[] args); public static void main(String[] args) { if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { // If a device's clock is before 1970 (before 0), a lot of // APIs crash dealing with negative numbers, notably // java.io.File#setLastModified, so instead we fake it and // hope that time from cell towers or NTP fixes it // shortly. Slog.w(TAG, "System clock is before 1970; setting to 1970."); SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); } if (SamplingProfilerIntegration.isEnabled()) { SamplingProfilerIntegration.start(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { SamplingProfilerIntegration.writeSnapshot("system_server"); } }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); } // The system server has to run all of the time, so it needs to be // as efficient as possible with its memory usage. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); System.loadLibrary("android_servers"); init1(args); } public static final void init2() { Slog.i(TAG, "Entered the Android system server!"); Thread thr = new ServerThread(); thr.setName("android.server.ServerThread"); thr.start(); }
在main函数中,首先检查系统时间设置和SamplingProfiler。然后加载一个叫android_servers的本地库,他提供本地方法的接口(源程序在framework/base/services/jni/目录中)。然后调用本地方法设置服务。具体执行设置的代码在frameworks/base/cmds/system_server/library/system_init.cpp中。
C代码- extern"C"status_tsystem_init()
- {
- LOGI("Enteredsystem_init()");
- sp<ProcessState>proc(ProcessState::self());
- sp<IServiceManager>sm=defaultServiceManager();
- LOGI("ServiceManager:%p\n",sm.get());
- sp<GrimReaper>grim=newGrimReaper();
- sm->asBinder()->linkToDeath(grim,grim.get(),0);
- charpropBuf[PROPERTY_VALUE_MAX];
- property_get("system_init.startsurfaceflinger",propBuf,"1");
- if(strcmp(propBuf,"1")==0){
- //StarttheSurfaceFlinger
- SurfaceFlinger::instantiate();
- }
- //Startthesensorservice
- SensorService::instantiate();
- //Onthesimulator,audioflingeretaldon'tgetstartedthe
- //samewayasonthedevice,andweneedtostartthemhere
- if(!proc->supportsProcesses()){
- //StarttheAudioFlinger
- AudioFlinger::instantiate();
- //Startthemediaplaybackservice
- MediaPlayerService::instantiate();
- //Startthecameraservice
- CameraService::instantiate();
- //Starttheaudiopolicyservice
- AudioPolicyService::instantiate();
- }
- //AndnowstarttheAndroidruntime.Wehavetodothisbit
- //ofnastinessbecausetheAndroidruntimeinitializationrequires
- //someofthecoresystemservicestoalreadybestarted.
- //AllotherserversshouldjuststarttheAndroidruntimeat
- //thebeginningoftheirprocesses'smain(),beforecalling
- //theinitfunction.
- LOGI("Systemserver:startingAndroidruntime.\n");
- AndroidRuntime*runtime=AndroidRuntime::getRuntime();
- LOGI("Systemserver:startingAndroidservices.\n");
- runtime->callStatic("com/android/server/SystemServer","init2");
- //Ifrunninginourownprocess,justgointothethread
- //pool.Otherwise,calltheinitializationfinished
- //functoletthisprocesscontinueitsinitilization.
- if(proc->supportsProcesses()){
- LOGI("Systemserver:enteringthreadpool.\n");
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- LOGI("Systemserver:exitingthreadpool.\n");
- }
- returnNO_ERROR;
- }
extern "C" status_t system_init(){ LOGI("Entered system_init()"); sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); LOGI("ServiceManager: %p\n", sm.get()); sp<GrimReaper> grim = new GrimReaper(); sm->asBinder()->linkToDeath(grim, grim.get(), 0); char propBuf[PROPERTY_VALUE_MAX]; property_get("system_init.startsurfaceflinger", propBuf, "1"); if (strcmp(propBuf, "1") == 0) { // Start the SurfaceFlinger SurfaceFlinger::instantiate(); } // Start the sensor service SensorService::instantiate(); // On the simulator, audioflinger et al don't get started the // same way as on the device, and we need to start them here if (!proc->supportsProcesses()) { // Start the AudioFlinger AudioFlinger::instantiate(); // Start the media playback service MediaPlayerService::instantiate(); // Start the camera service CameraService::instantiate(); // Start the audio policy service AudioPolicyService::instantiate(); } // And now start the Android runtime. We have to do this bit // of nastiness because the Android runtime initialization requires // some of the core system services to already be started. // All other servers should just start the Android runtime at // the beginning of their processes's main(), before calling // the init function. LOGI("System server: starting Android runtime.\n"); AndroidRuntime* runtime = AndroidRuntime::getRuntime(); LOGI("System server: starting Android services.\n"); runtime->callStatic("com/android/server/SystemServer", "init2"); // If running in our own process, just go into the thread // pool. Otherwise, call the initialization finished // func to let this process continue its initilization. if (proc->supportsProcesses()) { LOGI("System server: entering thread pool.\n"); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); LOGI("System server: exiting thread pool.\n"); } return NO_ERROR;}
等初始化传感器,视频,音频等服务后,调用一个回调方法init2 (在SystemServer.java中)。在上面的代码可以看到,这个方法开启了ServerThread来初始化其它的服务。
Java代码- publicvoidrun(){
- EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN,
- SystemClock.uptimeMillis());
- Looper.prepare();
- android.os.Process.setThreadPriority(
- android.os.Process.THREAD_PRIORITY_FOREGROUND);
- BinderInternal.disableBackgroundScheduling(true);
- android.os.Process.setCanSelfBackground(false);
- //Checkwhetherwefailedtoshutdownlasttimewetried.
- {
- finalStringshutdownAction=SystemProperties.get(
- ShutdownThread.SHUTDOWN_ACTION_PROPERTY,"");
- if(shutdownAction!=null&&shutdownAction.length()>0){
- booleanreboot=(shutdownAction.charAt(0)=='1');
- finalStringreason;
- if(shutdownAction.length()>1){
- reason=shutdownAction.substring(1,shutdownAction.length());
- }else{
- reason=null;
- }
- ShutdownThread.rebootOrShutdown(reboot,reason);
- }
- }
- StringfactoryTestStr=SystemProperties.get("ro.factorytest");
- intfactoryTest="".equals(factoryTestStr)?SystemServer.FACTORY_TEST_OFF
- :Integer.parseInt(factoryTestStr);
- LightsServicelights=null;
- PowerManagerServicepower=null;
- BatteryServicebattery=null;
- ConnectivityServiceconnectivity=null;
- IPackageManagerpm=null;
- Contextcontext=null;
- WindowManagerServicewm=null;
- BluetoothServicebluetooth=null;
- BluetoothA2dpServicebluetoothA2dp=null;
- HeadsetObserverheadset=null;
- DockObserverdock=null;
- UsbServiceusb=null;
- UiModeManagerServiceuiMode=null;
- RecognitionManagerServicerecognition=null;
- ThrottleServicethrottle=null;
- //Criticalservices...
- try{
- Slog.i(TAG,"EntropyService");
- ServiceManager.addService("entropy",newEntropyService());
- Slog.i(TAG,"PowerManager");
- power=newPowerManagerService();
- ServiceManager.addService(Context.POWER_SERVICE,power);
- Slog.i(TAG,"ActivityManager");
- context=ActivityManagerService.main(factoryTest);
- Slog.i(TAG,"TelephonyRegistry");
- ServiceManager.addService("telephony.registry",newTelephonyRegistry(context));
- AttributeCache.init(context);
- Slog.i(TAG,"PackageManager");
- pm=PackageManagerService.main(context,
- factoryTest!=SystemServer.FACTORY_TEST_OFF);
- ActivityManagerService.setSystemProcess();
- mContentResolver=context.getContentResolver();
- //TheAccountManagermustcomebeforetheContentService
- try{
- Slog.i(TAG,"AccountManager");
- ServiceManager.addService(Context.ACCOUNT_SERVICE,
- newAccountManagerService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingAccountManager",e);
- }
- Slog.i(TAG,"ContentManager");
- ContentService.main(context,
- factoryTest==SystemServer.FACTORY_TEST_LOW_LEVEL);
- Slog.i(TAG,"SystemContentProviders");
- ActivityManagerService.installSystemProviders();
- Slog.i(TAG,"BatteryService");
- battery=newBatteryService(context);
- ServiceManager.addService("battery",battery);
- Slog.i(TAG,"LightsService");
- lights=newLightsService(context);
- Slog.i(TAG,"VibratorService");
- ServiceManager.addService("vibrator",newVibratorService(context));
- //onlyinitializethepowerserviceafterwehavestartedthe
- //lightsservice,contentprovidersandthebatteryservice.
- power.init(context,lights,ActivityManagerService.getDefault(),battery);
- Slog.i(TAG,"AlarmManager");
- AlarmManagerServicealarm=newAlarmManagerService(context);
- ServiceManager.addService(Context.ALARM_SERVICE,alarm);
- Slog.i(TAG,"InitWatchdog");
- Watchdog.getInstance().init(context,battery,power,alarm,
- ActivityManagerService.self());
- Slog.i(TAG,"WindowManager");
- wm=WindowManagerService.main(context,power,
- factoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL);
- ServiceManager.addService(Context.WINDOW_SERVICE,wm);
- ((ActivityManagerService)ServiceManager.getService("activity"))
- .setWindowManager(wm);
- //SkipBluetoothifwehaveanemulatorkernel
- //TODO:Useamorereliablechecktoseeifthisproductshould
- //supportBluetooth-seebug988521
- if(SystemProperties.get("ro.kernel.qemu").equals("1")){
- Slog.i(TAG,"RegisteringnullBluetoothService(emulator)");
- ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE,null);
- }elseif(factoryTest==SystemServer.FACTORY_TEST_LOW_LEVEL){
- Slog.i(TAG,"RegisteringnullBluetoothService(factorytest)");
- ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE,null);
- }else{
- Slog.i(TAG,"BluetoothService");
- bluetooth=newBluetoothService(context);
- ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE,bluetooth);
- bluetooth.initAfterRegistration();
- bluetoothA2dp=newBluetoothA2dpService(context,bluetooth);
- ServiceManager.addService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE,
- bluetoothA2dp);
- intbluetoothOn=Settings.Secure.getInt(mContentResolver,
- Settings.Secure.BLUETOOTH_ON,0);
- if(bluetoothOn>0){
- bluetooth.enable();
- }
- }
- }catch(RuntimeExceptione){
- Slog.e("System","Failurestartingcoreservice",e);
- }
- DevicePolicyManagerServicedevicePolicy=null;
- StatusBarManagerServicestatusBar=null;
- InputMethodManagerServiceimm=null;
- AppWidgetServiceappWidget=null;
- NotificationManagerServicenotification=null;
- WallpaperManagerServicewallpaper=null;
- LocationManagerServicelocation=null;
- if(factoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL){
- try{
- Slog.i(TAG,"DevicePolicy");
- devicePolicy=newDevicePolicyManagerService(context);
- ServiceManager.addService(Context.DEVICE_POLICY_SERVICE,devicePolicy);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingDevicePolicyService",e);
- }
- try{
- Slog.i(TAG,"StatusBar");
- statusBar=newStatusBarManagerService(context);
- ServiceManager.addService(Context.STATUS_BAR_SERVICE,statusBar);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingStatusBarManagerService",e);
- }
- try{
- Slog.i(TAG,"ClipboardService");
- ServiceManager.addService(Context.CLIPBOARD_SERVICE,
- newClipboardService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingClipboardService",e);
- }
- try{
- Slog.i(TAG,"InputMethodService");
- imm=newInputMethodManagerService(context,statusBar);
- ServiceManager.addService(Context.INPUT_METHOD_SERVICE,imm);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingInputManagerService",e);
- }
- try{
- Slog.i(TAG,"NetStatService");
- ServiceManager.addService("netstat",newNetStatService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingNetStatService",e);
- }
- try{
- Slog.i(TAG,"NetworkManagementService");
- ServiceManager.addService(
- Context.NETWORKMANAGEMENT_SERVICE,
- NetworkManagementService.create(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingNetworkManagementService",e);
- }
- try{
- Slog.i(TAG,"ConnectivityService");
- connectivity=ConnectivityService.getInstance(context);
- ServiceManager.addService(Context.CONNECTIVITY_SERVICE,connectivity);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingConnectivityService",e);
- }
- try{
- Slog.i(TAG,"ThrottleService");
- throttle=newThrottleService(context);
- ServiceManager.addService(
- Context.THROTTLE_SERVICE,throttle);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingThrottleService",e);
- }
- try{
- Slog.i(TAG,"AccessibilityManager");
- ServiceManager.addService(Context.ACCESSIBILITY_SERVICE,
- newAccessibilityManagerService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingAccessibilityManager",e);
- }
- try{
- /*
- *NotificationManagerServiceisdependantonMountService,
- *(formedia/usbnotifications)sowemuststartMountServicefirst.
- */
- Slog.i(TAG,"MountService");
- ServiceManager.addService("mount",newMountService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingMountService",e);
- }
- try{
- Slog.i(TAG,"NotificationManager");
- notification=newNotificationManagerService(context,statusBar,lights);
- ServiceManager.addService(Context.NOTIFICATION_SERVICE,notification);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingNotificationManager",e);
- }
- try{
- Slog.i(TAG,"DeviceStorageMonitor");
- ServiceManager.addService(DeviceStorageMonitorService.SERVICE,
- newDeviceStorageMonitorService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingDeviceStorageMonitorservice",e);
- }
- try{
- Slog.i(TAG,"LocationManager");
- location=newLocationManagerService(context);
- ServiceManager.addService(Context.LOCATION_SERVICE,location);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingLocationManager",e);
- }
- try{
- Slog.i(TAG,"SearchService");
- ServiceManager.addService(Context.SEARCH_SERVICE,
- newSearchManagerService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingSearchService",e);
- }
- if(INCLUDE_DEMO){
- Slog.i(TAG,"Installingdemodata...");
- (newDemoThread(context)).start();
- }
- try{
- Slog.i(TAG,"DropBoxService");
- ServiceManager.addService(Context.DROPBOX_SERVICE,
- newDropBoxManagerService(context,newFile("/data/system/dropbox")));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingDropBoxManagerService",e);
- }
- try{
- Slog.i(TAG,"WallpaperService");
- wallpaper=newWallpaperManagerService(context);
- ServiceManager.addService(Context.WALLPAPER_SERVICE,wallpaper);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingWallpaperService",e);
- }
- try{
- Slog.i(TAG,"AudioService");
- ServiceManager.addService(Context.AUDIO_SERVICE,newAudioService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingAudioService",e);
- }
- try{
- Slog.i(TAG,"HeadsetObserver");
- //Listenforwiredheadsetchanges
- headset=newHeadsetObserver(context);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingHeadsetObserver",e);
- }
- try{
- Slog.i(TAG,"DockObserver");
- //Listenfordockstationchanges
- dock=newDockObserver(context,power);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingDockObserver",e);
- }
- try{
- Slog.i(TAG,"USBService");
- //ListenforUSBchanges
- usb=newUsbService(context);
- ServiceManager.addService(Context.USB_SERVICE,usb);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingUsbService",e);
- }
- try{
- Slog.i(TAG,"UIModeManagerService");
- //ListenforUImodechanges
- uiMode=newUiModeManagerService(context);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingUiModeManagerService",e);
- }
- try{
- Slog.i(TAG,"BackupService");
- ServiceManager.addService(Context.BACKUP_SERVICE,
- newBackupManagerService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingBackupService",e);
- }
- try{
- Slog.i(TAG,"AppWidgetService");
- appWidget=newAppWidgetService(context);
- ServiceManager.addService(Context.APPWIDGET_SERVICE,appWidget);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingAppWidgetService",e);
- }
- try{
- Slog.i(TAG,"RecognitionService");
- recognition=newRecognitionManagerService(context);
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingRecognitionService",e);
- }
- try{
- Slog.i(TAG,"DiskStatsService");
- ServiceManager.addService("diskstats",newDiskStatsService(context));
- }catch(Throwablee){
- Slog.e(TAG,"FailurestartingDiskStatsService",e);
- }
- }
- //makesuretheADB_ENABLEDsettingvaluematchesthesecurepropertyvalue
- Settings.Secure.putInt(mContentResolver,Settings.Secure.ADB_ENABLED,
- "1".equals(SystemProperties.get("persist.service.adb.enable"))?1:0);
- //registerobservertolistenforsettingschanges
- mContentResolver.registerContentObserver(Settings.Secure.getUriFor(Settings.Secure.ADB_ENABLED),
- false,newAdbSettingsObserver());
- //Beforethingsstartrolling,besurewehavedecidedwhether
- //weareinsafemode.
- finalbooleansafeMode=wm.detectSafeMode();
- if(safeMode){
- try{
- ActivityManagerNative.getDefault().enterSafeMode();
- //PostthesafemodestateintheZygoteclass
- Zygote.systemInSafeMode=true;
- //DisabletheJITforthesystem_serverprocess
- VMRuntime.getRuntime().disableJitCompilation();
- }catch(RemoteExceptione){
- }
- }else{
- //EnabletheJITforthesystem_serverprocess
- VMRuntime.getRuntime().startJitCompilation();
- }
- //Itisnowtimetostartuptheappprocesses...
- if(devicePolicy!=null){
- devicePolicy.systemReady();
- }
- if(notification!=null){
- notification.systemReady();
- }
- if(statusBar!=null){
- statusBar.systemReady();
- }
- wm.systemReady();
- power.systemReady();
- try{
- pm.systemReady();
- }catch(RemoteExceptione){
- }
- //Theseareneededtopropagatetotherunnablebelow.
- finalStatusBarManagerServicestatusBarF=statusBar;
- finalBatteryServicebatteryF=battery;
- finalConnectivityServiceconnectivityF=connectivity;
- finalDockObserverdockF=dock;
- finalUsbServiceusbF=usb;
- finalThrottleServicethrottleF=throttle;
- finalUiModeManagerServiceuiModeF=uiMode;
- finalAppWidgetServiceappWidgetF=appWidget;
- finalWallpaperManagerServicewallpaperF=wallpaper;
- finalInputMethodManagerServiceimmF=imm;
- finalRecognitionManagerServicerecognitionF=recognition;
- finalLocationManagerServicelocationF=location;
- //Wenowtelltheactivitymanageritisokaytorunthirdparty
- //code.Itwillcallbackintousonceithasgottentothestate
- //wherethirdpartycodecanreallyrun(butbeforeithasactually
- //startedlaunchingtheinitialapplications),forustocompleteour
- //initialization.
- ((ActivityManagerService)ActivityManagerNative.getDefault())
- .systemReady(newRunnable(){
- publicvoidrun(){
- Slog.i(TAG,"Makingservicesready");
- if(statusBarF!=null)statusBarF.systemReady2();
- if(batteryF!=null)batteryF.systemReady();
- if(connectivityF!=null)connectivityF.systemReady();
- if(dockF!=null)dockF.systemReady();
- if(usbF!=null)usbF.systemReady();
- if(uiModeF!=null)uiModeF.systemReady();
- if(recognitionF!=null)recognitionF.systemReady();
- Watchdog.getInstance().start();
- //Itisnowokaytoletthevarioussystemservicesstarttheir
- //thirdpartycode...
- if(appWidgetF!=null)appWidgetF.systemReady(safeMode);
- if(wallpaperF!=null)wallpaperF.systemReady();
- if(immF!=null)immF.systemReady();
- if(locationF!=null)locationF.systemReady();
- if(throttleF!=null)throttleF.systemReady();
- }
- });
- //Fordebugbuilds,logeventloopstallstodropboxforanalysis.
- if(StrictMode.conditionallyEnableDebugLogging()){
- Slog.i(TAG,"EnabledStrictModeforsystemservermainthread.");
- }
- Looper.loop();
- Slog.d(TAG,"SystemServerThreadisexiting!");
- }
public void run() { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis()); Looper.prepare(); android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); BinderInternal.disableBackgroundScheduling(true); android.os.Process.setCanSelfBackground(false); // Check whether we failed to shut down last time we tried. { final String shutdownAction = SystemProperties.get( ShutdownThread.SHUTDOWN_ACTION_PROPERTY, ""); if (shutdownAction != null && shutdownAction.length() > 0) { boolean reboot = (shutdownAction.charAt(0) == '1'); final String reason; if (shutdownAction.length() > 1) { reason = shutdownAction.substring(1, shutdownAction.length()); } else { reason = null; } ShutdownThread.rebootOrShutdown(reboot, reason); } } String factoryTestStr = SystemProperties.get("ro.factorytest"); int factoryTest = "".equals(factoryTestStr) ? SystemServer.FACTORY_TEST_OFF : Integer.parseInt(factoryTestStr); LightsService lights = null; PowerManagerService power = null; BatteryService battery = null; ConnectivityService connectivity = null; IPackageManager pm = null; Context context = null; WindowManagerService wm = null; BluetoothService bluetooth = null; BluetoothA2dpService bluetoothA2dp = null; HeadsetObserver headset = null; DockObserver dock = null; UsbService usb = null; UiModeManagerService uiMode = null; RecognitionManagerService recognition = null; ThrottleService throttle = null; // Critical services... try { Slog.i(TAG, "Entropy Service"); ServiceManager.addService("entropy", new EntropyService()); Slog.i(TAG, "Power Manager"); power = new PowerManagerService(); ServiceManager.addService(Context.POWER_SERVICE, power); Slog.i(TAG, "Activity Manager"); context = ActivityManagerService.main(factoryTest); Slog.i(TAG, "Telephony Registry"); ServiceManager.addService("telephony.registry", new TelephonyRegistry(context)); AttributeCache.init(context); Slog.i(TAG, "Package Manager"); pm = PackageManagerService.main(context, factoryTest != SystemServer.FACTORY_TEST_OFF); ActivityManagerService.setSystemProcess(); mContentResolver = context.getContentResolver(); // The AccountManager must come before the ContentService try { Slog.i(TAG, "Account Manager"); ServiceManager.addService(Context.ACCOUNT_SERVICE, new AccountManagerService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting Account Manager", e); } Slog.i(TAG, "Content Manager"); ContentService.main(context, factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL); Slog.i(TAG, "System Content Providers"); ActivityManagerService.installSystemProviders(); Slog.i(TAG, "Battery Service"); battery = new BatteryService(context); ServiceManager.addService("battery", battery); Slog.i(TAG, "Lights Service"); lights = new LightsService(context); Slog.i(TAG, "Vibrator Service"); ServiceManager.addService("vibrator", new VibratorService(context)); // only initialize the power service after we have started the // lights service, content providers and the battery service. power.init(context, lights, ActivityManagerService.getDefault(), battery); Slog.i(TAG, "Alarm Manager"); AlarmManagerService alarm = new AlarmManagerService(context); ServiceManager.addService(Context.ALARM_SERVICE, alarm); Slog.i(TAG, "Init Watchdog"); Watchdog.getInstance().init(context, battery, power, alarm, ActivityManagerService.self()); Slog.i(TAG, "Window Manager"); wm = WindowManagerService.main(context, power, factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL); ServiceManager.addService(Context.WINDOW_SERVICE, wm); ((ActivityManagerService)ServiceManager.getService("activity")) .setWindowManager(wm); // Skip Bluetooth if we have an emulator kernel // TODO: Use a more reliable check to see if this product should // support Bluetooth - see bug 988521 if (SystemProperties.get("ro.kernel.qemu").equals("1")) { Slog.i(TAG, "Registering null Bluetooth Service (emulator)"); ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, null); } else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) { Slog.i(TAG, "Registering null Bluetooth Service (factory test)"); ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, null); } else { Slog.i(TAG, "Bluetooth Service"); bluetooth = new BluetoothService(context); ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, bluetooth); bluetooth.initAfterRegistration(); bluetoothA2dp = new BluetoothA2dpService(context, bluetooth); ServiceManager.addService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE, bluetoothA2dp); int bluetoothOn = Settings.Secure.getInt(mContentResolver, Settings.Secure.BLUETOOTH_ON, 0); if (bluetoothOn > 0) { bluetooth.enable(); } } } catch (RuntimeException e) { Slog.e("System", "Failure starting core service", e); } DevicePolicyManagerService devicePolicy = null; StatusBarManagerService statusBar = null; InputMethodManagerService imm = null; AppWidgetService appWidget = null; NotificationManagerService notification = null; WallpaperManagerService wallpaper = null; LocationManagerService location = null; if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { try { Slog.i(TAG, "Device Policy"); devicePolicy = new DevicePolicyManagerService(context); ServiceManager.addService(Context.DEVICE_POLICY_SERVICE, devicePolicy); } catch (Throwable e) { Slog.e(TAG, "Failure starting DevicePolicyService", e); } try { Slog.i(TAG, "Status Bar"); statusBar = new StatusBarManagerService(context); ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar); } catch (Throwable e) { Slog.e(TAG, "Failure starting StatusBarManagerService", e); } try { Slog.i(TAG, "Clipboard Service"); ServiceManager.addService(Context.CLIPBOARD_SERVICE, new ClipboardService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting Clipboard Service", e); } try { Slog.i(TAG, "Input Method Service"); imm = new InputMethodManagerService(context, statusBar); ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm); } catch (Throwable e) { Slog.e(TAG, "Failure starting Input Manager Service", e); } try { Slog.i(TAG, "NetStat Service"); ServiceManager.addService("netstat", new NetStatService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting NetStat Service", e); } try { Slog.i(TAG, "NetworkManagement Service"); ServiceManager.addService( Context.NETWORKMANAGEMENT_SERVICE, NetworkManagementService.create(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting NetworkManagement Service", e); } try { Slog.i(TAG, "Connectivity Service"); connectivity = ConnectivityService.getInstance(context); ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity); } catch (Throwable e) { Slog.e(TAG, "Failure starting Connectivity Service", e); } try { Slog.i(TAG, "Throttle Service"); throttle = new ThrottleService(context); ServiceManager.addService( Context.THROTTLE_SERVICE, throttle); } catch (Throwable e) { Slog.e(TAG, "Failure starting ThrottleService", e); } try { Slog.i(TAG, "Accessibility Manager"); ServiceManager.addService(Context.ACCESSIBILITY_SERVICE, new AccessibilityManagerService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting Accessibility Manager", e); } try { /* * NotificationManagerService is dependant on MountService, * (for media / usb notifications) so we must start MountService first. */ Slog.i(TAG, "Mount Service"); ServiceManager.addService("mount", new MountService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting Mount Service", e); } try { Slog.i(TAG, "Notification Manager"); notification = new NotificationManagerService(context, statusBar, lights); ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification); } catch (Throwable e) { Slog.e(TAG, "Failure starting Notification Manager", e); } try { Slog.i(TAG, "Device Storage Monitor"); ServiceManager.addService(DeviceStorageMonitorService.SERVICE, new DeviceStorageMonitorService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting DeviceStorageMonitor service", e); } try { Slog.i(TAG, "Location Manager"); location = new LocationManagerService(context); ServiceManager.addService(Context.LOCATION_SERVICE, location); } catch (Throwable e) { Slog.e(TAG, "Failure starting Location Manager", e); } try { Slog.i(TAG, "Search Service"); ServiceManager.addService(Context.SEARCH_SERVICE, new SearchManagerService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting Search Service", e); } if (INCLUDE_DEMO) { Slog.i(TAG, "Installing demo data..."); (new DemoThread(context)).start(); } try { Slog.i(TAG, "DropBox Service"); ServiceManager.addService(Context.DROPBOX_SERVICE, new DropBoxManagerService(context, new File("/data/system/dropbox"))); } catch (Throwable e) { Slog.e(TAG, "Failure starting DropBoxManagerService", e); } try { Slog.i(TAG, "Wallpaper Service"); wallpaper = new WallpaperManagerService(context); ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper); } catch (Throwable e) { Slog.e(TAG, "Failure starting Wallpaper Service", e); } try { Slog.i(TAG, "Audio Service"); ServiceManager.addService(Context.AUDIO_SERVICE, new AudioService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting Audio Service", e); } try { Slog.i(TAG, "Headset Observer"); // Listen for wired headset changes headset = new HeadsetObserver(context); } catch (Throwable e) { Slog.e(TAG, "Failure starting HeadsetObserver", e); } try { Slog.i(TAG, "Dock Observer"); // Listen for dock station changes dock = new DockObserver(context, power); } catch (Throwable e) { Slog.e(TAG, "Failure starting DockObserver", e); } try { Slog.i(TAG, "USB Service"); // Listen for USB changes usb = new UsbService(context); ServiceManager.addService(Context.USB_SERVICE, usb); } catch (Throwable e) { Slog.e(TAG, "Failure starting UsbService", e); } try { Slog.i(TAG, "UI Mode Manager Service"); // Listen for UI mode changes uiMode = new UiModeManagerService(context); } catch (Throwable e) { Slog.e(TAG, "Failure starting UiModeManagerService", e); } try { Slog.i(TAG, "Backup Service"); ServiceManager.addService(Context.BACKUP_SERVICE, new BackupManagerService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting Backup Service", e); } try { Slog.i(TAG, "AppWidget Service"); appWidget = new AppWidgetService(context); ServiceManager.addService(Context.APPWIDGET_SERVICE, appWidget); } catch (Throwable e) { Slog.e(TAG, "Failure starting AppWidget Service", e); } try { Slog.i(TAG, "Recognition Service"); recognition = new RecognitionManagerService(context); } catch (Throwable e) { Slog.e(TAG, "Failure starting Recognition Service", e); } try { Slog.i(TAG, "DiskStats Service"); ServiceManager.addService("diskstats", new DiskStatsService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting DiskStats Service", e); } } // make sure the ADB_ENABLED setting value matches the secure property value Settings.Secure.putInt(mContentResolver, Settings.Secure.ADB_ENABLED, "1".equals(SystemProperties.get("persist.service.adb.enable")) ? 1 : 0); // register observer to listen for settings changes mContentResolver.registerContentObserver(Settings.Secure.getUriFor(Settings.Secure.ADB_ENABLED), false, new AdbSettingsObserver()); // Before things start rolling, be sure we have decided whether // we are in safe mode. final boolean safeMode = wm.detectSafeMode(); if (safeMode) { try { ActivityManagerNative.getDefault().enterSafeMode(); // Post the safe mode state in the Zygote class Zygote.systemInSafeMode = true; // Disable the JIT for the system_server process VMRuntime.getRuntime().disableJitCompilation(); } catch (RemoteException e) { } } else { // Enable the JIT for the system_server process VMRuntime.getRuntime().startJitCompilation(); } // It is now time to start up the app processes... if (devicePolicy != null) { devicePolicy.systemReady(); } if (notification != null) { notification.systemReady(); } if (statusBar != null) { statusBar.systemReady(); } wm.systemReady(); power.systemReady(); try { pm.systemReady(); } catch (RemoteException e) { } // These are needed to propagate to the runnable below. final StatusBarManagerService statusBarF = statusBar; final BatteryService batteryF = battery; final ConnectivityService connectivityF = connectivity; final DockObserver dockF = dock; final UsbService usbF = usb; final ThrottleService throttleF = throttle; final UiModeManagerService uiModeF = uiMode; final AppWidgetService appWidgetF = appWidget; final WallpaperManagerService wallpaperF = wallpaper; final InputMethodManagerService immF = imm; final RecognitionManagerService recognitionF = recognition; final LocationManagerService locationF = location; // We now tell the activity manager it is okay to run third party // code. It will call back into us once it has gotten to the state // where third party code can really run (but before it has actually // started launching the initial applications), for us to complete our // initialization. ((ActivityManagerService)ActivityManagerNative.getDefault()) .systemReady(new Runnable() { public void run() { Slog.i(TAG, "Making services ready"); if (statusBarF != null) statusBarF.systemReady2(); if (batteryF != null) batteryF.systemReady(); if (connectivityF != null) connectivityF.systemReady(); if (dockF != null) dockF.systemReady(); if (usbF != null) usbF.systemReady(); if (uiModeF != null) uiModeF.systemReady(); if (recognitionF != null) recognitionF.systemReady(); Watchdog.getInstance().start(); // It is now okay to let the various system services start their // third party code... if (appWidgetF != null) appWidgetF.systemReady(safeMode); if (wallpaperF != null) wallpaperF.systemReady(); if (immF != null) immF.systemReady(); if (locationF != null) locationF.systemReady(); if (throttleF != null) throttleF.systemReady(); } }); // For debug builds, log event loop stalls to dropbox for analysis. if (StrictMode.conditionallyEnableDebugLogging()) { Slog.i(TAG, "Enabled StrictMode for system server main thread."); } Looper.loop(); Slog.d(TAG, "System ServerThread is exiting!"); }
这里启动的没一个进程都作为一个Dalvik线程而存在于SystemServer进程里面。
更多相关文章
- android滑屏两三事
- Android使用ksoap2调用C#webservice体会
- Android之ActivityManagerService浅谈
- Android(安卓)代码混淆
- Android(安卓)屏幕的旋转 onConfigurationChanged方法
- 【转】android AsyncTask 为 多任务 多线程 解决方案
- Android(安卓)Context原理分析
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用