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()); } } } }
直接找到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(); } }
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); }
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过程,若有问题,请指出谢谢。