1.❤️ Android 源码解读-从setContentView深入了解 Window|Activity|View❤️
2.Android 图形显示系统(九) Android图形显示子系统概述
3.面试中常被问到的Framework 底层原理!
4.字节T3-2级专家出品:2022年Android高级资深开发进阶路线图谱!
❤️ Android 源码解读-从setContentView深入了解 Window|Activity|View❤️
Android系统中,Window、Activity、View之间的猜成语源码关系是紧密相连且相互作用的。了解这三者之间的关系,有助于深入理解Android应用的渲染和交互机制。
在Android中,通常在创建Activity时会调用`setContentView()`方法,以指定显示的布局资源。这个方法主要作用是将指定的布局添加到一个名为`DecorView`的容器中,并最终将其显示在屏幕上。这一过程涉及到多个组件的交互,下面分步骤解析。
在`Activity`类中,`setContentView()`方法调用`getWindow()`方法获取`Window`对象,而`Window`对象在`Activity`的`attach()`方法中被初始化。`Window`对象是一个抽象类,其默认实现为`PhoneWindow`,这是Android特定的窗口实现。
`PhoneWindow`在创建时会通过`setWindowManager()`方法与`WindowManager`进行关联。`WindowManager`是系统级组件,用于管理所有的窗口,包括窗口的创建、更新、删除等操作。`WindowManager`的管理最终由`WindowManagerService`(WMS)执行,这是一个运行在系统进程中的服务。
在`PhoneWindow`中,`installDecor()`方法会初始化`DecorView`和`mContentParent`。`mContentParent`是qt源码没有xcb一个`ViewGroup`,用于存放`setContentView()`传入的布局。通过`mLayoutInflater`的`inflate()`方法,将指定的布局资源添加到`mContentParent`中。
`DecorView`是一个特殊的`FrameLayout`,包含了`mContentParent`。在完成布局的添加后,`DecorView`本身并没有直接与`Activity`建立联系,也没有被绘制到屏幕上显示。`DecorView`的绘制和显示发生在`Activity`的`onResume()`方法执行后,这时`Activity`中的内容才真正可见。
当`Activity`执行到`onCreate()`阶段时,其内容实际上并没有显示在屏幕上,直到执行到`onResume()`阶段,`Activity`的内容才被真正显示。这一过程涉及到`ActivityThread`中的`handleResumeActivity()`方法,该方法会调用`WindowManager`的`addView()`方法,将`DecorView`添加到`WindowManagerService`中,完成`DecorView`的绘制和显示。
`WindowManagerService`通过`addView()`方法将`DecorView`添加到显示队列中,并且在添加过程中,会创建关键的`ViewRootImpl`对象,进一步管理`DecorView`的布局、测量和绘制。`ViewRootImpl`会调用`mWindowSession`的`addToDisplay()`方法,将`DecorView`添加到真正的显示队列中。
`mWindowSession`是`WindowManagerGlobal`中的单例对象,其内部实际上是一个`IWindowSession`类型,通过`AIDL`接口与系统进程中的`Session`对象进行通信,最终实现`DecorView`的添加和显示。
通过`setView()`方法的实现,可以看到除了调用`IWindowSession`进行跨进程添加`View`之外,iapp卡片实例源码还会设置输入事件处理。当触屏事件发生时,这些事件首先通过驱动层的优化计算,通过`Socket`跨进程通知`Android Framework`层,最终触屏事件会通过输入管道传送到`DecorView`处理。
在`DecorView`内部,触屏事件会通过`onProcess`方法传递给`mView`,即`PhoneWindow`中的`DecorView`。最终,事件传递到`PhoneWindow`中的`View.java`实现的`dispatchPointerEvent()`方法,并调用`Window.Callback`的`dispatchTouchEvent(ev)`方法。对于`Activity`来说,`dispatchTouchEvent()`方法最终还是会调用`PhoneWindow`的`superDispatchTouchEvent()`,然后传递给`DecorView`的`superDispatchTouchEvent()`方法,完成事件的分发和处理。
综上所述,通过`setContentView()`的过程,我们可以清晰地看到`Activity`、`Window`、`View`之间的交互关系。整个过程主要由`PhoneWindow`组件主导,而`Activity`主要负责提供要显示的布局资源,其与屏幕的直接交互则通过`WindowManager`和`WindowManagerService`实现。
Android 图形显示系统(九) Android图形显示子系统概述
Android图形显示系统是Android核心架构中的重要组成部分,它负责处理图形渲染、显示以及与硬件的交互。系统大致可以分为两大部分:图形系统和显示系统。
图形系统包括用于2D和3D图形绘制的API(如Skia、OpenGLES、RenderScript、OpenCV、sdl绘制函数源码Vulkan),解码库(如JPEG、PNG、GIF)以及相关驱动支持。在实际应用中,Android为开发者提供了丰富的界面组件(如widget和view),使得开发者无需直接调用底层API,即可轻松创建交互式界面。为了提升性能,Android还引入了硬件加速机制,将2D图形转换为3D绘图,并采用部分更新方式,仅重绘有变化的部分,显著提高了界面渲染速度。
显示系统则负责将图形绘制结果呈现给用户。每个界面对应一个Surface对象,多个Surface需要合并显示。Android使用SurfaceFlinger服务来管理窗口合成和显示,其核心是图层概念(Layer),多个Layer被合并为一个,最终通过Display HAL(硬件抽象层)送到LCD。SurfaceFlinger利用Buffer管理机制,通过Buffer队列(BufferQueue)和生产者-消费者模型,优化了内存使用,提升了显示效率。
Android显示系统架构复杂但设计精妙,包含多个关键组件如SurfaceFlinger、AMS(Activity Manager Service)、WMS(Window Manager Service)等。它不仅支持高效的图形渲染和显示,还提供了丰富的快递入库系统源码接口和工具,使得开发者能够轻松构建高质量的用户界面。
为了帮助开发者更深入地理解Android显示系统,Android官方提供了详细的文档和示例代码。通过结合架构图和源代码分析,开发者可以更直观地掌握系统内部的工作机制,从而优化应用性能和用户体验。
回到整体系统架构,Android基于Linux内核构建,集成了电话、蓝牙、Wi-Fi、音视频播放、摄像头等众多功能,形成一个庞大的生态系统。Android通过HAL层(硬件抽象层)提供了统一的接口,使得开发者可以基于Linux内核开发各类应用或系统,例如FirefoxOS、OS、YunOS等。
Android Framework分为Native Framework和Java Framework,其中Java Framework的引入是为了吸引更多Java开发者,形成生态链。Native Framework提供底层的性能支持,而Java Framework则方便使用Java语言进行应用开发。在显示子系统中,SurfaceFlinger基于HAL HWComposer管理显示流程,而上层服务如WMS、AMS、View等则负责应用层面的界面管理和控制。
对于Android Native应用开发者来说,Android提供了NDK(Native Development Kit),允许开发者直接访问系统底层API,进行性能优化或实现特定功能。通过NDK,开发者可以创建功能强大、性能出色的原生应用,进一步丰富Android平台的生态系统。
总之,Android图形显示系统是一个高度集成、功能丰富且灵活的系统,它为开发者提供了从底层图形渲染到高级界面管理的完整解决方案。通过深入理解其架构和机制,开发者能够构建出高效、美观的用户界面,为用户提供卓越的移动体验。
面试中常被问到的Framework 底层原理!
Android 开发领域对技术的要求日益提高,不再局限于对四大组件和基础开发技能的了解。现在的公司更加注重候选人的技术深度和对源码原理的理解,尤其在大型企业的面试中,对 Android Framework 底层原理的考察尤为突出。
Android 的进程通信机制主要通过 Binder 实现,而线程通信则依赖于 Handler。这两个机制不仅是 Android 开发的基石,也是面试中的重要知识点。
以 Handler 为例,了解其源码结构有助于深入理解相关概念。
Binder 作为 Android 的主要跨进程通信方式,包括 BinderProxy、BpBinder 等多种实体,以及 ProcessState、IPCThreadState 等封装。它贯穿 Java、Native 层,涉及用户态、内核态,与 Service、AIDL 等紧密相关,向下则与 mmap、Binder 驱动设备相连,是一个庞大而复杂的机制。
面试中,面试官可能会问及基于 mmap 的拷贝实现方式。通过图形化解释,我们可以更好地理解这一过程:Client 和 Server 处于不同进程,拥有不同的虚拟地址规则,无法直接通信。通过映射页框,可以将物理内存分别与 Client 和 Server 的虚拟内存块进行映射,实现一次数据拷贝。
精通 Framework 不仅需要对底层原理有深入了解,还需要将 Framework 知识应用于实践,如 Android App 的启动机制、AMS、PMS、WMS 等。
许多学习者和实践者在 Android Framework 面临困扰,但很少人能够逆向分析并找到最优解决方案。Framework 是 Android 开发的深水区,也是衡量程序员能力的重要标准。
为了帮助大家节省学习周期,我整理了《Android Framework 源码解析》这份文档,希望对大家在技术道路上有所帮助。完整版文档已在 GitHub 收录,请参考学习。
字节T3-2级专家出品:年Android高级资深开发进阶路线图谱!
随着Android技术的不断发展和更新,对开发者技能的要求日益提高。本文将全面分析年的Android高级资深开发进阶路线图,从初级、中级、高级以及资深工程师四个阶段进行深入探讨。
初级开发阶段,应届生需掌握Android开发必备的底层技术,包括Java序列化、注解、泛型与反射、虚拟机底层原理、Android内存原理、数据结构算法等。推荐学习资料包括Java泛型、Java反射、Java并发编程、Java IO 和Android虚拟机等基本知识点,详细内容可参考文章。对于没有接触过Android的开发者,建议通过阅读入门书籍、官方文档和实践代码来熟悉环境,逐步尝试编写业务代码。
中级开发阶段,应学习Android的Framework、Binder、Handler、AMS、PMS、WMS以及Jetpack等核心组件。深入理解源码原理,掌握深入源码的学习方法,解决实际问题。相关学习笔记和手册免费分享,获取方式见文章。
高级开发阶段,需深入研究特定领域,如音视频开发、架构设计等。音视频开发方面,涵盖C/C++、JNI、H./H.、MediaCodec、剪辑、直播、OpenGL、解码、特效、FFmpeg、Webrtc等知识点。架构设计方面,剖析主流框架和一线大厂核心框架,学习架构设计思想,实战积累经验。
资深开发阶段,拓展技术广度,学习Flutter跨平台开发、Android车载开发及前沿技术。掌握Flutter 3.0的混合式开发,了解跨平台技术的发展趋势,关注市场需求,不断提升技术能力。
持续学习,定期面试,了解市场动态,确定技术短板,针对性提升。报名培训机构,学习行业精品资料,配合各种学习资源辅助,提高学习效率。多看大佬学习笔记,学习设计思想,站在巨人的肩膀上前行。掌握系统化学习方法,避免学习内容杂乱,确保学习质量。
本文提供的路线图旨在帮助开发者高效提升技能,快速成长为Android高级资深工程师。通过持续学习、实践与反思,开发者能够紧跟技术发展趋势,成为具备竞争力的移动开发专家。