美文网首页APP & program
Android系统组件之AWS启动流程

Android系统组件之AWS启动流程

作者: 安安_660c | 来源:发表于2022-10-25 13:51 被阅读0次

AMS的主要功能:
组件状态管理
组件状态查询
Task管理
其他辅助功能,例如统计系统运行时信息等。

关于ActivityManager:
ActivityManager:AMS给客户端调用的接口。
ActivityManagerNative:该类是ActivityManagerServicel的父类,继承与Binder,主要用来负责进程通信,接收ActivityManager传递过来的信息,这么写可以将通信部分分离在ActivityManagerNative,使得ActivityManagerService可以专注组件的调度,减小了类的体积。
ActivityManagerProxy:该类定义在ActivityManagerNative内部,正如它的名字那样,它是ActivityManagerServicel的代理类,
Activity、Service、BroadcastReceiver的启动、切换、调度都有着相似的流程,我们来看一下。

Activity启动主要角色有:

·Instrumentation:监控应用与系统相关的交互行为。
·AMS:组件管理调度中心,什么都不干,但是什么都管。
·ActivityStarter:处理Activity什么时候启动,怎么样启动相关问题,也就是处理Intent.与Flag相关问题,平时提到的启动模式都可以在这里找到实现。
·ActivityStackSupervisior:这个类的作用你从它的名字就可以看出来,它用来管理Stacki和Task。
·ActivityStack:用来管理栈里的Activity。
·ActivityThread:最终干话的人,是ActivityThread的内部类,Activity、Service、BroadcastReceiverl的启动、切换、调度等各种操作都在这个类里完成。

Service启动主要角色有:

·AMS:组件管理调度中心,什么都不干,但是什么都管。
·ApplicationThread:最终干话的人,是ActivityThread的内部类,Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。
·ActiveServices:主要用来管理Service,内部维护了三份列表:将启动Service?列表、重启Service列表以及以销毁Service列表。
BroadcastReceiver的启动流程图(放大可查看)如下所示:

BroadcastReceiver启动主要角色有:

·AMS:组件管理调度中心,什么都不干,但是什么都管。
·BroadcastQueue:广播队列,根据广播的优先级来管理广播。
·ApplicationThread:最终干话的人,是ActivityThread的内部类,Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。
·ReceiverDispatcher:广播调度中心,采用反射的方式获取BroadcastReceiver的实例,然后调用它的onReceive(O方法.
可以发现,除了一些辅助类外,最主要的组件管家AMS和应用主线程ActivityThread。

AWS启动流程

我们知道所有的系统服务都是在SystemServerl的run()方法里启动的,SystemServer将系统服务分为了三类:
引导服务
核心服务
其他服务
ActivityManagerService属于引导服务,在startBootstrapServices()方法里被创建。

private void startBootstrapServices(){
/Wait for installd to finish starting up so that it has a chance to
/create critical directories such as /data/user with the appropriate
/permissions.We need this to complete before we initialize other services.
Installer installer mSystemServiceManager.startService(Installer.class);
/Activity manager runs the show.
/启动AMS服务
mActivityManagerService mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
/设置AMS系统服务管理器
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
//设施AMS的App安装器
mActivityManagerService.setInstaller(installer);
mActivityManagerService.initPowerManagement();
/Set up the Application instance for the system process and get started.
//注册AMS等服务
mActivityManagerService.setSystemProcess();

}

SystemServiceManager的startService()方法利用反射来创建对象,Lifecycle是ActivityManagerService!里的静态内部类,它继承于SystemService,在它的构造方法里它会调用ActivityManagerServicel的构造方法创建ActivityManagerService对象。

public static final class Lifecycle extends SystemService
private final ActivityManagerService mService;
public Lifecycle(Context context){
super(context);
mService new ActivityManagerservice(context);
QOverride
public void onStart(){
mService.start();
public ActivityManagerService getService()
return mService;
}

构造服务

ActivityManagerService的构造方法如下所示:

/Note:This method is invoked on the main thread but may need to attach various
/handlers to other threads.So take care to be explicit about the looper.
public ActivityManagerService(Context systemContext){
mContext systemContext;
mFactoryTest FactoryTest.getMode();
//ActivityThread类型变量,指向当前的ActivityThread
mSystemThread ActivityThread.currentActivityThread();
Slog.i(TAG,"Memory class:"ActivityManager.staticGetMemoryclass());
//ServiceThread:继承于HandlerThread,专为AwS服务创建的HandlerThread。线程名是ActivityMan
mHandlerThread new ServiceThread(TAG,
android.os.Process.THREAD PRIORITY FOREGROUND,fal
mHandlerThread.start();
mHandler new MainHandler(mHandlerThread.getLooper());
mUiHandler=new UiHandler();//处理UI相关操作的Handler
/static;one-time init here *
if (sKillHandler =null){
sKillThread new ServiceThread(TAG "kill",
android.os.Process.THREAD_PRIORITY_BACKGROUND,tr
sKillThread.start();
/处理KILL PROCESS GROUP MSG消息,处理进程查杀相关的事情
sKillHandler new KillHandler(sKillThread.getLooper());
/前台广播队列
mFgBroadcastQueue new BroadcastQueue(this,mHandler,
"foreground",BROADCAST_FG_TIMEOUT,false);
//后台广播队列
mBgBroadcastQueue new BroadcastQueue(this,mHandler,
"background",BROADCAST_BG_TIMEOUT,true);
mBroadcastQueues[]mFgBroadcastQueue;
mBroadcastQueues[1]mBgBroadcastQueue;
//管理Service
mServices new ActiveServices(this);
//管理ContentProvider
mProviderMap new ProviderMap(this);
//控制应用程序的错误条件
mAppErrors new AppErrors(mContext,this);
/TODO:Move creation of battery stats service outside of activity manager service.
File dataDir Environment.getDataDirectory();
File systemDir new File(dataDir,"system");
systemDir.mkdirs();
//电量统计服务
mBatteryStatsService new BatteryStatsService(systemDir,mHandler);
mBatteryStatsService.getActiveStatistics().readLocked();
mBatteryStatsService.scheduleWriteToDisk();
mOnBattery DEBUG_POWER true
mBatteryStatsService.getActiveStatistics().getIsOnBattery();
mBatteryStatsService.getActiveStatistics().setCallback(this);
//进程统计服务,数据存放在data/system/procestats中
mProcessStats new ProcessstatsService(this,new File(systemDir,"procstats"));
//应用操作服务
mAppOpsService new AppopsService(new File(systemDir,"appops.xml"),mHandler);
mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND,null,
new IAppOpsCallback.Stub(){
@Override public void opChanged(int op,int uid,
if (op =AppOpsManager.OP_RUN_IN_BACKGROUND
if (mAppOpsService.checkOperation(op,ui
!AppOpsManager.MODE_ALLOWED){
runInBackgroundDisabled(uid);
}
})
mGrantFile new AtomicFile(new File(systemDir,"urigrants.xml"));
mUserController new UserController(this);
GL_ES_VERSION SystemProperties.getInt("ro.opengles.version",
ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
mTrackingAssociations "1".equals(SystemProperties.get("debug.track-associations"));
mConfiguration.setToDefaults();
mConfiguration.setLocales(LocaleList.getDefault());
mConfigurationSeq mConfiguration.seq 1;
mProcessCpuTracker.init();
mCompatModePackages new CompatModePackages(this,systemDir,mHandler);
mIntentFirewall new IntentFirewall(new IntentFirewallInterface(),mHandler);
//构建ActivityStackSupervisor对象
mStackSupervisor new ActivityStackSupervisor(this);
mActivityStarter new ActivityStarter(this,mStackSupervisor);
mRecentTasks new RecentTasks(this,mStackSupervisor);
//统计CPU的使用情况
mProcessCpuThread new Thread("CpuTracker"){
@Override
public void run(){
while (true){
try
try
synchronized(this){
final long now SystemClock.uptimeMillis();
long nextCpuDelay (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)
long nextWriteDelay (mLastWriteTime+BATTERY_STATS_TIME)-now
//Slog.i(TAG,"Cpu delay="+nextCpuDelay
//
+"write delay="+nextWriteDelay);
if (nextWriteDelay nextCpuDelay){
nextCpuDelay nextWriteDelay;
}
if (nextCpuDelay 0){
mProcessCpuMutexFree.set(true);
this.wait(nextCpuDelay);
}
catch (InterruptedException e){
updateCpustatsNow();
catch (Exception e){
Slog.e(TAG,"Unexpected exception collecting process stats",e);
}
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
}

我们来看看AMS在构造方法中创建了哪些东西:
·ServiceThread:对应MainHandler,线程名是ActivityManager,主要用来处理组件调度相关操作。
·UiThread:对应UIHandler,线程名是ndroid.ui,主要用来处理U川相关操作,
BroadcastQueue mFgBroadcastQueue:
BroadcastQueue mBgBroadcastQueue

注册服务

构造好AMS服务之后,接着就是调用AMS.setSystemProcess方法注册服务了。

public void setSystemProcess(){
try
//注册activity服务
ServiceManager.addService(Context.ACTIVITY_SERVICE,this,true);
ServiceManager.addService(Processstats.SERVICE_NAME,mProcessstats);
ServiceManager.addService("meminfo",new MemBinder(this));
ServiceManager.addService("gfxinfo",new GraphicsBinder(this));
ServiceManager.addService("dbinfo",new DbBinder(this));
if (MONITOR_CPU_USAGE){
ServiceManager.addService("cpuinfo",new CpuBinder(this));
}
ServiceManager.addService("permission",new PermissionController(this));
ServiceManager.addService("processinfo",new ProcessInfoService(this));
ApplicationInfo info mContext.getPackageManager().getApplicationInfo(
"android",STOCK_PM_FLAGS MATCH_SYSTEM_ONLY);
mSystemThread.installSystemApplicationInfo(info,getclass().getclassLoader());
synchronized (this){
/构造进程快照
ProcessRecord app newProcessRecordLocked(info,info.processName,false,0);
app.persistent true;
app.pid MY_PID;
app.maxAdj=ProcessList.SYSTEM_ADJ;
app.makeActive(mSystemThread.getApplicationThread(),mProcessstats);
synchronized (mPidsSelfLocked){
mPidsSelfLocked.put(app.pid,app);
updateLruProcessLocked(app,false,null);//维护进程LRU
updateOomAdjLocked();/更新adj值;
catch (PackageManager.NameNotFoundException e){
throw new RuntimeException(
"Unable to find android system package",e);
}

注册服务的过程主要做了两件事情:
I.注册activity、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo等服务.
2.构建进程快照ProcesRecord,记录进程相关信息。并维护进程的lru缓存,更新adj值。

来自:https://www.yuque.com/beesx/beesandroid/pi7qpx

相关文章

网友评论

    本文标题:Android系统组件之AWS启动流程

    本文链接:https://www.haomeiwen.com/subject/gjbozrtx.html