第一部分: 创建AMS对象及启动服务
// file: frameworks\base\services\java\com\android\server\SystemServer.java
private void startBootstrapServices() {
...
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
...
// Now that the power manager has been started, let the activity manager
// initialize power management features.
traceBeginAndSlog("InitPowerManagement");
mActivityManagerService.initPowerManagement();
traceEnd();
...
// Set up the Application instance for the system process and get started.
traceBeginAndSlog("SetSystemProcess");
mActivityManagerService.setSystemProcess();
traceEnd();
...
时序图
这部分客制化情况较少,更多的是了解:启动过程中,加载了哪些文件?在开发中如何修改这些文件?利用了哪些系统可配置属性?
涉及文件:
- 进程状态文件目录/data/system/procstats目录
- 权限配置文件/data/system/appops.xml
- 关于activity、broadcast、service的intent规则目录:/data/system/ifw 或 /data/secure/system/ifw目录下
系统属性:
- R.bool.config_permissionReviewRequired,app启动过程中多次review权限合法性
- R.integer.config_radioScanningTimeout
- com.android.internal.R.xml.power_profile,获取电源配置策略文件
第二部分: 安装system provider
在startOtherServices中执行根据PackageManagerService安装apk解析出来的ContentProvider,AMS中加载system类型的provider并更新Setting中部分配置
// file:android-8.0.0_r1\frameworks\base\services\java\com\android\server\SystemServer.java
private void startOtherServices() {
...
traceBeginAndSlog("InstallSystemProviders");
mActivityManagerService.installSystemProviders();
traceEnd();
...
}
时序图
注意点:
- 系统对Settings.Global.ACTIVITY_MANAGER_CONSTANTS中的属性值变换进行监控
// file: android-8.0.0_r1\frameworks\base\core\java\android\provider\Settings.java
/**
* Activity manager specific settings.
* This is encoded as a key=value list, separated by commas. Ex:
*
* "gc_timeout=5000,max_cached_processes=24"
*
* The following keys are supported:
*
* <pre>
* max_cached_processes (int)
* background_settle_time (long)
* fgservice_min_shown_time (long)
* fgservice_min_report_time (long)
* fgservice_screen_on_before_time (long)
* fgservice_screen_on_after_time (long)
* content_provider_retain_time (long)
* gc_timeout (long)
* gc_min_interval (long)
* full_pss_min_interval (long)
* full_pss_lowered_interval (long)
* power_check_delay (long)
* wake_lock_min_check_duration (long)
* cpu_min_check_duration (long)
* service_usage_interaction_time (long)
* usage_stats_interaction_interval (long)
* service_restart_duration (long)
* service_reset_run_duration (long)
* service_restart_duration_factor (int)
* service_min_restart_time_between (long)
* service_max_inactivity (long)
* service_bg_start_timeout (long)
* </pre>
*
* <p>
* Type: string
* @hide
* @see com.android.server.am.ActivityManagerConstants
*/
public static final String ACTIVITY_MANAGER_CONSTANTS = "activity_manager_constants";
- provider重置完成后,会利用android系统的急救措施重置部分settings数据
// file: frameworks\base\services\core\java\com\android\server\RescueParty.java
/**
* Called when {@code SettingsProvider} has been published, which is a good
* opportunity to reset any settings depending on our rescue level.
*/
public static void onSettingsProviderPublished(Context context) {
executeRescueLevel(context);
}
private static void executeRescueLevel(Context context) {
final int level = SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE);
if (level == LEVEL_NONE) return;
Slog.w(TAG, "Attempting rescue level " + levelToString(level));
try {
executeRescueLevelInternal(context, level);
EventLogTags.writeRescueSuccess(level);
PackageManagerService.logCriticalInfo(Log.DEBUG,
"Finished rescue level " + levelToString(level));
} catch (Throwable t) {
final String msg = ExceptionUtils.getCompleteMessage(t);
EventLogTags.writeRescueFailure(level, msg);
PackageManagerService.logCriticalInfo(Log.ERROR,
"Failed rescue level " + levelToString(level) + ": " + msg);
}
}
private static void executeRescueLevelInternal(Context context, int level) throws Exception {
switch (level) {
case LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS:
resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_DEFAULTS);
break;
case LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES:
resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_CHANGES);
break;
case LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS:
resetAllSettings(context, Settings.RESET_MODE_TRUSTED_DEFAULTS);
break;
case LEVEL_FACTORY_RESET:
RecoverySystem.rebootPromptAndWipeUserData(context, TAG);
break;
}
}
第三部分:系统初始化完成,开始显示launcher
时序图
常见点
- 启动persistentTask
- 建立native crash socket,处理crash
- 启动具有MATCH_DIRECT_BOOT_AWARE | STOCK_PM_FLAGS标记的app
- 启动launcher