Android的ActivityManagerService(简称AMS) 源码分析

文章详细描述了在Android系统中,如何通过ActivityManagerService的startService方法启动AMS服务,涉及类的构造、反射创建服务实例以及服务生命周期管理。此外,文章还提及了AMS的初始化步骤,包括设置系统进程、管理服务、广播队列等关键组件的初始化过程。
摘要由CSDN通过智能技术生成

private void startBootstrapServices() { …

// Activity manager runs the show.

traceBeginAndSlog(“StartActivityManager”);

//启动了AMS

mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService();

mActivityManagerService.setSystemServiceManager(mSystemServiceManager);

mActivityManagerService.setInstaller(installer); traceEnd(); …

// Now that the power manager has been started, let the activity manager

// initialize power management features.

traceBeginAndSlog(“InitPowerManagement”);

mActivityManagerService.initPowerManagement();

traceEnd();

// Set up the Application instance for the system process and get started.

traceBeginAndSlog(“SetSystemProcess”);

mActivityManagerService.setSystemProcess();

traceEnd();

}

AMS是通过SystemServiceManager.startService去启动的,参数是 ActivityManagerService.Lifecycle.class, 首先看看startService方法.

@SuppressWarnings(“unchecked”)

public SystemService startService(String className) {

final Class serviceClass;

try {

serviceClass = (Class)Class.forName(className);

} catch (ClassNotFoundException ex) {

Slog.i(TAG, "Starting " + className);

throw new RuntimeException("Failed to create service " + className

  • ": service class not found, usually indicates that the caller should "

  • "have called PackageManager.hasSystemFeature() to check whether the "

  • "feature is available on this device before trying to start the "

  • “services that implement it”, ex);

}

return startService(serviceClass);

}

@SuppressWarnings(“unchecked”)

public T startService(Class serviceClass) {

try {

final String name = serviceClass.getName();

Slog.i(TAG, "Starting " + name);

Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);

// Create the service.

if (!SystemService.class.isAssignableFrom(serviceClass)) {

throw new RuntimeException("Failed to create " + name

  • ": service must extend " + SystemService.class.getName());

}

final T service;

try {

Constructor 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);

}

}

public void startService(@NonNull final SystemService service) {

// Register it.

mServices.add(service);

// Start it.

long time = SystemClock.elapsedRealtime();

try {

service.onStart();

} catch (RuntimeException ex) {

throw new RuntimeException("Failed to start service " + service.getClass().getName()

  • “: onStart threw an exception”, ex);

}

warnIfTooLong(SystemClock.elapsedRealtime() - time, service, “onStart”);

}

startService方法很简单,是通过传进来的class然后反射创建对应的service服务。所以此处创建的是Lifecycle的实例, 然后通过startService启动了AMS服务. 再去看看ActivityManagerService.Lifecycle这个类的构造方法.

public static final class Lifecycle extends SystemService {

private final ActivityManagerService mService;

public Lifecycle(Context context) {

super(context);

mService = new ActivityManagerService(context);

}

@Override

public void onStart() {

mService.start();

}

@Override

public void onBootPhase(int phase) {

mService.mBootPhase = phase;

if (phase == PHASE_SYSTEM_SERVICES_READY) {

mService.mBatteryStatsService.systemServicesReady();

mService.mServices.systemServicesReady();

}

}

@Override

public void onCleanupUser(int userId) {

mService.mBatteryStatsService.onCleanupUser(userId);

}

public ActivityManagerService getService() {

return mService;

}

}

AMS初始化做了很多操作,具体的可以去看看ActivityManagerService,

具体的有

  • mSystemThread = ActivityThread.currentActivityThread();//获取当前的 ActivityThread

  • mUiContext = mSystemThread.getSystemUiContext();//赋值mUiContext

  • 创建Handler线程,用来处理handler消息

  • mUiHandler = mInjector.getUiHandler(this);//处理ui相关msg的Handler

  • 管理AMS的一些常量,厂商定制系统就可能修改此处 mConstants = new ActivityManagerConstants(this, mHandler)

  • 初始化管理前台、后台广播的队列, 系统会优先遍历发送前台广播 mFgBroadcastQueue = new BroadcastQueue(this, mHandler, “foreground”, BROADCAST_FG_TIMEOUT, false);

  • 初始化管理Service的 ActiveServices对象 mServices = new ActiveServices(this);

  • mProviderMap = new ProviderMap(this);//初始化Provider的管理者

  • mAppErrors = new AppErrors(mUiContext, this);//初始化APP错误日志的打印器

  • 创建电池统计服务, 并输出到指定目录 File dataDir = Environment.getDataDirectory();

  • 创建进程统计分析服务,追踪统计哪些进程有滥用或不良行为 : mBatteryStatsService.getActiveStatistics().getIsOnBattery();

  • 加载Uri的授权文件 mGrantFile = new AtomicFile(new File(systemDir, “urigrants.xml”), “uri- grants”);

  • 负责管理多用户 mUserController = new UserController(this);

  • vr功能的控制器 mVrController = new VrController(this);

  • 初始化OpenGL版本号

  • 管理ActivityStack的重要类,这里面记录着activity状态信息,是AMS中的核心类 mStackSupervisor = createStackSupervisor();

  • //根据当前可见的Activity类型,控制Keyguard遮挡,关闭和转换。 Keyguard就是我们的锁 屏相关页面mKeyguardController = mStackSupervisor.getKeyguardController();

  • 管理APK的兼容性配置 解析/data/system/packages-compat.xml文件,该文件用于存储那些需要考虑屏幕尺寸的APK信 息,mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);

  • Intent防火墙,Google定义了一组规则,来过滤intent,如果触发了,则intent会被系统丢 弃,且不会告知发送者 mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);

  • 这是activity启动的处理类,这里管理者activity启动中用到的intent信息和flag标识,也 和stack和task有重要的联系 mActivityStartController = new ActivityStartController(this);

  • 启动一个线程专门跟进cpu当前状态信息,AMS对当前cpu状态了如指掌,可以更加高效的安排其他工 作

  • 看门狗,监听进程。这个类每分钟调用一次监视器。 如果进程没有任何返回就杀掉 Watchdog.getInstance().addMonitor(this)

  • 等待mProcessCpuThread完成初始化后, 释放锁,初始化期间禁止访问 mProcessCpuInitLatch.await()

setSystemProcess()做的事情
  1. 注册服务:首先将ActivityManagerService注册到ServiceManager中,其次将几个与系统性能调试相关的服务注册到ServiceManager

  2. 查询并处理ApplicationInfo。首先调用PackageManagerService的接口,查询包名为android的应用程序的ApplicationInfo信息,对应于framework-res.apk。然后以该信息为参数调用ActivityThread上的installSystemApplicationInfo方法。

  3. 创建并处理ProcessRecord。调用ActivityManagerService上的newProcessRecordLocked,创建一个ProcessRecord类型的对象,并保存该对象的信息

AMS是什么?

1.从java角度来看,ams就是一个java对象,实现了Ibinder接口,所以它是一个用于进程之间通信的

接口,这个对象初始化是在systemServer.java 的run()方法里面.

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

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

如果我们启动一个hello World安卓用于程序,里面不另外启动其他线程,这个里面最少要启动4个 线程.

  1. main线程,只是程序的主线程,也是日常用到的最多的线程,也叫UI线程,因为android的组件是非线程安全的,所以只允许UI/MAIN线程来操作。

2.GC线程,java有垃圾回收机制,每个java程序都有一个专门负责垃圾回收的线程

3.Binder1 就是我们的ApplicationThread,这个类实现了Ibinder接口,用于进程之间通信,具体 来说,就是我们程序和AMS通信的工具

4.Binder2 就是我们的ViewRoot.W对象,他也是实现了IBinder接口,就是用于我们的应用程序和 wms通信的工具。

wms就是WindowManagerServicer ,和ams差不多的概念,不过他是管理窗口的系统服务。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

【Android 详细知识点思维脑图(技能树)】

image

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在GitHub:Android架构视频+BAT面试专题PDF+学习笔记​

看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-TmJUTsfz-1710825294664)]

详细整理在GitHub:Android架构视频+BAT面试专题PDF+学习笔记​

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值