ActivityManager 分析

一、ActivityManagerService启动阶段
AMS是在系统启动的init2阶段,由SystemServer启动的Java服务之一。

 // Activity manager runs the show.
 //第一阶段:启动ActivityManagerService
 mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer)

...
// Set up the Application instance for the system process and get started.
//第二阶段:调用setSystemProcess方法
mActivityManagerService.setSystemProcess();

//第三阶段:嗲用installSystemProciders方法
mActivityManagerService.installSystemProviders();

...
//第四阶段:调用systemReady方法
 mActivityManagerService.systemReady(new Runnable() {
            @Override
            public void run() {
                Slog.i(TAG, "Making services ready");

                mSystemServiceManager.startBootPhase(
                        SystemService.PHASE_ACTIVITY_MANAGER_READY);
                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "PhaseActivityManagerReady");
...

二、第二阶段:调用setSystemProcess方法
Activity启动第二阶段:调用setSystemProcess方法,setSystemProcess()方法的功能大体可以分成三部分
1、注册服务。首先将ActivityManagerService注册到ServiceManager,然后将几个与系统系统调试有关的服务注册到ServiceManager。这些与系统性能调试相关的服务最终会调用ActivityManagerService,将它们与ActivityManagerService一起注册到SM中,这样系统的调度和调试功能就完善了。
2、查询并处理ApplicationInfo。 首先调用ApplicationManagerService的接口,查询包名为android的应用程序的ApplicationInfo信息,
该信息来自于Android启动时APK安装扫描过程,对应framework-res.apk,然后以该信息为参数调用ActivityThread的installSystemApplicationInfo方法
3、创建并处理ProcessRecord。 调用ActivityManagerService方法上的newProcessRecordLocked,创建一个ProcessRecord类型的对象, 并保存该对象。

    public void setSystemProcess() {
        try {
            /×将AcitvityManagerService注册到ServiceManager中,this指的是ActivityManagerService的一个实例×/
            ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
            //注册meminfo服务用于调试,其作用可以参考adb shell dumpsys meminfo
            ServiceManager.addService("meminfo", new MemBinder(this));
            //注册gfxinfo服务用于调试,其作用可以参考adb shell dumpsys gfxinfo
            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
            //Android 4.1中新加入的服务,用于存储(dump)应用数据库信息
            ServiceManager.addService("dbinfo", new DbBinder(this));
            //注册cpuinfo服务用于调试,其作用可以参考adb shell dumpsys cpuinfo
            if (MONITOR_CPU_USAGE) {
                ServiceManager.addService("cpuinfo", new CpuBinder(this));
            }
            //注册permission服务,用于检查进程的权限信息
            ServiceManager.addService("permission", new PermissionController(this));
            ServiceManager.addService("processinfo", new ProcessInfoService(this));

            /// M: ANRManager mechanism @{
            ServiceManager.addService("anrmanager", mANRManager, true);
            /// @}

            //通过PackageManagerService查询报名为android的应用程序的ApplicationInfo信息
            ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                    "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
            //调用ActivityThread上的方法
            mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

            //生成一个新的ProcessRecord类型的对象,并将该对象存入
            synchronized (this) {
                ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
                app.persistent = true;//不能被回收
                app.pid = MY_PID;//system_server的进程ID
                app.maxAdj = ProcessList.SYSTEM_ADJ;//设置最大的ADJ值
                app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
                synchronized (mPidsSelfLocked) {
                    mPidsSelfLocked.put(app.pid, app);
                }
                //新加入一个APP,需要更新LRU,后续分析
                updateLruProcessLocked(app, false, null);
                updateOomAdjLocked();
            }
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException(
                    "Unable to find android system package", e);
        }
    }

2.1 查询并处理ApplicationInfo
由PackageManagerService相关知识可以知道,查询ApplicationInfo的工作最终由ackagerManagerService的getApplicationInfo方法完成。

    //传入的参数分别为:android、STOCK_PM_FLAGS和当前User ID
    public ApplicationInfo getApplicationInfo(String packageName, int flags, int userId) {
        if (!sUserManager.exists(userId)) return null;
        flags = updateFlagsForApplication(flags, userId, packageName);
        enforceCrossUserPermission(Binder.getCallingUid(), userId,
                false /* requireFullPermission */, false /* checkShell */, "get application info");
        // writer
        synchronized (mPackages) {
            //首先,从PackageManagerService.mPackages中查找包信息
            PackageParser.Package p = mPackages.get(packageName);
            if (DEBUG_PACKAGE_INFO) Log.v(
                    TAG, "getApplicationInfo " + packageName
                    + ": " + p);
            if (p != null) {
                //然后,从mSetting.mPackages查找包设置信息
                PackageSetting ps = mSettings.mPackages.get(packageName);
                if (ps == null) return null;
                // Note: isEnabledLP() does not apply here - always return info
                //由包设置信息和包信息创建应用程序信息
                return PackageParser.generateApplicationInfo(
                        p, flags, ps.readUserState(userId), userId);
            }
            if ("android".equals(packageName)||"system".equals(packageName)) {
                //由scanPackageLI开机扫描包时设置
                return mAndroidApplication;
            }
            if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) {
                return generateApplicationInfoFromSettingsLPw(packageName, flags, userId);
            }
        }
        return null;
    }

2.2 创建并初始化ProcessRecord
接下来分析ActivityManagerService.setSystemProcess的最后一步工作:创建并初始化ProcessRecord。创建ProcessRecord的工作,由ActivityManagerService的newProcessRecordLocked方法完成。

final ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess,
            boolean isolated, int isolatedUid) {
        //参数customProcess为system
        String proc = customProcess != null ? customProcess : info.processName;
        //影响电池状态的信息
        BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
        final int userId = UserHandle.getUserId(info.uid);
        int uid = info.uid;
        if (isolated) {//参数为false
            if (isolatedUid == 0) {
                int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1;
                while (true) {
                    if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID
                            || mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) {
                        mNextIsolatedProcessUid = Process.FIRST_ISOLATED_UID;
                    }
                    uid = UserHandle.getUid(userId, mNextIsolatedProcessUid);
                    mNextIsolatedProcessUid++;
                    if (mIsolatedProcesses.indexOfKey(uid) < 0) {
                        // No process for this uid, use it.
                        break;
                    }
                    stepsLeft--;
                    if (stepsLeft <= 0) {
                        return null;
                    }
                }
            } else {
                // Special case for startIsolatedProcess (internal only), where
                // the uid of the isolated process is specified by the caller.
                uid = isolatedUid;
            }
        }
        final ProcessRecord r = new ProcessRecord(stats, info, proc, uid);
        if (!mBooted && !mBooting
                && userId == UserHandle.USER_SYSTEM
                && (info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
            r.persistent = true;
        }
        addProcessNameLocked(r);
        return r;
    }

newProcessRecordLocked需要接收一个IApplicationThread类型的参数,该参数进而传入ProcessRecord的构造函数,用于创建ProcessRecord。

### 关于 Android 中 `ActivityManager` 和 AIDL 的用法与实现细节 #### 1. **ActivityManager 的基本概念** `ActivityManager` 是 Android 系统中的一个重要组件,用于管理应用程序的任务和活动栈。它提供了许多 API 来监控和控制应用的行为,例如启动新任务、结束任务、获取运行的应用程序列表等。这些功能对于开发者来说非常有用,尤其是在需要处理多任务或多进程场景时。 通过 `Context.getSystemService(Context.ACTIVITY_SERVICE)` 可以获得 `ActivityManager` 实例[^2]。这使得开发者能够访问系统的资源和服务来完成复杂的操作。 #### 2. **AIDL 的作用及其工作原理** AIDL(Android Interface Definition Language)是一种接口定义语言,主要用于在 Android 平台上实现跨进程通信(IPC)。当两个进程需要共享数据或者调用彼此的方法时,可以使用 AIDL 定义一个公共接口并生成相应的 stub 类来进行通信。 具体而言,在客户端和服务端之间传递对象时,如果该对象不是简单的原始类型,则必须将其序列化以便在网络上传输;而反序列化则是在接收方重新构建原来的对象实例的过程。这种机制允许不同地址空间内的线程间交换复杂的数据结构[^4]。 #### 3. **如何使用 AIDL 创建远程服务?** 以下是创建基于 AIDL 的远程服务的主要步骤: - 首先编写 .aidl 文件描述所需暴露给外部世界的抽象方法签名; ```java // IRemoteService.aidl package com.example.android; interface IRemoteService { void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString); } ``` - 接着编译上述文件自动生成对应的 Java Stub 类; - 在 Service 继承 Binder 提供具体的业务逻辑实现; - 最后绑定到目标 activity 上即可正常使用远端提供的能力了。 #### 4. **性能优化建议** 考虑到移动设备有限的硬件条件,在设计涉及大量计算或频繁更新界面的应用时特别需要注意节省 RAM 资源。即使现代虚拟机已经具备自动化的垃圾收集机制(Garbage Collection),但主动跟踪内存变化情况仍然是良好实践的一部分[^1]。 另外值得注意的是 dumpsys 工具可以帮助我们深入了解整个系统状态包括各个模块的工作状况等等[^3] 。这对于调试分析特定时间段内某个 app 表现异常的原因很有帮助。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值