如何应对Android面试官 -> ActivityManagerService 是怎么启动的?

Android ActivityTaskManagerService ActivityTaskManagerService是Android系统中的一个服务,它位于server/wm目录下。它是在Android 10中引入的,主要负责管理activities和activity相关容器,如task、stacks和display。它是Android系统中的一个关键组件,用于管理和控制应用程序的生命周期、任务栈、窗口和显示等。 阅读详情

前言


image.png

本章主要讲解下 什么是 AMS,以及它是如何启动的;

SystemServer


SystemServer 通过按下电源键接通电源之后就会启动 BootRoom,BootRoom 就会拉起一个 BootLoader 程序,此程序会拉起 Linux Kernel「系统内核」,我们的 Android 系统就会初始化一个用户态进程也就是 init 进程,init 进程会执行 initZygote.rc 创建 zygote 进程,zygote 进程会 fork「孵化」出 SystemServer「系统服务进程,这是 zygote 进程的最大的一个儿子,Android 上层需要的所有服务例如 AMS,WMS,PMS,PKMS 等等都会在 SystemServer 初始化起来」 SystemServer 进程就会拉起我们的第一个应用程序「也就是桌面程序 Launcher 进程」;

image.png

这是一个 Android GUI 关系图;

AMS 是什么?


从 java 角度来看,AMS 就是一个 java 对象,实现了 Ibinder 接口,所以它是一个用于进程之间通信的接口,这个对象初始化是在 SystemServer.java 的 run() 方法里面;

ActivityManagerService 从名字就可以看出,它是一个服务,用来管理 Activity,而且是一个系统服务,就是包管理服务,电池管理服务,震动管理服务等;

AMS 实现了 Ibinder 接口,所以它是一个 Binder,这意味着他不但可以用于进程间通信,还是一个线程,因为一个 Binder 就是一个线程;

总得来说:ActivityManagerService 是 Android 系统中一个特别重要的系统服务,也是我们上层 APP 打交道最多的系统服务之一。ActivityManagerService(以下简称AMS) 主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作。所有的 APP 应用都需要与 AMS 打交道 ActivityManager 的组成主要分为以下几个部分:

1.服务代理:由 ActivityManagerProxy 实现,用于与 Server 端提供的系统服务进行进程间通信;

2.服务中枢:ActivityManagerNative 继承自 Binder 并实现 IActivityManager,它提供了服务接口和Binder 接口的相互转化功能,并在内部存储服务代理对象,并提供了 getDefault 方法返回服务代理;

3.Client:由 ActivityManager 封装一部分服务接口供 Client 调用。ActivityManager 内部通过调用ActivityManagerNative 的 getDefault 方法,可以得到一个 ActivityManagerProxy 对象的引用,进而通过该代理对象调用远程服务的方法;

4.Server:由 ActivityManagerService 实现,提供 Server 端的系统服务;

AMS 启动流程


SystemServer 创建之后,就会调研 run 方法,这个 run 方法就会启动 AMS;

createSystemContext

创建进程,启动launcher,把界面显示出来,会需要大量的资源,例如「文字,图片」,想要获取这些资源,都需要context,而系统的资源获取 也需要一个 context 对象,所以创建一个系统级别的 context 来获取资源,系统资源的加载都是在这个时候被加载的。例如「@android/xxx等都属于系统资源」;

private void createSystemContext() {
    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext();
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

    final Context systemUiContext = activityThread.getSystemUiContext();
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}

这里重点关注的时候 ActivityThread.systemMain() 方法,我们进入这个方法看下:

public static ActivityThread systemMain() {
    ThreadedRenderer.initForSystemProcess();
    ActivityThread thread = new ActivityThread();
    thread.attach(true, 0);
    return thread;
}

这里创建了 ActivityThread 已经进行了 attach 操作;

ActivityThread() {
    mResourcesManager = ResourcesManager.getInstance();
}

获取资源管理实例;

private void attach(boolean system, long startSeq) {
    
    if (!system) {
        // 省略部分代码
    } else {
        try {
            mInstrumentation = new Instrumentation();
            mInstrumentation.basicInit(this);
            ContextImpl context = ContextImpl.createAppContext(
                    this, getSystemContext().mPackageInfo);
            mInitialApplication = context.mPackageInfo.makeApplication(true, null);
            mInitialApplication.onCreate();
        } catch (Exception e) {
            throw new RuntimeException(
                    "Unable to instantiate Application():" + e.toString(), e);
        }
    }
    // 省略部分代码
}

这里做了三件事情

  1. new Instrumentation(); 创建 Instrumentation;
  2. ContextImpl.createAppContext(this, getSystemContext().mPackageInfo) 根据 LoadApk 对象创建 Context;
  3. context.mPackageInfo.makeApplication(true, null); 初始化 Application;

getSystemContext


其中 createAppContext 需要获取 SystemContext 作为入参,我们进入这个方法看下:

public ContextImpl getSystemContext() {
    synchronized (this) {
        if (mSystemContext == null) {
            mSystemContext = ContextImpl.createSystemContext(this);
        }
        return mSystemContext;
    }
}

我们进入这个 createSystemContext 看下:

static ContextImpl createSystemContext(ActivityThread mainThread) {
    LoadedApk packageInfo = new LoadedApk(mainThread);
    ContextImpl context = new ContextImpl(null, mainThread, packageInfo,
            ContextParams.EMPTY, null, null, null, null, null, 0, null, null);
    context.setResources(packageInfo.getResources());
    context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
            context.mResourcesManager.getDisplayMetrics());
    context.mContextType = CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI;
    return context;
}

这个方法做了两件事情,

  1. 创建 LoadedApk 对象,通过 LoadeApk 获取每一个安装在手机上的 APK 信息;
  2. 创建ContextImpl,首次执行getSystemContext会执行createSystemContext创建LoadedApk和contextImpl对象,利用刚创建的LoadedApk创建contextImpl;

createAppContext

ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0,null);
context.setResources(packageInfo.getResources());

startBootstrapService

启动一系列相关引导服务,我们进入源码看下:

private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {

    // 省略部分代码
    
    // 启动 APK 安装服务
    Installer installer = mSystemServiceManager.startService(Installer.class);
    // 省略部分代码
    
    // 启动 AMS 服务
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
            ActivityTaskManagerService.Lifecycle.class).getService();
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
            mSystemServiceManager, atm);
    // 设置 SystemServiceManager        
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    // 设置 APK 安装器
    mActivityManagerService.setInstaller(installer);
    
    // 初始化 AMS 相关的PMS 
    mActivityManagerService.initPowerManagement();
    // 设置 SystemServer
    mActivityManagerService.setSystemProcess();
}

startCoreServices();

启动核心服务,我们进入这个源码看下:

private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
    
    mSystemServiceManager.startService(SystemConfigService.class);

    mSystemServiceManager.startService(BatteryService.class);

    mSystemServiceManager.startService(UsageStatsService.class);
    // 启动用户统计服务
    mActivityManagerService.setUsageStatsManager(
            LocalServices.getService(UsageStatsManagerInternal.class));
    
    if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
        mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
    }

    mSystemServiceManager.startService(CachedDeviceStateService.class);

    mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class);

    mSystemServiceManager.startService(LooperStatsService.Lifecycle.class);

    mSystemServiceManager.startService(ROLLBACK_MANAGER_SERVICE_CLASS);

    mSystemServiceManager.startService(NativeTombstoneManagerService.class);

    mSystemServiceManager.startService(BugreportManagerService.class);

    mSystemServiceManager.startService(GpuService.class);
}

startOtherServices()

启动其他服务,我们进入这个方法看下:

private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    // 省略部分代码
    
    // 安装系统的 provider
    mActivityManagerService.installSystemProviders();
    
    // 设置 windowManager
    wm = WindowManagerService.main(context, inputManager,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
                    !mFirstBoot, mOnlyCore, new PhoneWindowManager());
            ServiceManager.addService(Context.WINDOW_SERVICE, wm);
    mActivityManagerService.setWindowManager(wm);
    // 设置 inputManager
    inputManager = new InputManagerService(context);
    ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
    // 通知
    mSystemServiceManager.startService(NotificationManagerService.class);
    
    mActivityManagerService.systemReady();
}

AMS 服务启动流程


这里额外插一句,service_manager 和 SystemServiceManager 的区别,service_manager 是 C/C++ 层的,用来管理 binder 服务的大管家,而 SystemServiceManager 是用来管理各种服务的启动,每启动一个服务,都会收集到一个 mServices 的集合中;

mActivityManagerService = ActivityManagerService.Lifecycle.startService(
        mSystemServiceManager, atm);

这里并不是直接 new 出来 AMS,而是通过 LifeCycle 这个代理类来创建 AMS,而 LifeCycle 的创建是通过反射来实现的,LifeCycle 在初始化的时候会初始化 AMS,我们进入这个 LifeCycle 看下:

public static final class Lifecycle extends SystemService {
    
    public Lifecycle(Context context) {
        super(context);
        mService = new ActivityManagerService(context, sAtm);
    }
    
    
    public static ActivityManagerService startService(
            SystemServiceManager ssm, ActivityTaskManagerService atm) {
        sAtm = atm;
        return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
    }
    
    @Override
    public void onBootPhase(int phase) {
        mService.mBootPhase = phase;
        if (phase == PHASE_SYSTEM_SERVICES_READY) {
            mService.mBatteryStatsService.systemServicesReady();
            mService.mServices.systemServicesReady();
        } else if (phase == PHASE_ACTIVITY_MANAGER_READY) {
            mService.startBroadcastObservers();
        } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
            mService.mPackageWatchdog.onPackagesReady();
        }
    }
    
    // 返回 AMS
    public ActivityManagerService getService() {
        return mService;
    }
}

LifeCycle 继承 SystemService,这个 com.android.server.SystemService 中包含了系统服务启动的各个阶段;

public abstract class SystemService {

    /** @hide */
    protected static final boolean DEBUG_USER = false;

    /**
     * The earliest boot phase the system send to system services on boot.
     */
    public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;

    /**
     * Boot phase that blocks on SensorService availability. The service gets started
     * asynchronously since it may take awhile to actually finish initializing.
     *
     * @hide
     */
    public static final int PHASE_WAIT_FOR_SENSOR_SERVICE = 200;

    /**
     * After receiving this boot phase, services can obtain lock settings data.
     */
    public static final int PHASE_LOCK_SETTINGS_READY = 480;

    /**
     * After receiving this boot phase, services can safely call into core system services
     * such as the PowerManager or PackageManager.
     */
    public static final int PHASE_SYSTEM_SERVICES_READY = 500;

    /**
     * After receiving this boot phase, services can safely call into device specific services.
     */
    public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520;

    /**
     * After receiving this boot phase, services can broadcast Intents.
     */
    public static final int PHASE_ACTIVITY_MANAGER_READY = 550;

    /**
     * After receiving this boot phase, services can start/bind to third party apps.
     * Apps will be able to make Binder calls into services at this point.
     */
    public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;

    /**
     * After receiving this boot phase, services can allow user interaction with the device.
     * This phase occurs when boot has completed and the home application has started.
     * System services may prefer to listen to this phase rather than registering a
     * broadcast receiver for {@link android.content.Intent#ACTION_LOCKED_BOOT_COMPLETED}
     * to reduce overall latency.
     */
    // 代表着 服务 启动完成
    public static final int PHASE_BOOT_COMPLETED = 1000;
}

我们接着拐回去看 LifeCycle 的 startService 方法,这个方法直接调用 SystemServiceManager 的 startService 方法,我们进入这个方法看下:

public <T extends SystemService> T startService(Class<T> serviceClass) {
    try {
        if (!SystemService.class.isAssignableFrom(serviceClass)) {
            throw new RuntimeException("Failed to create " + name
                    + ": service must extend " + SystemService.class.getName());
        }
        final T service;
        try {
            // 使用反射创建 LifeCycle 对象;
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            service = constructor.newInstance(mContext);
        } catch (InstantiationException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service could not be instantiated", ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service must have a public constructor with a Context argument", ex);
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service must have a public constructor with a Context argument", ex);
        } catch (InvocationTargetException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service constructor threw an exception", ex);
        }

        startService(service);
        return service;
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }
}

这里使用反射的方式来创建 LifeCycle 对象,当创建的,就会调用其构造方法,构造方法中就会创建 AMS,然后通过 getService 返回;

这个 LifeCycle 中创建的 mService 就是正儿八经的 ActivityManagerService,也就是我们需要的 AMS,这样做就会让 AMS 有一个生命周期;

SystemService 有各个阶段的状态分发,最终通过 LifeCycle 重写的 onBootPhase 分发具体逻辑,当分发PHASE_SYSTEM_SERVICES_READY 的时候,会执行 AMS 中的 ActiveServices 的 systemServiceReady 方法,这个 ActiveServices 就是用来管理四大组件的,就是说 AMS 通过操作 ActiveServices 来间接管理四大组件;

到此 AMS 就创建了出来了,接下来看下它在创建的时候都做了哪些事情,我们进入 AMS 的构造方法看下:

public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
    LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
    mInjector = new Injector(systemContext);
    mContext = systemContext;

    mFactoryTest = FactoryTest.getMode();
    // 1. 创建 Android UI 线程
    mSystemThread = ActivityThread.currentActivityThread();
    mUiContext = mSystemThread.getSystemUiContext();

    mHandlerThread = new ServiceThread(TAG,
            THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
    mHandlerThread.start();
    mHandler = new MainHandler(mHandlerThread.getLooper());
    mUiHandler = mInjector.getUiHandler(this);

    mProcStartHandlerThread = new ServiceThread(TAG + ":procStart",
            THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
    mProcStartHandlerThread.start();
    mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());

    mConstants = new ActivityManagerConstants(mContext, this, mHandler);
    final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */);
    mPlatformCompat = (PlatformCompat) ServiceManager.getService(
            Context.PLATFORM_COMPAT_SERVICE);
    mProcessList = mInjector.getProcessList(this);
    mProcessList.init(this, activeUids, mPlatformCompat);
    mAppProfiler = new AppProfiler(this, BackgroundThread.getHandler().getLooper(),
            new LowMemDetector(this));
    mPhantomProcessList = new PhantomProcessList(this);
    mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);

    final BroadcastConstants foreConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_FG_CONSTANTS);
    foreConstants.TIMEOUT = BROADCAST_FG_TIMEOUT;

    final BroadcastConstants backConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_BG_CONSTANTS);
    backConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;

    final BroadcastConstants offloadConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_OFFLOAD_CONSTANTS);
    offloadConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
    offloadConstants.SLOW_TIME = Integer.MAX_VALUE;

    mEnableOffloadQueue = SystemProperties.getBoolean(
            "persist.device_config.activity_manager_native_boot.offload_queue_enabled", false);

    mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
            "foreground", foreConstants, false);
    mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
            "background", backConstants, true);
    mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
            "offload", offloadConstants, true);
    mBroadcastQueues[0] = mFgBroadcastQueue;
    mBroadcastQueues[1] = mBgBroadcastQueue;
    mBroadcastQueues[2] = mOffloadBroadcastQueue;
    // 2. 创建 ActiveServices 用来管理四大组件
    mServices = new ActiveServices(this);
    mCpHelper = new ContentProviderHelper(this, true);
    mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
    mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);
    mUidObserverController = new UidObserverController(mUiHandler);

    final File systemDir = SystemServiceManager.ensureSystemDir();
    // 电量统计相关服务
    mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,
            BackgroundThread.get().getHandler());
    mBatteryStatsService.getActiveStatistics().readLocked();
    mBatteryStatsService.scheduleWriteToDisk();
    mOnBattery = DEBUG_POWER ? true
            : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
    mBatteryStatsService.getActiveStatistics().setCallback(this);
    mOomAdjProfiler.batteryPowerChanged(mOnBattery);
    // 进程统计相关服务
    mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));

    mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);

    mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);

    mUserController = new UserController(this);

    mPendingIntentController = new PendingIntentController(
            mHandlerThread.getLooper(), mUserController, mConstants);

    mUseFifoUiScheduling = SystemProperties.getInt("sys.use_fifo_ui", 0) != 0;

    mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
    mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);

    mActivityTaskManager = atm;
    // 创建 recentTasks、ActivityStartController
    mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
            DisplayThread.get().getLooper());
    mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);

    mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext);

    Watchdog.getInstance().addMonitor(this);
    Watchdog.getInstance().addThread(mHandler);

    updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
    try {
        Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(),
                Process.THREAD_GROUP_SYSTEM);
        Process.setThreadGroupAndCpuset(
                mOomAdjuster.mCachedAppOptimizer.mCachedAppOptimizerThread.getThreadId(),
                Process.THREAD_GROUP_SYSTEM);
    } catch (Exception e) {
        Slog.w(TAG, "Setting background thread cpuset failed");
    }

    mInternal = new LocalService();
    mPendingStartActivityUids = new PendingStartActivityUids(mContext);
    mTraceErrorLogger = new TraceErrorLogger();
}

AMS的创建做了五个比较重要的事情

  1. 创建 Android UI 线程;mSystemThread = ActivityThread.currentActivityThread();
  2. 创建 ActiveService;mServices = new ActiveServices(this);
  3. 创建管理 Activity 的 ActivityStackSupervisor 对象;mStackSupervisor = new ActivityStackSupervisor(this, mHandler.getLooper());
  4. 创建最近任务列表;mRecentTasks = new RecentTasks(this, mStackSupervisor);
  5. 创建 App的 Activity 生命周期管理类;mLifeCycleManager = n ew ClientLifeCycleManager();

初始之后,我们来看下 start 逻辑

private void start() {
    // AMS 启动的时候会把所有的应用进程移除掉
    removeAllProcessGroups();
    // 启动电池统计服务
    mBatteryStatsService.publish();
    mAppOpsService.publish();
    LocalServices.addService(ActivityManagerInternal.class, mInternal);
    LocalManagerRegistry.addManager(ActivityManagerLocal.class,
            (ActivityManagerLocal) mInternal);
    mActivityTaskManager.onActivityManagerInternalAdded();
    mPendingIntentController.onActivityManagerInternalAdded();
    mAppProfiler.onActivityManagerInternalAdded();
}

整个的 start 大致过程就结束了;

初始化 AMS 相关的 PMS

AMS 在 start 之后,会调用 mActivityManagerService.initPowerManagement(); 来初始化 PowerManagerService 服务,我们来看下这里面都做了什么

public void initPowerManagement() {
    mActivityTaskManager.onInitPowerManagement();
    mBatteryStatsService.initPowerManagement();
    mLocalPowerManager = LocalServices.getService(PowerManagerInternal.class);
}

逻辑还是比较简单的,初始化 PMS 相关服务;

设置 SystemServer

AMS 在 start 之后,会调用 mActivityManagerService.setSystemProcess(); 来设置 SystemServer

public void setSystemProcess() {
    try {
        ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
                DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
        ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
        ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
                DUMP_FLAG_PRIORITY_HIGH);
        ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
        ServiceManager.addService("dbinfo", new DbBinder(this));
        mAppProfiler.setCpuInfoService();
        ServiceManager.addService("permission", new PermissionController(this));
        ServiceManager.addService("processinfo", new ProcessInfoService(this));
        ServiceManager.addService("cacheinfo", new CacheBinder(this));

        ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
        mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

        synchronized (this) {
            ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
                    false,
                    0,
                    new HostingRecord("system"));
            app.setPersistent(true);
            app.setPid(MY_PID);
            app.mState.setMaxAdj(ProcessList.SYSTEM_ADJ);
            app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
            addPidLocked(app);
            updateLruProcessLocked(app, false, null);
            updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
        }
    } catch (PackageManager.NameNotFoundException e) {
        throw new RuntimeException(
                "Unable to find android system package", e);
    }

    // Start watching app ops after we and the package manager are up and running.
    mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
            new IAppOpsCallback.Stub() {
                @Override public void opChanged(int op, int uid, String packageName) {
                    if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
                        if (getAppOpsManager().checkOpNoThrow(op, uid, packageName)
                                != AppOpsManager.MODE_ALLOWED) {
                            runInBackgroundDisabled(uid);
                        }
                    }
                }
            });

    final int[] cameraOp = {AppOpsManager.OP_CAMERA};
    mAppOpsService.startWatchingActive(cameraOp, new IAppOpsActiveCallback.Stub() {
        @Override
        public void opActiveChanged(int op, int uid, String packageName, String attributionTag,
                boolean active, @AttributionFlags int attributionFlags,
                int attributionChainId) {
            cameraActiveChanged(uid, active);
        }
    });
}

这里主要关注三点:

第一个是添加各种服务;

  1. activity AMS;ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
  2. procstats 进程统计;ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
  3. meminfo 内存;ServiceManager.addService(“meminfo”, new MemBinder(this));
  4. gfxinfo 图像信息;ServiceManager.addService(“gfxinfo”, new GraphicsBinder(this));
  5. dbinfo 数据库;ServiceManager.addService(“dbinfo”, new DbBinder(this));
  6. cpuinfo CPU;ServiceManager.addService(“cpuinfo”, new CpuBinder(this));
  7. permission 权限;ServiceManager.addService(“permission”, new PermissionController(this));
  8. processinfo 进程服务;ServiceManager.addService(“processinfo”, new ProcessInfoService(this));
  9. usagestats 应用的使用情况;

adb shell dumpsys 的各种服务的来源就是从这里添加进去的;

第二个是创建用于性能统计的Profiler对象;

ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
“android”, STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

第三个是创建ProcessRecord对象;

ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);

安装系统的 provider

在 startOtherService 方法中,会调用 mActivityManagerService.installSystemProviders(); 来安装系统的 provider

设置 WindowManager

在 startOtherService 方法中,会调用 mActivityManagerService.setWindowManager(wm); 设置窗口管理器;

public void setWindowManager(WindowManagerService wm) {
    synchronized (this) {
        mWindowManager = wm;
        mWmInternal = LocalServices.getService(WindowManagerInternal.class);
        mActivityTaskManager.setWindowManager(wm);
    }
}

设置windowManager

wm = WindowManagerService.main(context, inputManager,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
                    !mFirstBoot, mOnlyCore, new PhoneWindowManager());
            ServiceManager.addService(Context.WINDOW_SERVICE, wm);
mActivityManagerService.setWindowManager(wm); 

setWindowManager 中创建核心 Settings Observer,用于监控 Settings「系统设置」

mCoreSettingsObserver = new CoreSettingsObserver(this);

服务启动完成

当执行到 mActivityManagerService.systemReady 的时候,表示前面创建的80多个服务都已经启动完成了;
接下来需要启动系统UI、执行一系列服务的systemReady、启动 Luancher;

startSystemUi(context, windowManagerF); 启动 systemui 服务;

private static void startSystemUi(Context context, WindowManagerService windowManager) {
    PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
    Intent intent = new Intent();
    intent.setComponent(pm.getSystemUiServiceComponent());
    intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
    //Slog.d(TAG, "Starting service: " + intent);
    context.startServiceAsUser(intent, UserHandle.SYSTEM);
    windowManager.onSystemUiStarted();
}

mSystemServiceManager.startBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY); 调用AMS服务的ready -> service.onBootPhase();

public void startBootPhase(@NonNull TimingsTraceAndSlog t, int phase) {
    mCurrentPhase = phase;
    try {
        final int serviceLen = mServices.size();
        for (int i = 0; i < serviceLen; i++) {
            final SystemService service = mServices.get(i);
            long time = SystemClock.elapsedRealtime();
            try {
                service.onBootPhase(mCurrentPhase);
            } catch (Exception ex) {
            }
            warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onBootPhase");
        }
    } finally {
    }

    if (phase == SystemService.PHASE_BOOT_COMPLETED) {
        final long totalBootTime = SystemClock.uptimeMillis() - mRuntimeStartUptime;
        SystemServerInitThreadPool.shutdown();
    }
}

startHomeActivityLocked(currentUserId, “systemReady”); 启动Launcher Android开机过程结束,就可以看到桌面使用手机;

到这里,AMS 的启动流程就结束了;

下一章预告


Activity 启动流程

欢迎三连


来都来了,点个关注,点个赞吧,你的支持是我最大的动力~

深度解读ActivityManagerService----Android四大组件系统系列 本文采用自述的方式带大家认识ActivityManagerService是啥,它有哪些功能,它的启动过程,它的模块有哪些以及模块的作用是啥。 阅读详情

相关推荐

Android:ActivityTaskManagerService接管ActivityManagerService

ActivityManagerService这个服务,对于玩Android的开发人员,应该再熟悉不过了,它是掌管Activity的核心。 不过从Android 10.0(API 29)开始,再看ActivityManagerService的代码,会发现,ActivityManagerService的工作已经被ActivityTaskManagerService这个服务接管了。具体我们就看看这里的变化。 虽然说ActivityTaskManagerService接管了ActivityManagerServ

bdmh的专栏 4320

ActivityManagerService和ActivityTaskManagerService启动详解—Android 12(一)

ActivityManagerService太负责了,尤其是Android12的AMS没有相关文章,那我们就从它的启动开始分析源码,梳理ActivityManagerService、ActivityTaskManager、WindowManagerService等相关类的关系。

lvyaer_1122的博客 4613

Android WIFI体系:深入解析WifiLock与MulticastLock的底层实现与性能优化

本文深入解析Android WIFI体系中WifiLock与MulticastLock的底层实现机制与性能优化策略。WifiLock通过阻止Wi-Fi休眠提升网络性能,尤其WIFI_MODE_FULL_HIGH_PERF模式可显著降低延迟;MulticastLock则控制组播数据接收,但会增加功耗。文章详细探讨了其与wpa_supplicant、HAL层的交互,并提供高性能场景下的优化实践与功耗平衡方案。

php55的博客 1079

ActivityManagerService和ActivityTaskManagerService详解—Android 12

https://blog.youkuaiyun.com/lvyaer_1122/article/details/130598451

Android framework 627

Ollama模型路径迁移实战:Windows/Mac/Linux三系统保姆级教程(附常见问题排查)

本文提供了一份详细的Ollama模型路径迁移教程,涵盖Windows、macOS和Linux三大操作系统。针对默认安装路径占用系统盘空间的问题,文章指导用户如何安全移动模型文件、配置环境变量、重启服务,并附有迁移后的验证步骤与常见问题排查方法,帮助用户高效管理本地AI模型存储。

gray5的博客 540

TEA-Tiny Encryption算法在FPGA的实现

在FPGA原型中,我们定义了一个TEA_FPGA模块,该模块包含一个输入数据端口(plain)、一个输入密钥端口(key)和一个输出数据端口(cipher)。在模块中,我们通过32轮的循环处理来实现TEA算法的加密过程,并将最终结果存储在cipher变量中。由于FPGA硬件的高速性能,这种基于HDL的TEA算法实现可以在短时间内完成大量的数据加密处理,从而提高加密效率和性能。总之,在FPGA中实现TEA算法可以大大提高加密效率和性能,通过使用硬件描述语言HDL来实现可以更高效、更快速地完成数据加密操作。

BitSlinger的博客 272

搞懂Android应用启动过程,再也不怕面试官了

文章会持续更新的。绝对干货!!!Android进阶学习全套手册关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。

2401_84048586的博客 453

cdk&java | 分子sdf文件生成

sdf

ASKCOS博客 1089

惊呆了!女儿拿着小天才电话手表,问我Android启动流程!

首先,new一个女儿, var mDdaughter = new 女儿(“6岁”,“漂亮可爱”,“健康乖巧”,“最喜欢玩小天才电话手表和她的爸爸”) 好了,女儿有了,有一天,女儿问我: “爸爸爸爸,你说我玩的这个小天才电话手表怎么这么厉害,随便点一下这个小图片,这个应用就冒出来了,就可以听儿歌了。好神奇啊。” 我心里一惊: 小天才电话手表的系统就是Android,所以这不就是。。面试官常考的应用启动流程嘛!女儿也要来面试我了吗!好了,既然女儿问了,那就答吧。但是,对付这个小小的0经验面试官,我该咋说呢?

CHAMPION8888的博客 4347

android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。试着改小一下minSdkVersion 为23重新编译apk,再检测一下签名版本v1居然打开了!参考网上搜索到的方法,手动在build.gradle里面添加。但是编译出来的apk还是只有v2的签名。里面提到了v1签名还和。

hedalei的博客 466

数字电视中的AD(Audio Description)音频描述技术详解

AD(Audio Description)音频描述是一种辅助技术,旨在帮助视障人士更好地理解视觉内容。通过在节目或视频的自然停顿处插入额外的语音叙述来解释屏幕上的视觉信息,如人物动作、场景变化、文字说明等,从而让视力受损的人士也能获得完整的观影体验。AD服务不仅限于电视广播,也广泛应用于电影、剧院表演、在线视频平台等领域。PID:用于标识和区分不同的音频流。PMT表:提供每个音频流的详细信息,包括PID、编解码器类型和语言代码。时间戳:PTS和DTS用于同步音频与视频内容。解复用。

以实战经验介绍行业知识 739

安卓工程师_安卓开发面试题(24/30)之APK启动流程

应用程序的启动流程,是较为高频的面试题,因为涉及的知识点比较多,适合考验一个人安卓技术的掌握程度,不过原理也比较复杂。本人也被问过这题目.

a763450633的博客 854

SAP S/4HANA 数据归档的实施方法

实施 SAP S/4HANA 数据归档是一个系统的过程,涉及到策略的定义、技术的执行以及后续的维护和验证。正确的归档策略不仅能优化系统性能,还能帮助企业降低运营成本,确保数据安全,并符合相关法律法规的要求。通过以上案例,我们可以看到不同行业如何依据自己的业务需求和法规要求,利用 SAP S/4HANA 的强大功能来实现数据归档的目标。这些实践证明了数据归档在现代企业信息管理中的重要地位和作用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 890

面试官 请你讲下AMS在Android起到什么作用……_android ams

AMS的main函数:创建AMS实例,其中最重要的工作是创建Android运行环境,得到一个ActivityThread和一个Context对象。AMS的setSystemProcess函数:该函数注册AMS和meminfo等服务到ServiceManager中。另外,它为SystemServer创建了一个ProcessRecord对象。由于AMS是Java世界的进程管理及调度中心,要做到对Java进程一视同仁,尽管SystemServer贵为系统进程,此时也不得不将其并入AMS的管理范围内。

2301_82243733的博客 918

Sqlserver2012评估期已过问题解决(启动数据库服务报错1705都是同样的问题,数据库过期未激活)

一、背景: 因为之前安装sqlserver2012忘记输入序列号,如今出现评估期已过的问题,前几天忙活半天,才解决,发现网 上叙述都非常凌乱,并且仅仅有大意,有的非常难操作。所以把我操作的过程和大家交流分享: 一定要有序列号的输入。不然会有很多其它的麻烦出现: 二、问题解决: 第一步:进入SQL2012配置工具中的安装中心。 第二步:再进入左側维护选项界面,然后选择选择版本号升级。 ...

堂前燕的博客 3265

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

面试官 请你讲下AMS在Android起到什么作用……_android ams(1)

总结5.1 流程说明 在整个startService过程,从进程角度看服务启动过程Process A进程:是指调用startService命令所在的进程,也就是启动服务的发起端进程,比如点击桌面App图标,此处Process A便是Launcher所在进程。system_server进程。

2401_84538544的博客 862

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

AMS在Android起到什么作用,简单的分析下Android的源码

AMS在Android起到什么作用,简单的分析下Android的源码 面试官: AMS在Android起到什么作用,简单的分析下Android的源码 心理分析:这道题在发生在大多数场景下。面对这道题 很多求职很茫然,不知道该如何说起。AMS本身比较复杂难以理解。工作多年也很难弄清AMS的作用,其实我们大可从以下几点入手组件启动、进程切换、Crash异常入手 求职者:AMS难以表述 我们就从最熟知 的Activity启动入手,逐步深入和分析,用定力告诉面试官,我层深入研究过。接下来我们从五条线分析AMS作

qq_34097002的博客 3869

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android走进Framework之app是如何被启动的

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34281477的博客 287

android pendingintent.send()启动activity失败_女儿拿着小天才电话手表问我App启动流程...

前言首先,new一个女儿,var mDdaughter = new 女儿("6岁",“漂亮可爱”,“健康乖巧”,“最喜欢玩小天才电话手表和她的爸爸”)好了,女儿有了,有一天,女儿问我:“爸爸爸爸,你说我玩的这个小天才电话手表怎么这么厉害,随便点一下这个小图片,这个应用就冒出来了,就可以听儿歌了。好神奇啊。”我心里一惊: 小天才电话手表的系统就是Android,所以这不就是。。面试官常考的应用启动流...

weixin_34385646的博客 589

2024年安卓最新Android-Framework学习笔记(七)AMS全家桶(1),2024年最新面试被面试官怼哭

看到这篇文章的人不知道有多少是和我一样的Android程序员。35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。

2401_84557161的博客 1073

阿里面试官资深专家,论一个APP从启动到主页面显示经历的过程,一线大厂架构师都推荐的Android零基础大全

下面介绍下Android系统里面的服务器和客户端的概 念。其实服务器客户端的概念不仅仅存在于Web开发中,在Android的框架设计中,使 用的也是这一种模式。服务器端指的就是所有App共用的系统服务,比如我们这里 提到的,和前面提到的等等,这些基础的系统服务是被所有的App公用的,当某 个App想实现某个操作的时候,要告诉这些系统服务,比如你想打开一个App,那 么我们知道了包名和类名之后就可以打开但是,我们的App通过调用。

X7gUWZnYP的博客 577
上一篇: 如何应对Android面试官 -> Android 如何实现增量更新,Tinker patch包生成核心原理
下一篇: 如何应对Android面试官 -> ActivityManagerService 是怎么启动的?
老A说
博客等级 码龄14年 1181粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值