traceEnd();
…
}
在SystemServer中,在startBootstrapServices()中去启动了AMS
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()做的事情
-
注册服务:首先将ActivityManagerService注册到ServiceManager中,其次将几个与系统性能调试相关的服务注册到ServiceManager
-
查询并处理ApplicationInfo。首先调用PackageManagerService的接口,查询包名为android的应用程序的ApplicationInfo信息,对应于framework-res.apk。然后以该信息为参数调用ActivityThread上的installSystemApplicationInfo方法。
-
创建并处理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个 线程.
- main线程,只是程序的主线程,也是日常用到的最多的线程,也叫UI线程,因为android的组件是非线程安全的,所以只允许UI/MAIN线程来操作。
2.GC线程,java有垃圾回收机制,每个java程序都有一个专门负责垃圾回收的线程
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
答应大伙的备战金三银四,大厂面试真题来啦!
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析
资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
d,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
[外链图片转存中…(img-UVYLbVeN-1712620094597)]
腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析
[外链图片转存中…(img-qjQLWaRQ-1712620094598)]
资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-ASR3oyzv-1712620094598)]