android 13 WMS/AMS系统开发-窗口层级相关SurfaceFlinger图层创建 第三节

Android13 SurfaceFlinger启动流程分析 在Android13版本中,SurfaceFlinger是由Android.bp去启动init.rc文件,然后再解析文件去加载SurfaceFlinger。上面方法主要处理如下:1、调用surfaceflinger的createSurfaceFlinger方法,实例化surfaceflinger。2、调用flinger(surfaceflinger)的init()方法,在客户端连接之前进行初始化。 阅读详情
AI摘要

文章详细解析了Android系统内部SurfaceControl的创建过程,特别是如何在WindowContainer和DisplayContent中构建层级结构。通过代码跟踪,展示了如何从DefaultTaskDisplayArea和ImePlaceholder这两个特定场景出发,最终到达SurfaceControl的创建。在创建过程中,涉及的关键点包括makeSurfaceBuilder、setParent和createSurfaceLocked等方法,以及如何通过WindowSurfaceController将图层转换为非Container类型。

创建Surfacelinger的图层堆栈打印添加:
更多内容qqun:422901085 https://ke.qq.com/course/5992266#term_id=106217431
代码位置:
frameworks/base/core/java/android/view/SurfaceControl.java

      /**
         * Set a debugging-name for the SurfaceControl.
         *
         * @param name A name to identify the Surface in debugging.
         */
        @NonNull
        public Builder setName(@NonNull String name) {
            mName = name;
            if (name != null && name.contains("DefaultTaskDisplayArea") || name.contains("ImePlaceholder") ) {
                android.util.Log.i("test1",this + "setName " + name,new Exception() );
            }
            return this;
        }

这里之对DefaultTaskDisplayArea,ImePlaceholder进行特殊过滤以防打印太多

Line   9965: 02-20 21:53:01.238   558   558 I test1   : android.view.SurfaceControl$Builder@c7e3d28setName DefaultTaskDisplayArea
	Line   9966: 02-20 21:53:01.238   558   558 I test1   : java.lang.Exception
	Line   9967: 02-20 21:53:01.238   558   558 I test1   : 	at android.view.SurfaceControl$Builder.setName(SurfaceControl.java:1249)
	Line   9968: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayContent.makeChildSurface(DisplayContent.java:5036)
	Line   9969: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
	Line   9970: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
	Line   9971: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
	Line   9972: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
	Line   9973: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeSurface(WindowContainer.java:2408)
	Line   9974: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.createSurfaceControl(WindowContainer.java:613)
	Line   9975: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.onParentChanged(WindowContainer.java:594)
	Line   9976: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.TaskDisplayArea.onParentChanged(TaskDisplayArea.java:818)
	Line   9977: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.setParent(WindowContainer.java:571)
	Line   9978: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:745)
	Line   9979: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:922)
	Line   9980: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
	Line   9981: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
	Line   9982: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
	Line   9983: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
	Line   9984: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$HierarchyBuilder.build(DisplayAreaPolicyBuilder.java:588)
	Line   9985: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$HierarchyBuilder.-$$Nest$mbuild(Unknown Source:0)
	Line   9986: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder.build(DisplayAreaPolicyBuilder.java:333)
	Line   9987: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicy$DefaultProvider.instantiate(DisplayAreaPolicy.java:117)
	Line   9988: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayContent.configureSurfaces(DisplayContent.java:1143)
	Line   9989: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.DisplayContent.<init>(DisplayContent.java:1093)
	Line   9990: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.RootWindowContainer.setWindowManager(RootWindowContainer.java:1313)
	Line   9991: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.wm.ActivityTaskManagerService.setWindowManager(ActivityTaskManagerService.java:1006)
	Line   9992: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.am.ActivityManagerService.setWindowManager(ActivityManagerService.java:1923)
	Line   9993: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:1595)
	Line   9994: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.SystemServer.run(SystemServer.java:939)
	Line   9995: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.server.SystemServer.main(SystemServer.java:649)
	Line   9996: 02-20 21:53:01.238   558   558 I test1   : 	at java.lang.reflect.Method.invoke(Native Method)
	Line   9997: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	Line   9998: 02-20 21:53:01.238   558   558 I test1   : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)
	Line  10387: 02-20 21:53:01.245   558   558 I test1   : android.view.SurfaceControl$Builder@ef25bcasetName ImePlaceholder:13:14
	Line  10388: 02-20 21:53:01.245   558   558 I test1   : java.lang.Exception
	Line  10389: 02-20 21:53:01.245   558   558 I test1   : 	at android.view.SurfaceControl$Builder.setName(SurfaceControl.java:1249)
	Line  10390: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayContent.makeChildSurface(DisplayContent.java:5036)
	Line  10391: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
	Line  10392: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
	Line  10393: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
	Line  10394: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.makeSurface(WindowContainer.java:2408)
	Line  10395: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.createSurfaceControl(WindowContainer.java:613)
	Line  10396: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.onParentChanged(WindowContainer.java:594)
	Line  10397: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.onParentChanged(WindowContainer.java:581)
	Line  10398: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.setParent(WindowContainer.java:571)
	Line  10399: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:745)
	Line  10400: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:922)
	Line  10401: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
	Line  10402: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
	Line  10403: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
	Line  10404: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$HierarchyBuilder.build(DisplayAreaPolicyBuilder.java:588)
	Line  10405: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder$HierarchyBuilder.-$$Nest$mbuild(Unknown Source:0)
	Line  10406: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicyBuilder.build(DisplayAreaPolicyBuilder.java:333)
	Line  10407: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayAreaPolicy$DefaultProvider.instantiate(DisplayAreaPolicy.java:117)
	Line  10408: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayContent.configureSurfaces(DisplayContent.java:1143)
	Line  10409: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.DisplayContent.<init>(DisplayContent.java:1093)
	Line  10410: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.RootWindowContainer.setWindowManager(RootWindowContainer.java:1313)
	Line  10411: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.wm.ActivityTaskManagerService.setWindowManager(ActivityTaskManagerService.java:1006)
	Line  10412: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.am.ActivityManagerService.setWindowManager(ActivityManagerService.java:1923)
	Line  10413: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:1595)
	Line  10414: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.SystemServer.run(SystemServer.java:939)
	Line  10415: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.server.SystemServer.main(SystemServer.java:649)
	Line  10416: 02-20 21:53:01.245   558   558 I test1   : 	at java.lang.reflect.Method.invoke(Native Method)
	Line  10417: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	Line  10418: 02-20 21:53:01.245   558   558 I test1   : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)

可以看出最后都会到达最顶层DisplayContent的makeChildSurface方法

@Override
    SurfaceControl.Builder makeChildSurface(WindowContainer child) {
        SurfaceSession s = child != null ? child.getSession() : getSession();
        final SurfaceControl.Builder b = mWmService.makeSurfaceBuilder(s).setContainerLayer();//注意这里都是容器type
        if (child == null) {
            return b;
        }
       // if (child.getName()!= null && child.getName().contains("DefaultTask")) {
            android.util.Log.i("test1","mSurfaceControl = " +mSurfaceControl + " child.getName() " + child.getName());
       // }
        return b.setName(child.getName())
                .setParent(mSurfaceControl);//返回一个Builder,但是这注意哈,它是会setParent,但是不要紧每个层级WindowContainer中会重新设置Parent
    }

那么对于我们层级结构可以得出以下结论
每addChild时候其实都会触发WindowContainer.onParentChanged,从而触发DisplayContent中创建对应的SurfaceControl,而且大家注意mWmService.makeSurfaceBuilder(s).setContainerLayer();创建出来的都是容器,而不是真正可以绘制的SurfaceControl

那么这里同学肯定有疑问?
请问那到底哪里才是真正的绘制画面的SurfaceControl呢?
这里其实我们前期知道app调用到wms的relayout才可以获取可以绘制画面的surfacecontrol,而且是wms端创建好传递回去的代码如下:

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

   public int relayoutWindow(Session session, IWindow client, LayoutParams attrs,
            int requestedWidth, int requestedHeight, int viewVisibility, int flags,
            ClientWindowFrames outFrames, MergedConfiguration mergedConfiguration,
            SurfaceControl outSurfaceControl, InsetsState outInsetsState,
            InsetsSourceControl[] outActiveControls, Bundle outSyncIdBundle) {

可以看到outSurfaceControl参数,这个就是wms端写入数据,然后app端的ViewRootImpl来进行读取的。
那么看看它是在方法中哪里被使用的:

  // Create surfaceControl before surface placement otherwise layout will be skipped
            // (because WS.isGoneForLayout() is true when there is no surface.
            if (shouldRelayout) {
                try {
                    result = createSurfaceControl(outSurfaceControl, result, win, winAnimator);
                } catch (Exception e) {
                    displayContent.getInputMonitor().updateInputWindowsLw(true /*force*/);

                    ProtoLog.w(WM_ERROR,
                            "Exception thrown when creating surface for client %s (%s). %s",
                            client, win.mAttrs.getTitle(), e);
                    Binder.restoreCallingIdentity(origId);
                    return 0;
                }
            }

调用是createSurfaceControl:

private int createSurfaceControl(SurfaceControl outSurfaceControl, int result,
            WindowState win, WindowStateAnimator winAnimator) {
        if (!win.mHasSurface) {
            result |= RELAYOUT_RES_SURFACE_CHANGED;
        }

        WindowSurfaceController surfaceController;
        try {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "createSurfaceControl");
            surfaceController = winAnimator.createSurfaceLocked();
        } finally {
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        }
        if (surfaceController != null) {
            surfaceController.getSurfaceControl(outSurfaceControl);
            ProtoLog.i(WM_SHOW_TRANSACTIONS, "OUT SURFACE %s: copied", outSurfaceControl);

        } else {
            // For some reason there isn't a surface.  Clear the
            // caller's object so they see the same state.
            ProtoLog.w(WM_ERROR, "Failed to create surface control for %s", win);
            outSurfaceControl.release();
        }

        return result;
    }

这里首先又调用到了winAnimator.createSurfaceLocked();

 WindowSurfaceController createSurfaceLocked() {
//ignore
  mSurfaceController = new WindowSurfaceController(attrs.getTitle().toString(), format,
                    flags, this, attrs.type);
//ignore
}

调用到了WindowSurfaceController构造:

WindowSurfaceController(String name, int format, int flags, WindowStateAnimator animator,
            int windowType) {
        mAnimator = animator;

        title = name;

        mService = animator.mService;
        final WindowState win = animator.mWin;
        mWindowType = windowType;
        mWindowSession = win.mSession;

        Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "new SurfaceControl");
        final SurfaceControl.Builder b = win.makeSurface()
                .setParent(win.getSurfaceControl())
                .setName(name)
                .setFormat(format)
                .setFlags(flags)
                .setMetadata(METADATA_WINDOW_TYPE, windowType)
                .setMetadata(METADATA_OWNER_UID, mWindowSession.mUid)
                .setMetadata(METADATA_OWNER_PID, mWindowSession.mPid)
                .setCallsite("WindowSurfaceController");//此时其实还是属于Container,因为DisplayerContent创建

        final boolean useBLAST = mService.mUseBLAST && ((win.getAttrs().privateFlags
                & WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST) != 0);

        if (useBLAST) {
            b.setBLASTLayer();//非常关键,变成非Container
        }

        mSurfaceControl = b.build();

        Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
    }

哈哈,是不是终于看到对应的代码了图层Buffer图层type而不是Container的type

01 Android12 surfaceflinger详解 SurfaceFlinger是Android操作系统中的一个Service,它负责接收所有Window的Surface作为输入,并根据ZOrder、透明度、大小、位置等参数,计算出每个Surface在最终合成图像中的位置,然后交由CPU或GPU生成最终的显示Buffer,最后显示到特定的显示设备上 阅读详情

相关推荐

Android R WindowManagerService模块(1) WMS整体架构及启动过程

DisplayArea是Android R上新添加的容器,目的就是将复杂的窗口层级管理简单化、低耦合。 而在树结构中,各个容器结构如下: 可以看到,在树结构中,根节点为RootWindowContainer,叶子节点为WindowState。 正是通过这种结构,WMS中将系统中所有的窗口显示管理得井井有条,并将所有窗口以Surface的形式送到SurfacaFlinger中进行合成和显示。 2.WMS启动流程 接下来我们看下WMS的启动过程。WindowManagerService没有继承与Syste.

wa2231a的博客 2071

3【Android 12】DisplayArea层级结构

DisplayArea类的继承关系,之前已经分析过,这里用一张简单的类图总结:既然DisplayContent是作为其代表的屏幕的DisplayArea层级结构的根节点,那么从DisplayContent出发,看一下这棵以DisplayContent为根节点的DisplayArea树是如何生成的。 在DisplayContent的构造方法中,调用DisplayAreaPolicy.Provider.instantiate方法,去初始化一个DisplayArea层级结构。DisplayAreaPolicy.P

ukynho的博客 4139

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5051

屏幕的窗口层级

表示将对应的layer设置为。

了凡 725

视觉SLAM十四讲--第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤)

最详细的代码调试运行避坑说明,也包含了我自己对代码的理解,如有理解错误的地方,欢迎指正交流。

记录和分享 1万+

AI大模型驱动的智能座舱研发体系重构

AI大模型正重构智能座舱研发体系的核心逻辑,需以场景认知为起点、混合架构为支柱、AI原生生态为落脚点。未来,研发体系需持续融合认知科学、边缘计算与开放生态理论,推动座舱从“工具”进化为“伙伴”。

我的专栏 1916

【Android】WMS(六)Surface的创建和操作

Surface的创建和操作

每天不是在写bug就是在写bug的路上 2338

Canoe主要功能的详细介绍

CANoe是德国Vetor公司推出的一款用于总线开发的设备,全程为CAN open environment。后来随着总线技术的发展,CANoe不仅限于CAN类型的总线开发,还包含LIN、FlexRay、MOST和以太网等开发。在车载网络和ECU开发、测试和分析方面,CANoe几乎长期占据着垄断地位,当然是因为其强大的功能性了。目前用这个工具的主要是整车厂和供应商的网络设计工程是、开发工程师和测试工程师。小编当时安装CANoe的时候也是花了一定的时间和精力,好在没有崩溃。

车载测试 3723

「安卓framework基础篇7」从WMS到BufferQueue第一篇 - WMS层级树的初始化过程(基于AOSP13)

上一篇文章分析了Vsync的基本工作过程,最终Vsync信号会派发给订阅Vsync信号的APP进程,那APP进程收到Vsync信号后,会做哪些事情呢?本篇咱们就来探讨一下APP进程收到Vsync信号后会做的事,本篇主要用画图的形式将构造WMS层级树的算法执行过程直观得向大家解释清楚,如果有空,看本篇前强烈建议先了解一下什么是有序多叉树和有序多叉树的前序遍历算法,WMS层级树就是一棵有序多叉树。

geyang55xu的博客 211

详细解读文字识别工具———Tesseract-OCR

   在尝试破解12306验证码的时候,提前了解了一下应对各种验证码的解决方案,这里主要是学习到了面对文字图片验证码,例如亚马逊、豆瓣等平台的登录时会遇到的情况,效果还不错。 一、工具介绍 ​    Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition...

别看我只是一只羊 2万+

Allegro如何进行四层板板层设计

板层的设计

weixin_42499230的博客 3189

android WMS 详解(二)

android WMS 详解(二)

maoning20080808的专栏 208

移动端 AI 部署:ONNX Runtime + Android 从模型到 App

移动端 ONNX 部署的流程是 PC 端导出 ONNX → 放到 Android 项目 assets → ONNX Runtime AAR 加载推理。核心是OrtSession,预处理在 Java 层用 Bitmap 操作完成。建议先在 PC 上用 onnxruntime Python 验证模型正确,再集成到 Android 端,可以减少定位问题的时间。ONNX Runtime 自动调用 NNAPI,在主流芯片上不需要额外适配。

know_F0727的博客 71

Android 13 SurfaceFlinger启动流程全解析:从init到第一帧合成

图形合成是Android系统显示链路的核心环节,SurfaceFlinger作为系统级合成器,负责将所有应用窗口、系统UI与开机动画统一合成并送显。理解它的启动机制,是排查开机黑屏、动画卡顿、花屏等显示异常的基础。SurfaceFlinger由init进程独立拉起,其启动顺序早于Zygote和SystemServer,内部通过初始化HWC硬件抽象层、创建RenderEngine、建立VSYNC分发链路,最终进入消息循环持续进行帧合成。Android 13在启动流程中引入了更精细的调度与事务分离设计,显著提升

weixin_29166013的博客 329

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

努力让自己发光,对的人才能迎着光而来 34万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android分屏模式核心机制:从Stack管理到窗口布局的深度解析

本文深度解析Android分屏模式的核心机制,从Stack管理到窗口布局的详细实现。探讨了Android 7.0至Android 13的分屏演进历程,系统服务(AMS与WMS)的协同工作,以及ActivityStack与窗口布局的关联。提供了分屏模式下的生命周期处理策略、代码实现示例及开发者适配指南,帮助开发者优化多窗口应用体验。

weixin_30457465的博客 328

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

安卓车机车载面试福利7:一线厂商车载系统开发相关面试真题(持续更新)

马哥这边也会对这些面试题目进行收集,整理一起分享给大家,当然很多framework的面试题目其实都是马哥平时framework入门到精通课程中有讲解的。6、针对不同的Activity启动模式,请问Task这块有什么不同的体现?

learnframework的博客 523

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SurfaceFlinger中Layer泄露如何排查解决?-vip学员作业

在AOSP 13中,切换壁纸时出现ImageWallpaper Layer内存泄漏,导致mOffscreenLayers持续增长,可能突破4096层上限引发新图层创建失败。问题根源在于壁纸销毁后未正确从offscreen集合移除,因Layer无父级但未被及时清理。与其他窗口不同,壁纸生命周期管理特殊,且未主动释放。修复需在壁纸销毁时显式从mOffscreenLayers移除对应Layer。排查流程包括dumpsys分析、代码追踪offscreen添加逻辑、定位异常残留。建议在WallpaperService

liaosongmao1的专栏 4

深入探索Android Framework:成为系统开发专家的必备资源

深入探索Android Framework:成为系统开发专家的必备资源 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在移动开发领域,Android Framework无疑是开发者们必须深入掌握的核心技术之一。为了帮助广大开发者更好地理解和应用Android Framework,我们推出了一个专注于Android系统开发和Framework学习资料的开源项目。这个项目...

gitblog_06651的博客 658

安卓启动流程与期间核心组件工作原理

本文以实际工作中出现的启动相关各种千奇百怪的bug为钩子,讲解了安卓app冷启动过程中核心组件的工作原理,pms -> packageParser/androidmanifest.xml -> context -> ams -> application -> activity -> layoutInflater资源加载过程 -> wms /window/WM -> view与viewgroup绘制原理 -> 渲染阶段。理供解决问题的思路,看业务框架代码能看懂他们改的哪块源码,跟他们扯皮能扯赢

mix39的博客 337

Android WindowManager原理深度解析:Token、Session与三层架构

WindowManager是Android系统中管理窗口显示与交互的核心机制,其本质并非简单的UI控件管理器,而是贯穿应用层、系统服务层和图形合成层的跨进程协同协议。它依托Binder通信实现权限校验、Z轴调度、输入事件路由与资源生命周期管理,关键技术点包括Token(窗口身份凭证)、Session(操作授权通道)、ViewRootImpl(Java与Native桥接)以及TYPE_APPLICATION_OVERLAY等窗口类型策略。理解其分层设计与底层契约关系,对解决BadTokenException、

weixin_30954817的博客 218

面试福利2:安卓系统framework开发面试题目汇总(不断更新)

背景:经常有学员出去进行framework相关的面试,他们都会给马哥反馈一些面试题目,今天给大家整理一下方便大家进行面试前的准备列出的面试题目大部分都是有答案的,答案可以vip群获取,有的是没有答案的,毕竟是去人家公司面试的,面试官也不是马哥,当然也就没有相关的答案,不过看到题目大家一般都可以有自己的答案,大家不确定的可以vip群中丢出来讨论。

learnframework的博客 1754

车机STR唤醒黑屏根因与治本方案:Display State同步与焦点仲裁

车载语音唤醒(STR)黑屏问题本质是Android Automotive图形栈中Display Power State与SurfaceFlinger帧提交的时序失配。其原理在于Display状态切换延迟导致图层可见性被静默置为false,且Input Dispatcher未及时完成焦点仲裁,引发SurfaceFlinger丢帧与视觉层遮罩。该问题凸显车载系统对时间确定性的严苛要求,技术价值在于保障HMI一致性、满足UNECE R155功能安全输入事件完整性,并规避ADAS/HUD交互失效风险。典型应用于高通

weixin_34241036的博客 244
上一篇: android 13 WMS/AMS系统开发-窗口层级相关DisplayArea,WindowContainer第二节
下一篇: android 13 WMS/AMS系统开发-窗口层级相关Task/ActivityRecord/WindowState/WindowToken放置图层创建 第三节
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值