android源码学习目录
1.main函数
直接上代码
public static void main(String[] args) {
new SystemServer().run(); //main函数直接创建类并运行run函数,比较直接。
}
private void run() {
try {
if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
Slog.w(TAG, "System clock is before 1970; setting to 1970.");
SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); //设置系统当前时间。
}
String timezoneProperty = SystemProperties.get("persist.sys.timezone");
if (timezoneProperty == null || timezoneProperty.isEmpty()) {
Slog.w(TAG, "Timezone not set; setting to GMT.");
SystemProperties.set("persist.sys.timezone", "GMT"); //设置关于时间的参数
}
//设置系统配置环境,包括语言,国家等
if (!SystemProperties.get("persist.sys.language").isEmpty()) {
final String languageTag = Locale.getDefault().toLanguageTag();
SystemProperties.set("persist.sys.locale", languageTag);
SystemProperties.set("persist.sys.language", "");
SystemProperties.set("persist.sys.country", "");
SystemProperties.set("persist.sys.localevar", "");
}
.... //这里代码忽略,进行了很多环境的设置,现阶段不用了解
Looper.prepareMainLooper(); // ① 准备loop主线程
// Initialize native services.
System.loadLibrary("android_servers"); // ② 加载系统动态libandroid_servers.so,
// ③ 创建系统的context
createSystemContext();
// ④ Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
} finally {
traceEnd(); // InitBeforeStartServices
}
// Start services.
try {
traceBeginAndSlog("StartServices");
//⑤ 开启系统的各种服务
startBootstrapServices();
startCoreServices();
startOtherServices();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
....
// Loop forever.
Looper.loop(); // ⑥开始loop循环
throw new RuntimeException("Main thread loop unexpectedly exited");
}
阅读代码,SystemServer main函数进行了各种参数的设置,并进行了很多重要的工作。
- 代码1处:准备了SystemServer线程的loop,这处很重要,他是Android运行的重要组件。
- 代码2处:加载C++的动态库。
- 代码3处:出现systemserver的context,这个context就是全局的上下文,它会对传入各种服务,下面会详细介绍
- 代码4处:创建了SystemServiceManager类对象,并进行了设置,它会启动Android中的各种服务。
- 代码5处:这里开启启动Android中的各种服务,后面会详细介绍
- 代码6处:开启loop循环,
开启loop循环后,SystemServer进程一直运行,保证后程序的正常运行,当然loop还有很多别的使用,这里不介绍,后一条代码抛出异常,就是loop循环停止的话,Android整个系统将无法运行,所以抛出异常。
2.启动服务
SystemServer进程中启动服务是关键的一部,Android中的各种服务是Android得以运行的基础。SystemServer对系统的服务的启动是使用SystemServiceManager来进行的,每个服务的启动过程都差不多。
startBootstrapServices();
startCoreServices();
startOtherServices();
- startBootstrapServices()中启动了ActivityManagerService、PowerManagerSrevice、PackageManagerService等服务。
- startCoreServices启动了DropBoxManagerService、BatteryService、UsageStatsService等。
- startOtherServices启动了CameraService、AlarmManagerService等。
Android系统的服务多打100多种,这里只介绍了比较重要的服务。
2.1 服务列表
部分服务名和功能
引导服务 | 功能 |
---|---|
Installer | 系统安装APK的一个服务类,启动完Installer才能启动其他系统服务 |
ActivityManagerService | 负责四大组件的启动,切换和调度 |
PowerManagerService | 负责系统关于power的计算,然后决策系统如何反应 |
LightsService | 管理和显示背光LED |
DisplayService | 用来管理所有显示设备 |
UserManagerService | 多用户模式管理 |
SensorService | 为系统提供的各种感应器服务 |
PackageManagerService | 用来对于apk安装,解析,删除,卸载等操作 |
核心服务 | 功能 |
---|---|
DropBoxManagerService | 用于生成和管理系统运行时的一些日志文件 |
BatteryService | 管理电池相关的服务 |
UsageService | 收集用户使用每个App的频率和时长 |
WebViewUpdateService | WebView更新服务 |
其他服务 | 功能 |
---|---|
CameraService | 摄像头相关服务 |
AlarmManagerService | 全局定时器管理服务 |
InputManagerService | 管理输入事件 |
WindowManagerService | 窗口管理服务 |
VrManagerService | VR模式管理服务 |
BluetoothService | 蓝牙管理服务 |
NotificationManagerService | 通知管理服务 |
DeviceStorageMonitorService | 存储相关服务 |
LocationManagerService | 定位管理服务 |
AudioService | 音频管理服务 |
2.2 服务的启动
各种服务的启动后续会详细介绍,这里介绍一下代码较少,便于理解的PowerManagerService。
// startBootstrapServices()函数中的代码。
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
//framework/base/services/core/java/com/android/server/SystemServiceManager.java
public T startService(Class serviceClass) {
try {
.....
final T service;
try {
//更具反射找到参数为Context的构造方法
Constructor constructor = serviceClass.getConstructor(Context.class);
//通过反射更具找到的构造方法,初始化类对象,这里我们知道这个对象为PowerManagerService
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
.......
}
//执行StartService函数
startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void startService(@NonNull final SystemService service) {
// 将服务注册到管理列表
mServices.add(service);
// 启动服务
try {
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
}
这里的代码是SystemServiceManager里的代码,它启动了这个服务,可以看到SystemServiceManager利用反射找到PowerManagerService的构造方法,进行初始化对象,并注册保存了这个对象,在service.OnStart()启动了了自己。
2.3 其他启动方式
2.2是绝大多数服务的启动方式,但也有不同的启动方式,eg:PackageManagerService
// startBootstrapServices函数中代码
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
//PackageManagerService main函数
public static PackageManagerService main(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
//创建PackagemanagerService
PackageManagerService m = new PackageManagerService(context, installer,
factoryTest, onlyCore);
m.enableSystemUserPackages();
//添加服务到服务列表
ServiceManager.addService("package", m);
return m;
}
这是服务的另一种启动方式,它直接执行了服务的main函数。
3. SystemServiceManager、ServiceManager 、 LocalServices
- SystemServiceManager:上面已经介绍过,它进行了服务的启动,并将服务保存为一个列表。
- ServiceManager:这个也是服务保存的列表,但它保存了一个map
他是提共不同进程间获取服务的列表,通过它我们可以获取各个服务的IBinder在不同进程进行通信。private static HashMap
sCache = new HashMap (); - LocalServices: 这个通ServiceManager功能类似,但是他是负责进程内通信的,google页介绍这个类以后可能合并到SystemServiceManager, 因为SystemServiceManager页保存一个这儿样的列表,
4.后记
这里没有进行解析服务自己启动时要作什么,只介绍了服务是怎样启动的,后续对重要的服务会进行详细的介绍。