SystemServer.java revision f18a01c77e78209b74e34d05cfb352fa4a92db5f
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 com.android.server.am.ActivityManagerService;
20import com.android.server.status.StatusBarService;
21import com.android.internal.os.SamplingProfilerIntegration;
22
23import dalvik.system.VMRuntime;
24
25import android.app.ActivityManagerNative;
26import android.bluetooth.BluetoothAdapter;
27import android.content.ComponentName;
28import android.content.ContentResolver;
29import android.content.ContentService;
30import android.content.Context;
31import android.content.Intent;
32import android.content.pm.IPackageManager;
33import android.database.ContentObserver;
34import android.database.Cursor;
35import android.media.AudioService;
36import android.os.*;
37import android.provider.Contacts.People;
38import android.provider.Settings;
39import android.server.BluetoothA2dpService;
40import android.server.BluetoothService;
41import android.server.search.SearchManagerService;
42import android.util.EventLog;
43import android.util.Log;
44import android.accounts.AccountManagerService;
45
46import java.io.File;
47import java.util.Timer;
48import java.util.TimerTask;
49
50class ServerThread extends Thread {
51    private static final String TAG = "SystemServer";
52    private final static boolean INCLUDE_DEMO = false;
53
54    private static final int LOG_BOOT_PROGRESS_SYSTEM_RUN = 3010;
55
56    private ContentResolver mContentResolver;
57
58    private class AdbSettingsObserver extends ContentObserver {
59        public AdbSettingsObserver() {
60            super(null);
61        }
62        @Override
63        public void onChange(boolean selfChange) {
64            boolean enableAdb = (Settings.Secure.getInt(mContentResolver,
65                Settings.Secure.ADB_ENABLED, 0) > 0);
66            // setting this secure property will start or stop adbd
67           SystemProperties.set("persist.service.adb.enable", enableAdb ? "1" : "0");
68        }
69    }
70
71    @Override
72    public void run() {
73        EventLog.writeEvent(LOG_BOOT_PROGRESS_SYSTEM_RUN,
74            SystemClock.uptimeMillis());
75
76        ActivityManagerService.prepareTraceFile(false);     // create dir
77
78        Looper.prepare();
79
80        android.os.Process.setThreadPriority(
81                android.os.Process.THREAD_PRIORITY_FOREGROUND);
82
83        String factoryTestStr = SystemProperties.get("ro.factorytest");
84        int factoryTest = "".equals(factoryTestStr) ? SystemServer.FACTORY_TEST_OFF
85                : Integer.parseInt(factoryTestStr);
86
87        HardwareService hardware = null;
88        PowerManagerService power = null;
89        BatteryService battery = null;
90        ConnectivityService connectivity = null;
91        IPackageManager pm = null;
92        Context context = null;
93        WindowManagerService wm = null;
94        BluetoothService bluetooth = null;
95        BluetoothA2dpService bluetoothA2dp = null;
96        HeadsetObserver headset = null;
97        DockObserver dock = null;
98
99        // Critical services...
100        try {
101            Log.i(TAG, "Entropy Service");
102            ServiceManager.addService("entropy", new EntropyService());
103
104            Log.i(TAG, "Power Manager");
105            power = new PowerManagerService();
106            ServiceManager.addService(Context.POWER_SERVICE, power);
107
108            Log.i(TAG, "Activity Manager");
109            context = ActivityManagerService.main(factoryTest);
110
111            Log.i(TAG, "Telephony Registry");
112            ServiceManager.addService("telephony.registry", new TelephonyRegistry(context));
113
114            AttributeCache.init(context);
115
116            Log.i(TAG, "Package Manager");
117            pm = PackageManagerService.main(context,
118                    factoryTest != SystemServer.FACTORY_TEST_OFF);
119
120            ActivityManagerService.setSystemProcess();
121
122            mContentResolver = context.getContentResolver();
123
124            // The AccountManager must come before the ContentService
125            try {
126                Log.i(TAG, "Account Manager");
127                ServiceManager.addService(Context.ACCOUNT_SERVICE,
128                        new AccountManagerService(context));
129            } catch (Throwable e) {
130                Log.e(TAG, "Failure starting Account Manager", e);
131            }
132
133            Log.i(TAG, "Content Manager");
134            ContentService.main(context,
135                    factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL);
136
137            Log.i(TAG, "System Content Providers");
138            ActivityManagerService.installSystemProviders();
139
140            Log.i(TAG, "Battery Service");
141            battery = new BatteryService(context);
142            ServiceManager.addService("battery", battery);
143
144            Log.i(TAG, "Hardware Service");
145            hardware = new HardwareService(context);
146            ServiceManager.addService("hardware", hardware);
147
148            // only initialize the power service after we have started the
149            // hardware service, content providers and the battery service.
150            power.init(context, hardware, ActivityManagerService.getDefault(), battery);
151
152            Log.i(TAG, "Alarm Manager");
153            AlarmManagerService alarm = new AlarmManagerService(context);
154            ServiceManager.addService(Context.ALARM_SERVICE, alarm);
155
156            Log.i(TAG, "Init Watchdog");
157            Watchdog.getInstance().init(context, battery, power, alarm,
158                    ActivityManagerService.self());
159
160            // Sensor Service is needed by Window Manager, so this goes first
161            Log.i(TAG, "Sensor Service");
162            ServiceManager.addService(Context.SENSOR_SERVICE, new SensorService(context));
163
164            Log.i(TAG, "Window Manager");
165            wm = WindowManagerService.main(context, power,
166                    factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL);
167            ServiceManager.addService(Context.WINDOW_SERVICE, wm);
168
169            ((ActivityManagerService)ServiceManager.getService("activity"))
170                    .setWindowManager(wm);
171
172            // Skip Bluetooth if we have an emulator kernel
173            // TODO: Use a more reliable check to see if this product should
174            // support Bluetooth - see bug 988521
175            if (SystemProperties.get("ro.kernel.qemu").equals("1")) {
176                Log.i(TAG, "Registering null Bluetooth Service (emulator)");
177                ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, null);
178            } else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
179                Log.i(TAG, "Registering null Bluetooth Service (factory test)");
180                ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, null);
181            } else {
182                Log.i(TAG, "Bluetooth Service");
183                bluetooth = new BluetoothService(context);
184                ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, bluetooth);
185                bluetooth.initAfterRegistration();
186                bluetoothA2dp = new BluetoothA2dpService(context, bluetooth);
187                ServiceManager.addService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE,
188                                          bluetoothA2dp);
189
190                int bluetoothOn = Settings.Secure.getInt(mContentResolver,
191                    Settings.Secure.BLUETOOTH_ON, 0);
192                if (bluetoothOn > 0) {
193                    bluetooth.enable();
194                }
195            }
196
197        } catch (RuntimeException e) {
198            Log.e("System", "Failure starting core service", e);
199        }
200
201        StatusBarService statusBar = null;
202        InputMethodManagerService imm = null;
203        AppWidgetService appWidget = null;
204        NotificationManagerService notification = null;
205        WallpaperManagerService wallpaper = null;
206
207        if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
208            try {
209                Log.i(TAG, "Status Bar");
210                statusBar = new StatusBarService(context);
211                ServiceManager.addService("statusbar", statusBar);
212            } catch (Throwable e) {
213                Log.e(TAG, "Failure starting StatusBarService", e);
214            }
215
216            try {
217                Log.i(TAG, "Clipboard Service");
218                ServiceManager.addService("clipboard", new ClipboardService(context));
219            } catch (Throwable e) {
220                Log.e(TAG, "Failure starting Clipboard Service", e);
221            }
222
223            try {
224                Log.i(TAG, "Input Method Service");
225                imm = new InputMethodManagerService(context, statusBar);
226                ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm);
227            } catch (Throwable e) {
228                Log.e(TAG, "Failure starting Input Manager Service", e);
229            }
230
231            try {
232                Log.i(TAG, "NetStat Service");
233                ServiceManager.addService("netstat", new NetStatService(context));
234            } catch (Throwable e) {
235                Log.e(TAG, "Failure starting NetStat Service", e);
236            }
237
238            try {
239                Log.i(TAG, "Connectivity Service");
240                connectivity = ConnectivityService.getInstance(context);
241                ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
242            } catch (Throwable e) {
243                Log.e(TAG, "Failure starting Connectivity Service", e);
244            }
245
246            try {
247              Log.i(TAG, "Accessibility Manager");
248              ServiceManager.addService(Context.ACCESSIBILITY_SERVICE,
249                      new AccessibilityManagerService(context));
250            } catch (Throwable e) {
251              Log.e(TAG, "Failure starting Accessibility Manager", e);
252            }
253
254            try {
255                Log.i(TAG, "Notification Manager");
256                notification = new NotificationManagerService(context, statusBar, hardware);
257                ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification);
258            } catch (Throwable e) {
259                Log.e(TAG, "Failure starting Notification Manager", e);
260            }
261
262            try {
263                // MountService must start after NotificationManagerService
264                Log.i(TAG, "Mount Service");
265                ServiceManager.addService("mount", new MountService(context));
266            } catch (Throwable e) {
267                Log.e(TAG, "Failure starting Mount Service", e);
268            }
269
270            try {
271                Log.i(TAG, "Device Storage Monitor");
272                ServiceManager.addService(DeviceStorageMonitorService.SERVICE,
273                        new DeviceStorageMonitorService(context));
274            } catch (Throwable e) {
275                Log.e(TAG, "Failure starting DeviceStorageMonitor service", e);
276            }
277
278            try {
279                Log.i(TAG, "Location Manager");
280                ServiceManager.addService(Context.LOCATION_SERVICE, new LocationManagerService(context));
281            } catch (Throwable e) {
282                Log.e(TAG, "Failure starting Location Manager", e);
283            }
284
285            try {
286                Log.i(TAG, "Search Service");
287                ServiceManager.addService( Context.SEARCH_SERVICE, new SearchManagerService(context) );
288            } catch (Throwable e) {
289                Log.e(TAG, "Failure starting Search Service", e);
290            }
291
292            if (INCLUDE_DEMO) {
293                Log.i(TAG, "Installing demo data...");
294                (new DemoThread(context)).start();
295            }
296
297            try {
298                Log.i(TAG, "DropBox Service");
299                ServiceManager.addService(Context.DROPBOX_SERVICE,
300                        new DropBoxManagerService(context, new File("/data/system/dropbox")));
301            } catch (Throwable e) {
302                Log.e(TAG, "Failure starting DropBoxManagerService", e);
303            }
304
305            try {
306                Log.i(TAG, "Checkin Service");
307                Intent intent = new Intent().setComponent(new ComponentName(
308                        "com.google.android.server.checkin",
309                        "com.google.android.server.checkin.CheckinService"));
310                if (context.startService(intent) == null) {
311                    Log.w(TAG, "Using fallback Checkin Service.");
312                    ServiceManager.addService("checkin", new FallbackCheckinService(context));
313                }
314            } catch (Throwable e) {
315                Log.e(TAG, "Failure starting Checkin Service", e);
316            }
317
318            try {
319                Log.i(TAG, "Wallpaper Service");
320                wallpaper = new WallpaperManagerService(context);
321                ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper);
322            } catch (Throwable e) {
323                Log.e(TAG, "Failure starting Wallpaper Service", e);
324            }
325
326            try {
327                Log.i(TAG, "Audio Service");
328                ServiceManager.addService(Context.AUDIO_SERVICE, new AudioService(context));
329            } catch (Throwable e) {
330                Log.e(TAG, "Failure starting Audio Service", e);
331            }
332
333            try {
334                Log.i(TAG, "Headset Observer");
335                // Listen for wired headset changes
336                headset = new HeadsetObserver(context);
337            } catch (Throwable e) {
338                Log.e(TAG, "Failure starting HeadsetObserver", e);
339            }
340
341            try {
342                Log.i(TAG, "Dock Observer");
343                // Listen for dock station changes
344                dock = new DockObserver(context, power);
345            } catch (Throwable e) {
346                Log.e(TAG, "Failure starting DockObserver", e);
347            }
348
349            try {
350                Log.i(TAG, "Backup Service");
351                ServiceManager.addService(Context.BACKUP_SERVICE, new BackupManagerService(context));
352            } catch (Throwable e) {
353                Log.e(TAG, "Failure starting Backup Service", e);
354            }
355
356            try {
357                Log.i(TAG, "AppWidget Service");
358                appWidget = new AppWidgetService(context);
359                ServiceManager.addService(Context.APPWIDGET_SERVICE, appWidget);
360            } catch (Throwable e) {
361                Log.e(TAG, "Failure starting AppWidget Service", e);
362            }
363
364            try {
365                com.android.server.status.StatusBarPolicy.installIcons(context, statusBar);
366            } catch (Throwable e) {
367                Log.e(TAG, "Failure installing status bar icons", e);
368            }
369        }
370
371        // make sure the ADB_ENABLED setting value matches the secure property value
372        Settings.Secure.putInt(mContentResolver, Settings.Secure.ADB_ENABLED,
373                "1".equals(SystemProperties.get("persist.service.adb.enable")) ? 1 : 0);
374
375        // register observer to listen for settings changes
376        mContentResolver.registerContentObserver(Settings.Secure.getUriFor(Settings.Secure.ADB_ENABLED),
377                false, new AdbSettingsObserver());
378
379        // Before things start rolling, be sure we have decided whether
380        // we are in safe mode.
381        final boolean safeMode = wm.detectSafeMode();
382        if (safeMode) {
383            try {
384                ActivityManagerNative.getDefault().enterSafeMode();
385            } catch (RemoteException e) {
386            }
387        }
388
389        // It is now time to start up the app processes...
390
391        if (notification != null) {
392            notification.systemReady();
393        }
394
395        if (statusBar != null) {
396            statusBar.systemReady();
397        }
398        wm.systemReady();
399        power.systemReady();
400        try {
401            pm.systemReady();
402        } catch (RemoteException e) {
403        }
404
405        // These are needed to propagate to the runnable below.
406        final BatteryService batteryF = battery;
407        final ConnectivityService connectivityF = connectivity;
408        final DockObserver dockF = dock;
409        final AppWidgetService appWidgetF = appWidget;
410        final WallpaperManagerService wallpaperF = wallpaper;
411        final InputMethodManagerService immF = imm;
412
413        // We now tell the activity manager it is okay to run third party
414        // code.  It will call back into us once it has gotten to the state
415        // where third party code can really run (but before it has actually
416        // started launching the initial applications), for us to complete our
417        // initialization.
418        ((ActivityManagerService)ActivityManagerNative.getDefault())
419                .systemReady(new Runnable() {
420            public void run() {
421                Log.i(TAG, "Making services ready");
422
423                if (batteryF != null) batteryF.systemReady();
424                if (connectivityF != null) connectivityF.systemReady();
425                if (dockF != null) dockF.systemReady();
426                Watchdog.getInstance().start();
427
428                // It is now okay to let the various system services start their
429                // third party code...
430
431                if (appWidgetF != null) appWidgetF.systemReady(safeMode);
432                if (wallpaperF != null) wallpaperF.systemReady();
433                if (immF != null) immF.systemReady();
434            }
435        });
436
437        Looper.loop();
438        Log.d(TAG, "System ServerThread is exiting!");
439    }
440}
441
442class DemoThread extends Thread
443{
444    DemoThread(Context context)
445    {
446        mContext = context;
447    }
448
449    @Override
450    public void run()
451    {
452        try {
453            Cursor c = mContext.getContentResolver().query(People.CONTENT_URI, null, null, null, null);
454            boolean hasData = c != null && c.moveToFirst();
455            if (c != null) {
456                c.deactivate();
457            }
458            if (!hasData) {
459                DemoDataSet dataset = new DemoDataSet();
460                dataset.add(mContext);
461            }
462        } catch (Throwable e) {
463            Log.e("SystemServer", "Failure installing demo data", e);
464        }
465
466    }
467
468    Context mContext;
469}
470
471public class SystemServer
472{
473    private static final String TAG = "SystemServer";
474
475    public static final int FACTORY_TEST_OFF = 0;
476    public static final int FACTORY_TEST_LOW_LEVEL = 1;
477    public static final int FACTORY_TEST_HIGH_LEVEL = 2;
478
479    static Timer timer;
480    static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr
481
482    /**
483     * This method is called from Zygote to initialize the system. This will cause the native
484     * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back
485     * up into init2() to start the Android services.
486     */
487    native public static void init1(String[] args);
488
489    public static void main(String[] args) {
490        if (SamplingProfilerIntegration.isEnabled()) {
491            SamplingProfilerIntegration.start();
492            timer = new Timer();
493            timer.schedule(new TimerTask() {
494                @Override
495                public void run() {
496                    SamplingProfilerIntegration.writeSnapshot("system_server");
497                }
498            }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
499        }
500
501        // The system server has to run all of the time, so it needs to be
502        // as efficient as possible with its memory usage.
503        VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
504
505        System.loadLibrary("android_servers");
506        init1(args);
507    }
508
509    public static final void init2() {
510        Log.i(TAG, "Entered the Android system server!");
511        Thread thr = new ServerThread();
512        thr.setName("android.server.ServerThread");
513        thr.start();
514    }
515}
516