启动

在Android系统启动流程中中我们提到过,AMS是在system_service中启动的,

 //frameworks/base/services/java/corri/android/server/SystemServer.java

//该方法主要启动服务 ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。
//设置 ActivityManagerService,启动传感器服务。
startBootstrapServices(); // 启动引导服务

//该方法主要
//启动服务 BatteryService 用于统计电池电量,需要 LightService。
//启动服务 UsageStatsService,用于统计应用使用情况。
//启动服务 WebViewUpdateService。
startCoreServices(); // 启动核心服务

//该方法主要启动服务 InputManagerService,WindowManagerService。
//等待 ServiceManager,SurfaceFlinger启动完成,然后显示启动界面。
//启动服务 StatusBarManagerService,
//准备好 window, power, package, display 服务:
//	- WindowManagerService.systemReady()
//	- PowerManagerService.systemReady()
//	- PackageManagerService.systemReady()
//	- DisplayManagerService.systemReady()
startOtherServices(); // 启动其他服务

在启动核心服务功能中,会进行AMS的启动。

 //frameworks/base/services/java/corri/android/server/SystemServer.java
 private void startBootstrapServices() {
 	...
 //这里会将ATMS注册到ServiceManager中,然后调用ATMS的start方法。
 ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();
 //重点方法1。 注册AMS服务,并返回对应的对象信息
 mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);
 mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
 //设置app安装器
 mActivityManagerService.setInstaller(installer);
 ...
 //重点方法2。 向ServiceManager中注册Binder服务
 mActivityManagerService.setSystemProcess();
 }

这里我们只截取了AMS的启动代码。

这里会通过startService方法来进行AMS的注册和启动过程。我们看一下具体的ActivityManagerService中的startService方法

startService

// 
	public static ActivityManagerService startService(SystemServiceManager ssm, ActivityTaskManagerService atm) {
  sAtm = atm;
  //调用SM的startService方法。创建AMS实例,并启动AMS
  return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
 }

我们在ServiceManager的工作原理中讲解过,systemServiceManager.startService方法会将对应的服务注册到ServiceManager中,然后再调用start方法。

//frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
		public SystemService startService(String className) {
 final Class<SystemService> serviceClass;
 serviceClass = (Class<SystemService>)Class.forName(className);
 return startService(serviceClass);
 }

 @SuppressWarnings("unchecked")
 public <T extends SystemService> T startService(Class<T> serviceClass) {
 try {
  final String name = serviceClass.getName();
  final T service;
  try {
  //反射构造函数
  Constructor<T> constructor = serviceClass.getConstructor(Context.class);
  //创建服务
  service = constructor.newInstance(mContext);
  ...
  //启动服务
  startService(service);
  return service;
 } finally {
  Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
 }
 }

 public void startService(@NonNull final SystemService service) {
 // Register it.
 //注册到ServiceManager列表中
 mServices.add(service);
 //调用服务对应的onStart方法
 service.onStart();
 }

在启动AMS的时候传入的参数是:ActivityManagerService.Lifecycle.class。所以这里实际上会调用ActivityManagerService.Lifecycle 的构造方法,然后调用它的onStart方法

 public static final class Lifecycle extends SystemService {
 private final ActivityTaskManagerService mService;
 public Lifecycle(Context context) {
  super(context);
  //创建AMS对象
  mService = new ActivityManagerService(context, sAtm);
 }
 @Override
 public void onStart() {
  //调用AMS的start方法
  mService.start();
 }

 public ActivityManagerService getService() {
  //返回了AMS实例
  return mService;
 }
 }

在Lifecycle对象的创建过程中,会创建AMS对象,然后通过start()方法进行了启动。

AMS的创建

对于AMS对象的创建是通过构造函数来创建的。

 //构造方法,
 public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
 //获取系统的ActivityThread
 mSystemThread = ActivityThread.currentActivityThread();
 //创建一个ServiceThread用来处理AMS接收到的命令
 mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
 mHandlerThread.start();
 mHandler = new MainHandler(mHandlerThread.getLooper());
 mUiHandler = mInjector.getUiHandler(this);
 //低内存监控
 mLowMemDetector = new LowMemDetector(this);
 //初始化广播队列。这里包含了前台广播,后台广播等
 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;
 //用于保存注册的Service
 mServices = new ActiveServices(this);
 //map,用于保存注册的ContentProvider
 mProviderMap = new ProviderMap(this);
 mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
 mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);

 //创建 /data/system目录
 final File systemDir = SystemServiceManager.ensureSystemDir();
 //创建进程统计服务,保存在/data/system/proccstats目录中。
 mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
 //赋值ATM,并进行初始化
 mActivityTaskManager = atm;
 mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper());
 //CPU追踪器进程
 mProcessCpuThread = new Thread("CpuTracker") {
  @Override
  public void run() {
  ...
  }
 };

 }

在AMS的构造函数中进行了一些初始化的东西:比如说启动CPU监控、启动进程统计服务、启动低内存监控、初始化Service和ContentProvider对应的保存类等等。

start()

当AMS类创建完成之后,会调用start()方法。

 private void start() {
 	 //移除所有的进程组
 removeAllProcessGroups();
 //启动CpuTracker线程
 mProcessCpuThread.start();
 //启动电池统计服务,能够统计具体的应用的电池消耗,从而来进行一定的电量统计
 mBatteryStatsService.publish();
 //创建LocalService,并添加到LocalServices列表中
 LocalServices.addService(ActivityManagerInternal.class, new LocalService());
 mActivityTaskManager.onActivityManagerInternalAdded();
 mUgmInternal.onActivityManagerInternalAdded();
 mPendingIntentController.onActivityManagerInternalAdded();
 }

在start方法中,会将在构造函数中创建的一些线程进行启动。

setSystemProcess

在创建并启动完成之后,会通过setSystemProcess方法来向ServiceManager中注册一些系统相关的服务。

 public void setSystemProcess() {
 try {
 	//注册ActivityService服务
  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);
  //注册内存Binder
  ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,DUMP_FLAG_PRIORITY_HIGH);
  //注册图像Binder
  ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
  //注册SQLite DB binder
  ServiceManager.addService("dbinfo", new DbBinder(this));
  if (MONITOR_CPU_USAGE) {
  	//注册CPU使用情况的Binder
  ServiceManager.addService("cpuinfo", new CpuBinder(this),/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
  }
  //注册权限控制Binder
  ServiceManager.addService("permission", new PermissionController(this));
  //注册进程管理Binder
  ServiceManager.addService("processinfo", new ProcessInfoService(this));
  //获取“android”应用的ApplicationInfo,并装载到mSystemThread
  ApplicationInfo info = mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
  mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
  //创建ProcessRecord维护进程的相关信息
  synchronized (this) {
  ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,...);
  app.setPersistent(true);
  app.pid = MY_PID;
  app.getWindowProcessController().setPid(MY_PID);
  app.maxAdj = ProcessList.SYSTEM_ADJ;
  app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
  mPidsSelfLocked.put(app);
  mProcessList.updateLruProcessLocked(app, false, null);
  updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
  }
 } catch (PackageManager.NameNotFoundException e) {
  throw new RuntimeException(
   "Unable to find android system package", e);
 }
 }

在这个方法中会设置一些系统进程,主要功能为:

  • 注册一些服务:activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo等。
  • 获取包名为“android”的应用的ApplicationInfo对象,并将该ApplicationInfo信息安装设置到SystemThread(系统进程主线程)。即可以理解,系统也是一个特殊的应用。
  • 创建ProcessRecord维护进程的相关信息,这里MY_PID即为SystemServer进程ID。
  • 启动 检测应用运行和交互。

后续

当AMS创建并启动之后,会有一系列的后续的工作需要处理。这些操作都是在**startOtherServices()**中去调用的

 private void startOtherServices() {
  //注册系统的ContentProvider信息
  mActivityManagerService.installSystemProviders();
 
  mActivityManagerService.setWindowManager(wm);
  	mActivityManagerService.systemReady(() -> {
  ......//goingCallback
  }, BOOT_TIMINGS_TRACE_LOG);
 }

这里的主要功能是:

  • 关键服务继续进行初始化
  • 已经启动的进程,如果没有FLAG_PERSISTENT标志位,则会被kill掉
  • 运行goingCallBack
  • 启动launcher的Activity,即桌面应用。

这里继续跟踪一下goingCallBack的具体执行内容。

goingCallBack

 mActivityManagerService.systemReady(() -> {
  try {
  //启动NativeCrash的监测
  mActivityManagerService.startObservingNativeCrashes();
  } catch (Throwable e) {
  reportWtf("observing native crashes", e);
  }
  if (!mOnlyCore && mWebViewUpdateService != null) {
  webviewPrep = SystemServerInitThreadPool.get().submit(() -> {
   //启动WebView相关
   mWebViewUpdateService.prepareWebViewInSystemServer();
  }, WEBVIEW_PREPARATION);
  }

  try {
  //启动systemUI
  startSystemUi(context, windowManagerF);
  } catch (Throwable e) {
  reportWtf("starting System UI", e);
  }
  ...
 }

在这个里面会继续进行一些初始化的工作:

  • 启动NativeCrash监测
  • 启动WebView相关服务
  • 启动SystemUI

startHomeOnAllDisplays

该功能主要是进行桌面程序的启动,和AMS的启动流程关联不大,在这里不再详细进行解析。

总结:

  • AMS是在SystemServer进程中进行创建并启动的
  • 在AMS的服务启动过程中,通过构造函数进行了一些对象的创建和初始化工作(初Activity外其他3大组件的列表和调度对象的创建;内存、电池、权限、CPU等的监控等等相关对象的创建),并且通过start()方法启动服务(移除进程组、启动CPU线程、权限注册、电池服务等等)。
  • AMS创建并将对应服务启动之后,会通过setSystemProcess方法,将framework-res.apk的信息加入到SystemServer进程的LoadedApk中,并创建了SystemServer进程的ProcessRecord,加入到了mPidsSelfLocked,交给AMS来统一管理
  • AMS启动之后的后续工作,主要调用systemReady()和传入的goingCallBack来执行。主要是各种服务或者进程,等AMS启动完成后需要进一步完成的工作以及系统相关的初始化。
  • 桌面应用是在systemReady()方法中启动,systemUI是在goingCallback中完成。
  • 当桌面应用启动完成以后,发送开机广播ACTION_BOOT_COMPLETED。

以上就是Android AMS启动详解的详细内容,更多关于Android AMS启动的资料请关注Devmax其它相关文章!

Android AMS启动详解的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部