---------------------------------------------------些许废话-------------------------------------------------------------------
1.个人笔记用,尽量对其他访客阅读友好
2.UML图不是很熟,各位能看到大概顺序意思就好,见谅
以前一个同事给我们培训Input子系统的时候就说过一句话:对于一个子系统的介绍,你只要给人一张时序图让人家自己追下流程就好了,这就是传承。我很赞同,所以本篇文字基本可以视为给我做复习用,建议各位跟着流程走读遍代码,做到心中有数。
3.代码基于Android O AOSP
4.技术有限,如有贻笑大方地方还请再评论中指正
--------------------------------------------------------------------------------------------------------------------------------
进入正题,开机后驱动内核怎么处理的我不知道,这篇文章也不会涉及到Native层代码分析,各位有兴趣可以找找资料。
开机后会启动zygote,Android是基于linux的,每一个程序一般都是一个进程,除此以外,Android中有两个进程非常重要,一个就是zygote,这是个什么玩意呢,如字面意思,所有的其他进程都是从zygote fork出来的,应该是出于资源复用考虑。另外一个是SystemServer.SystemServer负责启动管理android中各种Service。
看图
SystemServer的run方法都做些什么呢,我个人认为比较重要的有以下几点:
1.初始化SystemClock、SystemProperties的一些属性值
2.调用当前线程的Looper.prepareMainLooper();
3.初始化系统上下文
说时候,这块之前还真没注意到,挺有意思的。
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
ActivityThread我们后面介绍,大家暂时知道有这么回事就行了。
4.初始化SystemServiceManager
5.调用startBootstrapServices(),startCoreServices(),startOtherServices()启动类似AMS,PMS,PowerManagerService等系统服务
从源码就可以看到SystemServer是通过调用SystemServiceManager的方法来完成启动Service工作的
traceBeginAndSlog("StartActivityManager"); mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
startService有几个重载,比较重要的代码片段如下:
public <T extends SystemService> T startService(Class<T> serviceClass) {
...
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
...
startService(service);
return service;
}
public void startService(@NonNull final SystemService service) {
...
mServices.add(service);
service.onStart();
...
}
可以看到SystemServeiceManager 内部维护了一个mServices的ArrayList,已经启动的Service都会添加进去。
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>()
另外startService也会调用service的onStart()方法。
前面我们已经看到传给SystemServiceManager的是一个叫Lifecycle的内部类,它的内部持有自己外部Service的对象,对我们现在分析而言,就是AMS了,此时调用它的onStart方法,会调用AMS的start方法
private final ActivityManagerService mService;
@Override
public void onStart() {
mService.start();
}
AMS的start方法如下
private void start() {
removeAllProcessGroups();
mProcessCpuThread.start();
mBatteryStatsService.publish();
mAppOpsService.publish(mContext);
Slog.d("AppOps", "AppOpsService published");
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
// Wait for the synchronized block started in mProcessCpuThread,
// so that any other acccess to mProcessCpuTracker from main thread
// will be blocked during mProcessCpuTracker initialization.
/// M: ANR Debug Mechanism
mAnrManager.startAnrManagerService(MY_PID);
try {
mProcessCpuInitLatch.await();
} catch (InterruptedException e) {
Slog.wtf(TAG, "Interrupted wait during start", e);
Thread.currentThread().interrupt();
throw new IllegalStateException("Interrupted wait during start");
}
}
至此,AMS已经被启动。
然后我们再看看点击桌面图标后会发生什么。
首先我们要明确,桌面也是一个Apk.不对ROM的Launcher不一样,所以我们以AOSP的桌面Launcher3为例分析。
Launcher3的入口Activity是Launcher.java,追踪代码可以看到它的布局文件是launcher.xml
这个xml包含all_apps.xml,仔细看看,有个叫AllAppsRecyclerView的id为apps_list_view。是不是觉得应该就是它了,去看看。追踪发送桌面的App图标都是一个叫BubbleTextView的控件。返回Launcher.java,从createShortcut方法代码可以看出,图标的点击事件在Launcher的onClick中处理了
public View createShortcut(ViewGroup parent, ShortcutInfo info) {
BubbleTextView favorite = (BubbleTextView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.app_icon, parent, false);
favorite.applyFromShortcutInfo(info);
favorite.setOnClickListener(this);
favorite.setOnFocusChangeListener(mFocusHandler);
return favorite;
}
从时序图可以看到。实际上最后还是调用了Activity.startActivity方法。另外注意下,此时的Flag是Intent.FLAG_ACTIVITY_NEW_TASK,这也是很合理的。
OK,这篇到此结束,下篇我们追踪Activity的startActivity方法系统内是怎么处理的。