2.创建system_service进程
在init进程的启动过程中,比较重要的部分由孵化进程启动system_service进程,下面详细介绍一下这个部分。system_service进程将会为我们创建一些重要的Android核心服务,包括ActivityManagerService,PackageManagerService和PowerManagerService等,这些将成为应用程序的基础,并为应用程序提供必要的接口。
①创建流程
完成应用程序的初始化之后,init进程将创建一个名叫system_service的重要进程,而我们将在此进程中创建Android核心服务。下图显示了system_process进程以及核心服务的创建过程。
注解1:init进程会按顺序启动各种类型的服务(包括core和main)。首先启动core类型的服务。然后启动main类型的服务。由于孵化服务为main类型,所以它会在core类型的服务之后启动。因此,这里启动用于管理服务的服务——servicemanager。启动和入口如下所示。
❶启动:service zygote /system/bin/app_process -Xzygote /system/bin --zygote--start-system-server
❷入口:/frameworks/base/cmds/app_process/app_main.cpp的main()函数。
注解2:此时转向/frameworks/base/core/jni/AndroidRuntime.cpp的start()函数。
注解3:启动代码如下:
jmethodId startMeth=env->GetStaticMethodID(startClass,"main",....); env->CallStaticVoidMethod(startClass,startMeth,strArray);
此时转向com.android.internal.os.ZygoteInit的main()方法执行。
注解4:
❶加载frameworks下的preloaded-classes类。
❷加载framework-res.apk下的资源。
注解5:孵化进程的主要目的就是孵化出system_process进程,这个时候流程将转向/frameworks/base/services/java/com/android/server/SystemServer.java的main()方法执行,而自身进入死循环成为守护进程。
注解6:init1()调用本地android_server_SystemServer_init1(/frameworks/base/services/jni/com_android_server_SystemServer.cpp)后,通过libAndroid_servers.So的system_init()函数启动两个服务并启动init2()、
注解7:这里启动并注册剩余的必需服务(比如包服务和Activity服务等)。最终会启动Launcher来到桌面,至此整个启动过程完成。
②system_service简介
system_service进程非常重要,它创建了许多重要的服务,那么如何加入system_service中并接受管理呢?具体如下面的代码所示:
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); }
以上代码展示了system_process如何将备份服务加入服务管理器中的,其中粗体部分的代码完成了两件事情:第一,创建备份服务;第二,使用ServiceManager的addService()方法将创建出来的备份服务实例加入服务管理器中加以管理。
下表列出了system_service的服务关键字等知识。
服务关键字 |
类 | 备注 |
entropy | EntropyService | 熵服务 |
power | PowerManagerService | 电源管理服务(Context.POWER_SERVICE) |
activity | ActivityManagerService | Activity管理服务 |
telephony.registry | TelephonyRegistry | 电话服务 |
package | PackageManagerService | 包管理服务 |
account | AccountManagerService | 账户管理服务(Context.ACCOUT_SERVICE) |
battery | BatteryService | 电池服务 |
vibrator | VibratorService | 振动服务 |
alarm | AlarmManagerService | 报警服务(Context.ALARM_SERVICE) |
window | WindowManagerService | 窗口服务(Context.WINDOW_SERVICE) |
bluetooth | BluetoothService | 蓝牙服务(BluetoothAdapter.BLUETOOTH_SERVICE) |
statusbar | StatusBarManagerService | 状态栏服务(Context.STATUS_BAR_SERVICE) |
input_method | InputMethodManagerService | 输入法管理服务(Context.INPUT_METHOD_SERVICE) |
location | LocationManagerService | 位置管理服务(Context.LOCATION_SERVICE) |
wallpaper | WallpaperManagerService | 壁纸管理服务(Context.WALLPAPER_SERVICE) |
audio | AudioService | 声音服务(Context.AUDIO_SERVICE) |
user | UserManagerService | 用户管理服务(Context.USER_SERVICE) |
下面以获取声音服务为例介绍获取服务的方法:
AudioService as=(AudioService)context.getSystemService(Context.AUDIO_SERVICE);
此时整个系统也就完成了启动工作,这也意味着我们可以开始使用Android设备了。