Android View系统

我来为您全面剖析Android View系统,从应用层一直追踪到Framework层和内核层。

## 1. Android View系统架构概览

```

┌─────────────────────────────────────────┐

│        Application Layer              │

│    (Activity/Fragment/View)            │

├─────────────────────────────────────────┤

│        Framework Layer                │

│  (ViewRootImpl/WindowManager/Surface)  │

├─────────────────────────────────────────┤

│        Native Layer                    │

│  (SurfaceFlinger/OpenGL/Skia)          │

├─────────────────────────────────────────┤

│        HAL Layer                      │

│    (Gralloc/HWComposer)                │

├─────────────────────────────────────────┤

│        Kernel Layer                    │

│    (Display Driver/GPU Driver)          │

└─────────────────────────────────────────┘

```

## 2. View创建和显示流程

### 2.1 应用层View创建

```java

// Activity.java

public void setContentView(int layoutResID) {

    getWindow().setContentView(layoutResID);

    initWindowDecorActionBar();

}

// PhoneWindow.java

@Override

public void setContentView(int layoutResID) {

    if (mContentParent == null) {

        installDecor();  // 创建DecorView

    }

    // 解析布局文件

    mLayoutInflater.inflate(layoutResID, mContentParent);

}

```

### 2.2 ViewRootImpl创建

```java

// WindowManagerGlobal.java

public void addView(View view, ViewGroup.LayoutParams params,

            Display display, Window parentWindow) {

    ViewRootImpl root;

    View panelParentView = null;


    synchronized (mLock) {

        // 创建ViewRootImpl

        root = new ViewRootImpl(view.getContext(), display);

        view.setLayoutParams(wparams);


        mViews.add(view);

        mRoots.add(root);

        mParams.add(wparams);


        // 将DecorView交给ViewRootImpl

        root.setView(view, wparams, panelParentView);

    }

}

```

## 3. View绘制流程详解

### 3.1 绘制触发机制

```java

// ViewRootImpl.java

public void requestLayout() {

    if (!mHandlingLayoutInLayoutRequest) {

        checkThread();

        mLayoutRequested = true;

        scheduleTraversals();

    }

}

void scheduleTraversals() {

    if (!mTraversalScheduled) {

        mTraversalScheduled = true;

        mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();

        // 通过Choreographer调度绘制

        mChoreographer.postCallback(

                Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);

    }

}

```

### 3.2 Choreographer机制

```java

// Choreographer.java

private void scheduleFrameLocked(long now) {

    if (!mFrameScheduled) {

        mFrameScheduled = true;

        if (USE_VSYNC) {

            // 请求VSYNC信号

            if (isRunningOnLooperThreadLocked()) {

                scheduleVsyncLocked();

            } else {

                Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_VSYNC);

                msg.setAsynchronous(true);

                mHandler.sendMessageAtFrontOfQueue(msg);

            }

        }

    }

}

// Native层请求VSYNC

private void scheduleVsyncLocked() {

    mDisplayEventReceiver.scheduleVsync();

}

```

### 3.3 三大绘制流程

```java

// ViewRootImpl.java

private void performTraversals() {

    // 测量

    if (mFirst || windowShouldResize || insetsChanged ||

            viewVisibilityChanged || params != null) {

        performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);

    }


    // 布局

    if (didLayout) {

        performLayout(lp, desiredWindowWidth, desiredWindowHeight);

    }


    // 绘制

    if (!cancelDraw && !newSurface) {

        performDraw();

    }

}

```

## 4. Surface创建和管理

### 4.1 Surface创建流程

```java

// ViewRootImpl.java

private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,

            boolean insetsPending) throws RemoteException {

    // 通过WindowManagerService创建Surface

    int relayoutResult = mWindowSession.relayout(

            mWindow, mSeq, params,

            (int) (mView.getMeasuredWidth() * appScale + 0.5f),

            (int) (mView.getMeasuredHeight() * appScale + 0.5f),

            viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0,

            mWinFrame, mPendingOverscanInsets, mPendingContentInsets,

            mPendingVisibleInsets, mPendingStableInsets, mPendingOutsets,

            mPendingBackDropFrame, mPendingConfiguration, mSurface);

    return relayoutResult;

}

```

### 4.2 Native层Surface实现

```cpp

// Surface.cpp

status_t Surface::lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds) {

    ANativeWindowBuffer* buffer;

    status_t err = dequeueBuffer(&buffer, &fenceFd);

    if (err == NO_ERROR) {

        sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(buffer));

        err = lockBuffer(backBuffer.get());

        if (err == NO_ERROR) {

            // 映射图形缓冲区到用户空间

            void* vaddr;

            err = backBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN |

                    GRALLOC_USAGE_SW_WRITE_OFTEN, &vaddr);

            if (err == NO_ERROR) {

                outBuffer->bits = vaddr;

            }

        }

    }

    return err;

}

```

## 5. 渲染管线

### 5.1 软件渲染(CPU渲染)

```java

// View.java - Canvas绘制

private void drawBackground(Canvas canvas) {

    final Drawable background = mBackground;

    if (background == null) {

        return;

    }


    // 设置边界

    setBackgroundBounds();


    // 使用Canvas绘制

    final int scrollX = mScrollX;

    final int scrollY = mScrollY;

    if ((scrollX | scrollY) == 0) {

        background.draw(canvas);

    } else {

        canvas.translate(scrollX, scrollY);

        background.draw(canvas);

        canvas.translate(-scrollX, -scrollY);

    }

}

```

### 5.2 硬件加速渲染(GPU渲染)

```java

// ThreadedRenderer.java

void draw(View view, AttachInfo attachInfo, DrawCallbacks callbacks) {

    // 更新根节点

    updateRootDisplayList(view, callbacks);


    // 同步渲染状态

    int syncResult = nSyncAndDrawFrame(mNativeProxy, frameInfo, frameInfo.length);

}

// Native层GPU渲染

// RenderThread.cpp

void RenderThread::draw(RenderTask* task) {

    CanvasContext* context = task->mContext;

    EGLSurface surface = task->mSurface;


    // 绑定EGL上下文

    if (!eglMakeCurrent(mEglDisplay, surface, surface, mEglContext)) {

        return;

    }


    // 执行OpenGL绘制命令

    context->draw();


    // 交换缓冲区

    eglSwapBuffers(mEglDisplay, surface);

}

```

## 6. SurfaceFlinger合成

### 6.1 Layer管理

```cpp

// SurfaceFlinger.cpp

void SurfaceFlinger::handleMessageRefresh() {

    // 准备合成

    preComposition();


    // 重建层列表

    rebuildLayerStacks();


    // 设置每层的合成状态

    setUpHWComposer();


    // 执行合成

    doComposition();


    // 提交到显示设备

    postComposition();

}

```

### 6.2 HWComposer硬件合成

```cpp

// HWComposer.cpp

status_t HWComposer::prepare() {

    for (size_t i = 0; i < mDisplayData.size(); i++) {

        DisplayData& displayData = mDisplayData[i];

        if (displayData.list) {

            // 调用HAL层prepare

            int err = mHwc->prepare(mHwc, mNumDisplays, mLists);

        }

    }

    return NO_ERROR;

}

status_t HWComposer::commit() {

    // 提交给硬件合成器

    int err = mHwc->set(mHwc, mNumDisplays, mLists);

    return err;

}

```

## 7. 内核层显示驱动

### 7.1 DRM/KMS框架

```c

// drm_framebuffer.c

int drm_mode_page_flip_ioctl(struct drm_device *dev,

                            void *data, struct drm_file *file_priv) {

    struct drm_mode_crtc_page_flip *page_flip = data;

    struct drm_crtc *crtc;

    struct drm_framebuffer *fb;


    // 获取CRTC

    crtc = drm_crtc_find(dev, page_flip->crtc_id);


    // 获取Framebuffer

    fb = drm_framebuffer_lookup(dev, page_flip->fb_id);


    // 执行页翻转

    ret = crtc->funcs->page_flip(crtc, fb, e, page_flip->flags);


    return ret;

}

```

### 7.2 GPU驱动交互

```c

// gpu_driver.c

static int gpu_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {

    switch (cmd) {

    case DRM_IOCTL_MODE_CREATE_DUMB:

        // 创建显存缓冲区

        return drm_mode_create_dumb_ioctl(dev, data, file_priv);


    case DRM_IOCTL_MODE_MAP_DUMB:

        // 映射显存到用户空间

        return drm_mode_mmap_dumb_ioctl(dev, data, file_priv);


    case DRM_IOCTL_MODE_ADDFB:

        // 添加Framebuffer

        return drm_mode_addfb_ioctl(dev, data, file_priv);

    }

}

```

## 8. 触摸事件处理

### 8.1 内核输入子系统

```c

// input_event.c

static void input_handle_event(struct input_dev *dev,

                              unsigned int type, unsigned int code, int value) {

    switch (type) {

    case EV_ABS:

        // 处理触摸坐标

        if (is_mt_event(code)) {

            input_handle_abs_event(dev, code, value);

        }

        break;

    }


    // 同步事件

    if (type == EV_SYN && code == SYN_REPORT) {

        input_sync(dev);

    }

}

```

### 8.2 InputDispatcher分发

```cpp

// InputDispatcher.cpp

bool InputDispatcher::dispatchMotionLocked(

        nsecs_t currentTime, MotionEntry* entry, DropReason* dropReason,

        nsecs_t* nextWakeupTime) {

    // 找到目标窗口

    Vector<InputTarget> inputTargets;

    bool conflictingPointerActions = false;

    int32_t injectionResult = findTouchedWindowTargetsLocked(currentTime,

            entry, inputTargets, nextWakeupTime, &conflictingPointerActions);


    // 分发到目标窗口

    dispatchEventLocked(currentTime, entry, inputTargets);

    return true;

}

```

## 9. 性能优化要点

### 9.1 减少过度绘制

```java

// 使用ViewStub延迟加载

ViewStub stub = findViewById(R.id.stub);

View inflated = stub.inflate();

// 移除不必要的背景

getWindow().setBackgroundDrawable(null);

```

### 9.2 使用硬件加速

```java

// 开启硬件加速

setLayerType(View.LAYER_TYPE_HARDWARE, null);

// 使用RenderNode缓存复杂绘制

RenderNode renderNode = new RenderNode("myRenderNode");

Canvas canvas = renderNode.start(width, height);

// 绘制操作

renderNode.end(canvas);

```

### 9.3 优化布局层级

```xml

<!-- 使用ConstraintLayout减少层级 -->

<androidx.constraintlayout.widget.ConstraintLayout>

    <!-- 扁平化布局结构 -->

</androidx.constraintlayout.widget.ConstraintLayout>

```

## 总结

Android View系统是一个复杂的多层架构系统,从应用层的View绘制,经过Framework层的Surface管理,到Native层的图形渲染,最终到达内核层的显示驱动。理解这个完整的流程对于进行性能优化和解决显示问题非常重要。

关键点:

1. **VSYNC同步机制**确保流畅的动画效果

2. **Surface双缓冲**避免画面撕裂

3. **硬件加速**提升渲染性能

4. **SurfaceFlinger**负责最终的画面合成

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容