Android系统架构
Android系统架构分层一共五层,从上到下依次是应用层、应用框架层、系统运行库层、硬件抽象层和Linux内核层。
其中Framework层也就是应用框架层
Framework系统框架层
这个层面提供所需要的Java API,主要由JAVA所编写,主要功能如下所示:
AMS
AMS就是ActivityManagerService,是Android系统的核心,管理了四大组件Activity、Service、ContentProvider、Broadcast,同时也负责管理和调度所有的进程。
AMS启动是在system_server中运行的
文件目录:/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
private void startBootstrapServices() {
//……………………
//创建ActivityTaskManagerService ActivityManagerService 并关联 mSystemServiceManager installer
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
//将服务添加到ServiceManager
mActivityManagerService.setSystemProcess();
//……………………
}
public Lifecycle(Context context) {
super(context);
//创建了AMS的实例
mService = new ActivityManagerService(context, sAtm);
}
public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
mInjector = new Injector();
mContext = systemContext;//设置context 这里的context 不是我们应用的context是framework-res.apk
mFactoryTest = FactoryTest.getMode();
//获取system_server中的ActivityThread
mSystemThread = ActivityThread.currentActivityThread();
mUiContext = mSystemThread.getSystemUiContext();
Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
//创建处理消息的线程和Handler
mHandlerThread = new ServiceThread(TAG,
THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
mHandler = new MainHandler(mHandlerThread.getLooper());
mUiHandler = mInjector.getUiHandler(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);
//管理ContentProvider的对象
mProviderMap = new ProviderMap(this);
mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);
//获取系统目录
final File systemDir = SystemServiceManager.ensureSystemDir();
//创建电池状态管理的service
mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,
BackgroundThread.get().getHandler());
//创建进程状态管理的服务
mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);
mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
//创建UserController
mUserController = new UserController(this);
mPendingIntentController = new PendingIntentController(
mHandlerThread.getLooper(), mUserController);
if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) {
mUseFifoUiScheduling = true;
}
mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
//赋值ActivityTaskManagerService
mActivityTaskManager = atm;
//进行初始化
mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
DisplayThread.get().getLooper());
mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
//创建CPU的统计线程
mProcessCpuThread = new Thread("CpuTracker") {
@Override
public void run() {
synchronized (mProcessCpuTracker) {
mProcessCpuInitLatch.countDown();
mProcessCpuTracker.init();
}
while (true) {
try {
try {
synchronized(this) {
final long now = SystemClock.uptimeMillis();
long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
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);
}
}
}
};
mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext);
//添加到看门狗 进行检测
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
try {
Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(),
Process.THREAD_GROUP_SYSTEM);
Process.setThreadGroupAndCpuset(
mOomAdjuster.mAppCompact.mCompactionThread.getThreadId(),
Process.THREAD_GROUP_SYSTEM);
} catch (Exception e) {
Slog.w(TAG, "Setting background thread cpuset failed");
}
}
private void start() {
removeAllProcessGroups();
//开启cpu线程
mProcessCpuThread.start();
//把电池状态管理添加到ServiceManager中
mBatteryStatsService.publish();
//把AppOpsService添加到ServiceManager中
mAppOpsService.publish(mContext);
Slog.d("AppOps", "AppOpsService published");
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
mActivityTaskManager.onActivityManagerInternalAdded();
mUgmInternal.onActivityManagerInternalAdded();
mPendingIntentController.onActivityManagerInternalAdded();
// Wait for the synchronized block started in mProcessCpuThread,
// so that any other access to mProcessCpuTracker from main thread
// will be blocked during mProcessCpuTracker initialization.
try {
mProcessCpuInitLatch.await();
} catch (InterruptedException e) {
Slog.wtf(TAG, "Interrupted wait during start", e);
Thread.currentThread().interrupt();
throw new IllegalStateException("Interrupted wait during start");
}
}
public static ActivityManagerService startService(
SystemServiceManager ssm, ActivityTaskManagerService atm) {
sAtm = atm;
//反射创建,并添加到mServices中,调用onStart函数
return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
}
private void startOtherServices() {
//……………………
// 调用 AMS 的 systemReady
mActivityManagerService.systemReady(...);
}
通过反射构建了ActivityManagerService.Lifecycle
对象,初始化了管理四大组件的对象以及一些服务。然后调用setSystemProcess
。
public void setSystemProcess() {
try {
//添加自己到ServiceManager
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);
//添加 MemBinder,是用来dump每个进程内存信息的服务
ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_HIGH);
//添加GraphicsBinder 可以获取每个进程图形加速的服务
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
//添加 DbBinder 获取每个进程数据库的服务
ServiceManager.addService("dbinfo", new DbBinder(this));
if (MONITOR_CPU_USAGE) {
ServiceManager.addService("cpuinfo", new CpuBinder(this),
/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
}
//权限服务
ServiceManager.addService("permission", new PermissionController(this));
//进程相关信息
ServiceManager.addService("processinfo", new ProcessInfoService(this));
//获取到当前的ApplicationInfo 也就是framework-res.apk
ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
"android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
synchronized (this) {
//把system_server添加到AMS的process管理者中
ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
false,
0,
new HostingRecord("system"));
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);
}
//应用启动的监听
mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
new IAppOpsCallback.Stub() {
@Override public void opChanged(int op, int uid, String packageName) {
if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
if (mAppOpsService.checkOperation(op, uid, packageName)
!= AppOpsManager.MODE_ALLOWED) {
runInBackgroundDisabled(uid);
}
}
}
});
}
在systemProcess
中,又注册了一些服务,获取到了当前的ApplicationInfo
对象,然后把ApplicationInfo
转换成ProcessRecord
对象,添加到AMS
的mPidsSelfLocked
管理中。接着在system_server
的startOtherServices
中调用了systemReady
。
在systemReady
中,调用了ATMS(ActivityTaskManagerService)
的onSystemReady
,以及AppopsService
、UserController
进行初始化工作,接着从mPidsSelfLocked
集合中查找非FLAG_PERSISTENT
标志的进程,并且进行清理。开启需要开机启动的应用( android:persistent
),接着开启Launcher
,发送ACTION_USER_STARTED
和ACTION_USER_STARTING
广播。这个标记和PMS
相关了,简单看一下就是在updatePackagesIfNeeded . getPackagesForDexopt的方法中发送一个ACTION_PRE_BOOT_COMPLETED的广播,如果应用相应这个广播并且加入FLAG_PERSISTENT标志,就可以存活下来。对接收这个广播的package加载要优先于systemReady,也就是优先其他package的加载。用于开机优先打开的app flag_persistent/