ActivityManager 分析

来源:互联网 发布:统计软件 stata mac 编辑:程序博客网 时间:2024/05/19 22:27

一、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。

0 0
原创粉丝点击