android SystemServer详解

文章出处:http://blog.csdn.net/shift_wwx


前言:在之前android systemserver启动详解中大概分析了一下systemserver的启动过程,可以很清晰的看到system_server进程是通过zygote fork()而来。那在SystemServer中做了些什么事情,结合code继续分析。


通过之前的分析,最终会通过ZygoteInit调用SystemServer.main()。

@/frameworks/base/services/java/com/android/server/SystemServer.java

    public static void main(String[] args) {

        /*
         * In case the runtime switched since last boot (such as when
         * the old runtime was removed in an OTA), set the system
         * property so that it is in sync. We can't do this in
         * libnativehelper's JniInvocation::Init code where we already
         * had to fallback to a different runtime because it is
         * running as root and we need to be the system user to set
         * the property. http://b/11463182
         */
        SystemProperties.set("persist.sys.dalvik.vm.lib",
                             VMRuntime.getRuntime().vmLibrary());

        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", null);
                }
            }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
        }

        // Mmmmmm... more memory!
        dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();

        // 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);

	Boolean hasMassStorage = SystemProperties.getBoolean("ro.has.mass.storage",false);
	if(hasMassStorage)
            Environment.setUserRequired(false);
	else
            Environment.setUserRequired(true);

        System.loadLibrary("android_servers");

    	if(SystemProperties.getBoolean("ro.app.optimization",false)){
    		System.loadLibrary("optimization");
    	}

        Slog.i(TAG, "Entered the Android system server!");

        // Initialize native services.
        if(!SystemProperties.getBoolean("config.disable_vibrator", false)) {
            nativeInit();
        }
        // This used to be its own separate thread, but now it is
        // just the loop we run on the main thread.
        ServerThread thr = new ServerThread();
        thr.initAndLoop();
    }
1、重新定义prop persist.sys.dalvik.vm.lib,为了防止上一次启动的时候经过特殊原因将这个值改变了

2、更改系统时间,SystemServer第一次起来之后,将系统时间默认设置为1970年,有个判断,会到RTC读当前系统时间,我们现在用的平台是没有RTC的,所以,系统起来之后都会设一遍。

3、dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();不知道是干嘛的,注释的意思貌似是说释放更多memory

4、VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

setTargetHeapUtilization(float newTarget) 可以设定内存利用率的百分比,当实际的利用率偏离这个百分比的时候,虚拟机会在GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。

平台起来之后关于heap一些prop:

1|root@HaierT866:/dev/socket # getprop | grep heap
[dalvik.vm.heapgrowthlimit]: [64m]
[dalvik.vm.heapmaxfree]: [8m]
[dalvik.vm.heapminfree]: [512k]
[dalvik.vm.heapsize]: [384m]
[dalvik.vm.heapstartsize]: [8m]
[dalvik.vm.heaptargetutilization]: [0.75]
5、nativeInit();

之前load 了android_servers这个native so,可以看一下source code。

@/frameworks/base/services/jni/com_android_server_SystemServer.cpp

static void android_server_SystemServer_nativeInit(JNIEnv* env, jobject clazz) {
    char propBuf[PROPERTY_VALUE_MAX];
    property_get("system_init.startsensorservice", propBuf, "1");
    if (strcmp(propBuf, "1") == 0) {
        // Start the sensor service
        SensorService::instantiate();
    }
}
初始化SensorService

6、thr.initAndLoop();

public void initAndLoop() {
    ......

    Looper.prepareMainLooper();
    android.os.Process.setThreadPriority(
            android.os.Process.THREAD_PRIORITY_FOREGROUND);


    ......

    Looper.loop();
    Slog.d(TAG, "System ServerThread is exiting!");
}
这个里面的code太长了,大概有1000多行。但是再长的code也不影响分析。

1)Looper.prepareMainLooper();

刚开始在进程中创建了一个Looper,详细关于looper、MessageQueue、handler可以参考Android异步消息处理线程之----Looper+MessageQueue+Handler

这里的MainLooper是不允许quit的,所以prepare的参数是false。

Looper准备好了,必定会有loop()出现的,函数的最后就出来了。

2)这里也关注一下THREAD_PRIORITY_FOREGROUND,thread的priority很高呀,不让kill的,了解kill memory机制应该知道,出现oom或者内存紧张的时候,会kill一些进程,就是按照process的优先级来的。

3)Installer,installd 的java类

平台起来之后ps:

root      177   1     1004   220   c057e4b8 b6f344e0 S /system/bin/installd
进程启动是在init.rc中:

service installd /system/bin/installd
    class main
    socket installd stream 600 system system
在Android系统中,PackageManagerService用于管理系统中的所有安装包信息及应用程序的安装卸载,但是应用程序的安装与卸载并非PackageManagerService来完成,而是通过PackageManagerService来访问installd服务来执行程序包的安装与卸载的。
对于installd讲解网上很多,这里暂时不过多分析。

4)PowerManagerService 电源管理服务

5)ActivityManagerService Android framework框架核心服务,管理整个框架中任务、进程管理, Intent解析等的核心实现,管理四大组建的生命周期。

6)DisplayManagerService 用于管理全局显示生命周期,决定在已连接的物理设备如何配置逻辑显示,并且通知系统和应用状态的改变。

7)TelephonyRegistry 提供电话注册、管理服务,可以获取电话的链接状态、信号强度等等。

8)SchedulingPolicyService 调度策略。

9)PackageManagerService Android framework框架核心服务,用于APK的解析、权限验证、安装等。

10)EntropyMixer

11)UserManagerService 用户管理

12)AccountManagerService Android账户服务,提供了对账户、密码、授权的集中管理。必须要在ContentService之前初始化

13)ContentService 内容服务,主要是数据库等提供解决方法的服务。

14)LightsService 光感应传感器服务。

15)BatteryService 负责监控电池的充电状态、电池电量、电压、温度等信息,当电池信息发生变化时,发生广播通知其他关系电池信息的进程和服务。

16)VibratorService 振动器服务

17)ConsumerIrService 远程控制,通过红外等控制周围的设备(例如电视等)

18)AlarmManagerService 提供闹铃和定时器等功能

19)GpioManagerService GPIO的服务

20)InputManagerService 以前在WindowManagerService中,现在独立了出来,用户处理事件分发。

21)InputMethodManagerService 输入法服务,打开和关闭输入法。

22)AccessibilityManagerService 辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果,View的点击、焦点等事件分发管理服。

23)MountService 磁盘加载服务程序,一般要和一个linux daemon程序如vold/mountd等合作起作用,主要负责监听并广播device的mount/unmount/badremoval等等事件。

24)LockSettingsService 和锁屏界面中的输入密码,手势等安全功能有关。可以保存每个user的相关锁屏信息

25)DevicePolicyManagerService 提供一些系统级别的设置及属性

26)StatusBarManagerService 状态栏。

27)ClipboardService 剪贴板服务

28)NetworkManagementService 网络管理服务。ANDROID 系统网络连接和管理服务由四个系统服务ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完成网络连接和管理功能。ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三个服务都通过INetworkManagementService接口跨进程访问NetworkManagementService服务,实现与网络接口的交互及信息读取。

29)TextServicesManagerService 文本服务,例如文本检查等。

30)NetworkStatsService 网络统计相关。

31)NetworkPolicyManagerService 维护网络使用策略。

32)WifiP2pService Wifi Direct服务。

33)WifiService Wifi服务

34)ConnectivityService 网络连接状态服务。

35)NsdService 网络服务搜索

36)UpdateLockService 

37)NotificationManagerService 通知服务

38)DeviceStorageMonitorService 存储空间监控

39)LocationManagerService 位置服务,GPS、定位等。

40)CountryDetectorService 检测用户国家

41)SearchManagerService 搜索服务

42)DropBoxManagerService 用于系统运行时日志的存储于管理。

43)WallpaperManagerService 壁纸管理服务

44)AudioService AudioFlinger的上层管理封装,主要是音量、音效、声道及铃声等的管理。

45)WiredAccessoryManager 监视手机和底座上的耳机

46)UsbService USB Host和device管理服务

47)SerialService 对串口的设备进行操作

48)TwilightService 指出用户当前所在位置是否为晚上,被UiModeManager等用来调整夜间模式。

49)UiModeManagerService 管理当前Android设备的夜间模式和行车模式.

50)AppWidgetService Android中提供Widget的管理和相关服务

51)RecognitionManagerService 身份识别相关

52)DiskStatsService 磁盘统计服务,供dumpsys使用

53)SamplingProfilerService 用于耗时统计等

54)NetworkTimeUpdateService 监视网络时间,当网络时间变化时更新本地时间。

55)CommonTimeManagementService 管理本地常见的时间服务的配置,在网络配置变化时重新配置本地服务。

56)DreamManagerService 屏幕保护

57)AssetAtlasService 负责将预加载的bitmap组装成纹理贴图,生成的纹理贴图可以被用来跨进程使用,以减少内存

58)IdleMaintenanceService 用于观察设备状态,在设备空闲时执行维护任务。将一些比较耗时的代价比较高的任务放到设备空闲时执行,这样保证用户的体验

59)PrintManagerService 打印服务

60)MediaRouterService 用于管理各个应用程序的多媒体播放的行为,wifiDisplay会用到


services后期会一个一个补充,service new出来后会通过ServiceManager.addService,统一管理。基本都是一些初始化工作,或者service之间需要依赖的。

最后,通过systemReady或者systemRunning来进一步的启动这些services。


61)Looper.loop(); 处理MessageQueue里的message


Over!

至此,将从init启动,到SystemServer启动都小结了一下,感觉轻松了很多,可是实际上,这才刚刚进入ANDROID世界,真正的android相关后期会持续补充。

zygote 相关博文:

(1)Android 的init过程详解

(2)android zygote之启动过程分析

(3)android systemserver启动详解

(4)android SystemServer详解







你可能感兴趣的:(android,SystemServer,Zygote)