android8.1启动过程 SystemServer 下
Posted we1less
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android8.1启动过程 SystemServer 下相关的知识,希望对你有一定的参考价值。
SystemServer进程被创建后
1.启动Binder线程池 这样就可以与其他进程进行通信
2.创建SystemServiceManager,用于对系统的服务进行创建、启动和声明周期管理
3.启动各种系统服务
上一篇文章说到调用到了"com.android.server.SystemServer"的main方法 frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
run() frameworks/base/services/java/com/android/server/SystemServer.java
接下来分析run方法中的代码
// The system server should never make non-oneway calls
Binder.setWarnOnBlocking(true);
这句话主要是用来设置 Binder调用时候 设置oneway 如果在系统进程发生阻塞那么发出警告如果在此进程中生成任何阻塞绑定器事务,则发出警告。这通常只对系统进程有用,以阻止调用外部不受信任代码。
run() frameworks/base/services/java/com/android/server/SystemServer.java
Looper.prepareMainLooper();
这里4两个链接
https://blog.csdn.net/u014292433/article/details/22445293?spm=1001.2014.3001.5501
https://blog.csdn.net/u014292433/article/details/22480983?spm=1001.2014.3001.5501
run() frameworks/base/services/java/com/android/server/SystemServer.java
System.loadLibrary("android_servers");
加载so库 查找一下看看代码在哪
godv@godv-OptiPlex-7070:~/godv/AOSP/android-8.1.0_r1/frameworks$ grep "android_servers" ./ -rn
./base/services/Android.mk:68:LOCAL_MODULE:= libandroid_servers
./base/services/java/com/android/server/SystemServer.java:367: System.loadLibrary("android_servers");
Android.mk AOSP/frameworks/base/services/Android.mk
# native library
# =============================================================
include $(CLEAR_VARS)
LOCAL_SRC_FILES :=
LOCAL_SHARED_LIBRARIES :=
# include all the jni subdirs to collect their sources
include $(wildcard $(LOCAL_PATH)/*/jni/Android.mk)
LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES -DGL_GLEXT_PROTOTYPES
LOCAL_MODULE:= libandroid_servers
include $(BUILD_SHARED_LIBRARY)
就是包含在这个路径下的 所有模块中带有jni的mk都包含进来了
run() frameworks/base/services/java/com/android/server/SystemServer.java
创建系统上下文
// Initialize the system context.
createSystemContext();
创建SystemServiceManager 会对系统服务进行创建、启动、和生命周期管理
run() frameworks/base/services/java/com/android/server/SystemServer.java
// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
run() frameworks/base/services/java/com/android/server/SystemServer.java
把刚创建的 SystemServiceManager存到LocalServices中
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
run() frameworks/base/services/java/com/android/server/SystemServer.java
启动引导服务 在这个方法中利用 创建的SystemServiceManager启动了ActivityManagerService、PowerManagerService、PackageManagerService等服务
startBootstrapServices();
1.启动系统服务使用 mSystemServiceManager.startService 来启动
这里以启动ActivityManagerService为例
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
调用了startService其中在注释环节已经提示这个类必须是SystemService的子类
对传递进来的class进行实例化并且调用startService方法
startService() frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
被启动的service(例如ActivityManagerService) 需要使用自身内部一个继承自SystemService的内部类(以下简称内部类)
利用SystemServiceManager(上文初始化过)对象 调用startService方法传递进去Class对象
此时这个对象(内部类)被存放在SystemServiceManager的mServices成员变量中 这个变量为一个ArrayList
// Services that should receive lifecycle events.
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
/**
* Creates and starts a system service. The class must be a subclass of
* {@link com.android.server.SystemService}.
* ...
*/
@SuppressWarnings("unchecked")
public <T extends SystemService> T startService(Class<T> serviceClass) {
...
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
...
startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart();
} catch (RuntimeException ex) {
...
}
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
mService.start();
}
@Override
public void onCleanupUser(int userId) {
mService.mBatteryStatsService.onCleanupUser(userId);
}
public ActivityManagerService getService() {
return mService;
}
}
mService = new ActivityManagerService(context); 这块实际上就是new出来binder的通信类
private void start() {
...
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
...
}
run() frameworks/base/services/java/com/android/server/SystemServer.java
为系统进程设置应用程序实例并开始
// Set up the Application instance for the system process and get started.
traceBeginAndSlog("SetSystemProcess");
mActivityManagerService.setSystemProcess();
setSystemProcess() frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
程序在这个时候把创建好的ActivityManagerService放入ServiceManager这样第三方应用就可以利用跨进程通信调用到了
public void setSystemProcess() {
try {
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
ServiceManager.addService("meminfo", new MemBinder(this));
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
ServiceManager.addService("dbinfo", new DbBinder(this));
...
}
对于这个服务可以使用 service list 命令查看
generic_x86_64:/ # service list | grep activity
91 activity: [android.app.IActivityManager]
2.启动系统服务使用PackageManagerService.main调用
这里以PackageManagerService为例 最后也是调用了ServiceManager.addService
main() frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
public static PackageManagerService main(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
PackageManagerService m = new PackageManagerService(context, installer,
factoryTest, onlyCore);
m.enableSystemUserPackages();
ServiceManager.addService("package", m);
final PackageManagerNative pmn = m.new PackageManagerNative();
ServiceManager.addService("package_native", pmn);
return m;
}
run() frameworks/base/services/java/com/android/server/SystemServer.java
开启消息循环
// Loop forever.
Looper.loop();
最后介绍几个系统服务及其作用
引导服务 startBootstrapServices();
Installer 系统安装APK时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务
ActivityManagerService 负责四大组件的启动、切换、调度
PowerManagerService 计算系统中和Power相关的计算,然后决策系统应该如何反应
LightService 管理和显示背光LED
DisplayManagerService 用来管理所有的显示设备
UserManagerService 多用户模式管理
SensorService 为系统提供各种感应服务
PackageManagerService 用来对apk进行安装、解析、删除、卸载等操作
...
核心服务 startCoreServices();
DropBoxManagerService 用于生成和管理系统运行时的一些日志文件
BatteryService 管理电池相关的服务
UsageStatsService 收集用户使用每一个APP的频率、使用时长
WebViewUpdateService WebView更新服务
其他服务 startOtherServices();
CameraService 摄像头相关服务
Audioservice 音频相关管理服务
BluetoothService 蓝牙管理服务
InputManagerService 管理输入事件
WindowsManagerService 窗口管理服务
LocationManagerService 定位管理服务
DeviceStorageMonitorService 存储相关管理服务
NotificationManagerService 通知管理服务
VrManagerService VR模式管理服务
AlarmManagerService 全局定时器管理服务
...
以上是关于android8.1启动过程 SystemServer 下的主要内容,如果未能解决你的问题,请参考以下文章