AMS:启动(2)

第一部分: 创建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();
		...

时序图
在这里插入图片描述
这部分客制化情况较少,更多的是了解:启动过程中,加载了哪些文件?在开发中如何修改这些文件?利用了哪些系统可配置属性?

涉及文件:

  1. 进程状态文件目录/data/system/procstats目录
  2. 权限配置文件/data/system/appops.xml
  3. 关于activity、broadcast、service的intent规则目录:/data/system/ifw 或 /data/secure/system/ifw目录下

系统属性:

  1. R.bool.config_permissionReviewRequired,app启动过程中多次review权限合法性
  2. R.integer.config_radioScanningTimeout
  3. 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();
        ...
}

时序图
在这里插入图片描述
注意点:

  1. 系统对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";
  1. 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

时序图
在这里插入图片描述
常见点

  1. 启动persistentTask
  2. 建立native crash socket,处理crash
  3. 启动具有MATCH_DIRECT_BOOT_AWARE | STOCK_PM_FLAGS标记的app
  4. 启动launcher
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值