Android Framework学习笔记(七)AMS全家桶(1)

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

SystemServer#main()

public static void main(String[] args) {

new SystemServer().run();

}

SystemServer#run()

private void run() {

System.loadLibrary(“android_servers”);//1

mSystemServiceManager = new SystemServiceManager(mSystemContext);//2

LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

try {

Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, “StartServices”);

startBootstrapServices();//3

startCoreServices();//4

startOtherServices();//5

} catch (Throwable ex) {

Slog.e(“System”, “******************************************”);

Slog.e(“System”, “************ Failure starting system services”, ex);

throw ex;

} finally {

Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

}

}

注释1处加载了libandroid_servers.so。

注释2处创建SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理。启动系统的各种服务。

注释3中的startBootstrapServices函数中用SystemServiceManager启动了ActivityManagerService、PowerManagerService、PackageManagerService等服务。

注释4处的函数中则启动了BatteryService、UsageStatsService和WebViewUpdateService。

注释5处的startOtherServices函数中则启动了CameraService、AlarmManagerService、VrManagerService等服务,这些服务的父类为SystemService。

SystemServer#startBootstrapServices()

private void startBootstrapServices() {

Installer installer = mSystemServiceManager.startService(Installer.class);

// Activity manager runs the show.

mActivityManagerService = mSystemServiceManager.startService(

ActivityManagerService.Lifecycle.class).getService();//1

mActivityManagerService.setSystemServiceManager(mSystemServiceManager);

mActivityManagerService.setInstaller(installer);

mActivityManagerService.setSystemProcess(); //2

}

注释1处调用了SystemServiceManager的startService方法,方法的参数是ActivityManagerService.Lifecycle.class。

注释2调用了ActivityManagerService的setSystemProcess方法。

frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

SystemServiceManager#startService()

@SuppressWarnings(“unchecked”)

public T startService(Class serviceClass) {

try {

final T service;

try {

Constructor constructor = serviceClass.getConstructor(Context.class);//1

service = constructor.newInstance(mContext);//2

} catch (InstantiationException ex) {

}

// Register it.

mServices.add(service);//3

// Start it.

try {

service.onStart();//4

} catch (RuntimeException ex) {

throw new RuntimeException("Failed to start service " + name

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

}

return service;

} finally {

Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

}

}

startService方法传入的参数是Lifecycle.class,Lifecycle继承自SystemService。

注释1处得到传进来的Lifecycle的构造器constructor。

注释2处通过反射来创建Lifecycle类型的service对象。

注释3处将刚创建的service添加到ArrayList类型的mServices对象中来完成注册。

注释4处调用service的onStart方法来启动service,并返回该service。

Lifecycle

public static final class Lifecycle extends SystemService {

private final ActivityManagerService mService;

public Lifecycle(Context context) {

super(context);

mService = new ActivityManagerService(context);//1

}

@Override

public void onStart() {

mService.start();//2

}

public ActivityManagerService getService() {

return mService;//3

}

}

上面的代码结合SystemServiceManager的startService方法来分析,当通过反射来创建Lifecycle实例时,会调用注释1处的方法创建AMS实例,当调用Lifecycle类型的service的onStart方法时,实际上是调用了注释2处AMS的start方法。

在SystemServer的startBootstrapServices方法的注释1处,调用了如下代码:

mActivityManagerService = mSystemServiceManager.startService(

ActivityManagerService.Lifecycle.class).getService();

我们知道SystemServiceManager的startService方法最终会返回Lifecycle类型的对象,紧接着又调用了Lifecycle的getService方法,这个方法会返回AMS类型的mService对象,见注释3处,这样AMS实例就会被创建并且返回。

继续来看看SystemServer中startBootstrapServices()方法的注释2:

public void setSystemProcess() {

try {

ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true); //1

ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);

ServiceManager.addService(“meminfo”, new MemBinder(this));

ServiceManager.addService(“gfxinfo”, new GraphicsBinder(this));

}

} catch (PackageManager.NameNotFoundException e) {

throw new RuntimeException(

“Unable to find android system package”, e);

}

}

注释1中的Context.ACTIVITY_SERVICE=“activity”,注释1就是把ActivityManagerService实例注册到ServiceManager中。ServiceManager用来管理系统中的各种Service,用系统C/S架构中的Binder机制通信,Client端要使用某个Service,则需要先到ServiceManager查询Service的相关信息,然后根据Service的相关信息与Service所在的Server进程建立通讯通路,这样Client端就可以使用Service了。

IBinder b = ServiceManager.getService(“activity”); //查询

AMS与应用进程启动


在Framework学习(二)Zygote进程启动过程这篇文章中,我们说过Zygote进程会创建一个服务器端Socket,并监听Socket来等待客户端请求创建新的应用程序进程。要启动一个应用程序,首先要保证这个应用程序的进程已经被启动。AMS在启动应用程序时会检查这个应用程序的进程是否存在,不存在就会请求Zygote进程将应用程序进程启动。

在Framework学习(五)应用程序启动过程这篇文章,我们说过应用程序启动时会走到ActivityStackSupervisor的startSpecificActivityLocked函数启动指定的ActivityRecored。

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

ActivityStackSupervisor#startSpecificActivityLocked()

void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {

//1

ProcessRecord app = mService.getProcessRecordLocked(r.processName, r.info.applicationInfo.uid, true);

r.task.stack.setLaunchTime®;

if (app != null && app.thread != null) {

try {

if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0 || !“android”.equals(r.info.packageName)) {

app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode, mService.mProcessStats);

}

realStartActivityLocked(r, app, andResume, checkConfig); //2

return;

} catch (RemoteException e) {

Slog.w(TAG, "Exception when starting activity " + r.intent.getComponent().flattenToShortString(), e);

}

}

//3

mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, “activity”, r.intent.getComponent(), false, false, true);

}

ActivityStackSupervisor#getProcessRecordLocked()

final ProcessRecord getProcessRecordLocked(String processName, int uid, boolean keepIfLarge) {

if (uid == Process.SYSTEM_UID) {

// The system gets to run in any process. If there are multiple

// processes with the same uid, just pick the first (this

// should never happen).

SparseArray procs = mProcessNames.getMap().get(processName);

if (procs == null) return null;

}

}

注释1处获取当前Activity所在的进程的ProcessRecord,如果进程已经启动了,会执行注释2处的代码。否则执行注释3的代码。

注释2处调用realStartActivityLocked来启动应用程序。

注释3处调用AMS的startProcessLocked来启动应用程序进程。关于应用程序进程的启动我们可以看Framework学习(六)应用程序进程启动过程这篇文章。

AMS家族


ActivityManager是一个和AMS相关联的类,它主要是对运行中的Activity进行管理,这些管理工作并不是由ActivityManager自己来处理,而是交由AMS来处理,ActivityManager中的方法会通过ActivityManagerNative(以后简称AMN)的getDefault方法来得到ActivityManagerProxy(以后简称AMP),通过AMP就可以和AMN进行通信,而AMN是一个抽象类,它会将功能交由它的子类AMS来处理,因此,AMP就是AMS的代理类。AMS作为系统核心服务,很多API是不会暴露给ActivityManager的,因此ActivityManager并不算是AMS家族一份子。

下面以Activity启动的例子看一下AMS家族的调用。Framework学习(五)应用程序启动过程一文中我们简单讲过AMS中Binder机制,本文我们继续总结一下。

Activity启动过程中会调用Instrumentation的execStartActivity方法。

frameworks/base/core/java/android/app/Instrumentation.java

Instrumentation#execStartActivity()

public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) {

try {

intent.migrateExtraStreamToClipData();

intent.prepareToLeaveProcess(who);

//1

int result = ActivityManagerNative.getDefault().startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);

checkStartActivityResult(result, intent);

} catch (RemoteException e) {

throw new RuntimeException(“Failure from system”, e);

}

return null;

}

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

intent);

} catch (RemoteException e) {

throw new RuntimeException(“Failure from system”, e);

}

return null;

}

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

[外链图片转存中…(img-DalpnAsp-1714276673392)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值