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。
- ActivityManager 分析
- ActivityManager系统服务源码分析
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- ActivityManager
- Android的Framework分析---5 ActivityManager分析
- Android的Framework分析---5 ActivityManager分析
- Android一些关键函数和类的分析-ActivityManager
- 关于activitymanager
- EM实例
- 反射_类加载器的概述和分类
- SimpleDateFormat中初始化格式各字母含义及区分
- Java数组练习(五)用sort()方法排序
- java web项目 debug 出现 source not found
- ActivityManager 分析
- nginx限制ip请求次数 以及并发次数
- charles使用教程
- hdu 1856(并查集)More is better
- php 扩展安装
- Java数组练习(六)打印指定行数的杨辉三角
- ESP32编译环境搭建【Windows平台】
- JavaScript一些用法
- SSD(Single Shot MultiBox Detector):因为数据集中图像通道数不对导致的训练异常