2014年的时候就研究过SurfaceFlinger 阅读源码多次 也没有搞得很清楚,这次帖到博客里面 做个记录.
SurfaceFlinger 是Android系统里面最复杂的模块,算是个框架. 今天主要把握运行流程,从ActivtyThread.java 运行Activity 然后到Activity setContentView 的执行路线.
当我们打开一个应用程序时 是通过ActivityManagerService发送请求给zygote fork一个新进程用于运行新的APP. 这个过程方式是socket通信实现的.
最终执行ActivtyThread.main方法启动一个独立消息队列进行当前apk工作.
基本结构图
我们从ActivityThread.java开始研究
先看handleLaunchActivity 运行一个Activity,首先是实例化一个Activity
Activity a = performLaunchActivity(r, customIntent); 看里面的实现
实例化Activity,是通过Instrumentation.java 实例化其实很简单
Activity activity = null;
try {
java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intent.setExtrasClassLoader(cl);
if (r.state != null) {
r.state.setClassLoader(cl);
}
} catch (Exception e) {
if (!mInstrumentation.onException(activity, e)) {
throw new RuntimeException(
"Unable to instantiate activity " + component
+ ": " + e.toString(), e);
}
}
接着下面
执行 mInstrumentation.callActivityOnCreate(activity, r.state); 也就是我们编程的入口函数onCreate方法
public void callActivityOnCreate(Activity activity, Bundle icicle) {
if (mWaitingActivities != null) {
synchronized (mSync) {
final int N = mWaitingActivities.size();
for (int i=0; i<N; i++) {
final ActivityWaiter aw = mWaitingActivities.get(i);
final Intent intent = aw.intent;
if (intent.filterEquals(activity.getIntent())) {
aw.activity = activity;
mMessageQueue.addIdleHandler(new ActivityGoing(aw));
}
}
}
}
activity.performCreate(icicle);//执行OnCreate
if (mActivityMonitors != null) {
synchronized (mSync) {
final int N = mActivityMonitors.size();
for (int i=0; i<N; i++) {
final ActivityMonitor am = mActivityMonitors.get(i);
am.match(activity, activity, activity.getIntent());
}
}
}
}
既然执行到onCreate函数方法体,那么就会执行我们的setContentView方法 视图布局加载
直接找到Activity.java 的 setContentView 方法
里面是
getWindow().setContentView(view);
然后继续找getWindow()实例对象
实例化 mWindow = PolicyManager.makeNewWindow(this); 在Activity.attach方法中初始化的
这个是在performLaunchActivity函数中调用的
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config);
继续,PolicyManager实际是 com.android.internal.policy.impl.Policy类
public Window makeNewWindow(Context context) {
return new PhoneWindow(context);
}
直接找PhoneWindow.java即可,真正进行视图初始化的在这个地方
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mContentParent.addView(view, params);
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}
在installDecor方法中初始化了一个重要的成员 DecorView
DecorView是PhoneWindow的内部类,里面包含了许多事件处理和基本UI的尺寸计算,标题等处理
我们初始化好DecorView以后 回到最前面的 ThreadActivity.java 的 handleResumeActivity 函数体
部分重要代码如下:
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l);
}
重点是wm.addView把decorView提交给WMS服务
WindowManager的初始化在Activity attach方法中 mWindowManager = mWindow.getWindowManager();
也就是WindowManagerImpl.java
实际又是 private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance(); 调用
再到WindowManagerGlobal.java addView 里面最重要的对象就是 ViewRootImpl.java
实例化
root = new ViewRootImpl(view.getContext(), display);
root.setView(view, wparams, panelParentView); 这个是重点
这个函数代码都很复杂,主要有以下几个函数比较核心
先执行
public void requestLayout() {
checkThread();
mLayoutRequested = true;
scheduleTraversals();
}
final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}
void doTraversal() {
if (mTraversalScheduled) {
mTraversalScheduled = false;
mHandler.getLooper().removeSyncBarrier(mTraversalBarrier);
if (mProfile) {
Debug.startMethodTracing("ViewAncestor");
}
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "performTraversals");
try {
performTraversals();
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
if (mProfile) {
Debug.stopMethodTracing();
mProfile = false;
}
}
}
performTraversals()方法比较复杂,而且是递归遍历视图给底层的 里面包括mSurface画布初始化,回调,遍历,调用IWindowSession给底层
surface锁定画布进行绘画. 这地方看了很多遍也不是很明白,涉及的东西比较多
需要执行 relayoutWindow,performLayout 函数 然后是performDraw进行画布绘画,锁定画布需要创建Surface对象
最终是通过IWindowSession接口与WindowManagerService 进行IPC通信把Surface数据 传递给底层SurfaceFlinger系统进行处理
下面是流程总结
下一次将介绍Native层的Surface过程,若有问题,请指出谢谢。