前言
在职场中,许多中年人承担着家庭、房贷、子女教育等沉重的责任。随着年龄的增长,承受的压力也与日俱增。尽管已经经历了职场的风风雨雨,但在'中年'这个年纪,职场生活却往往变得越来越卑微。
这种职场中的卑微感并不陌生,但在中年阶段似乎变得更加显著。一位曾经在深圳某大厂的程序员的经历,或许也代表着很多中年人的心声。在被裁之前,他的工作状态是:'随便使唤都不敢离职,上司怎么骂都不敢顶嘴的人群;职场上的年轻人和新人是不能得罪的,因为他们年轻气盛,受委屈后随时可能原地爆炸。而中年的他们背上有家庭,肩上有房贷,即使受了委屈也只能往肚里咽。'被裁后,身背房贷的他,终于彻底理解了中年人的职场卑微感来自于哪里。
在竞争激烈的职场,中年人的卑微似乎成了一种常态。去年,37 岁,在 Android 行业干了 15 年的我被裁员了。父母年纪快 60 了,还有一个正在读初中的儿子,每个月八千多的房贷。那时候还好有老婆的支持理解,不然我想我能发疯。
我的学历属于普通的二本,而这个年纪加上学历想要在互联网重新找到合适的工作很难。再加上这个年纪没有达到管理层,好一点的公司连面试的机会都不会给你。当时,面试最多的公司基本是小型的一些创业公司,而我的年龄和学历时不时会被拿出来说。当时的面试过程对于我来说是一种酷刑,但是我们要生活,孩子要读书,房子还要还贷款,所有的事情都在等着我们,不敢有任何一点放弃的念头。
被裁后,经过很多次的考虑后,我努力学习了 Android Framework 方面的知识。在此期间,做过房产中介,送过外卖,找过临时的工作,只为了能维持家庭的正常开支,因为老婆的工资要还房贷。直到今年,终于成功上岸一家车企,在里面从事智能座舱开发的工作,工资虽然没有涨,但也没有下调到哪里去。终于不用担心工作的问题了,也能够维持家庭的正常开销。
我为什么会深入学习 Framework?
很简单,作为一位 Android 程序员,学习 Framework 就是为了不被淘汰。随着 Android 程序员越来越多,企业在面试时会更看重一个程序员对 Android 底层的理解和思考。再加上现在新能源汽车的发展热潮,车载系统、智能座舱等都是使用的 Framework,车企急需会 Android Framework 的技术人才。
除此之外,Framework 底层知识庞大且复杂,掌握 Framework 之后,我就拥有了其他程序员没有的技术壁垒,以后再遇到公司优化什么的,大概率不会落在我的头上。深入理解系统机制,能让你在面对复杂业务需求时游刃有余,而不是仅仅停留在 API 调用的层面。
如何学习 Framework?
我热衷于收集整理资源,记录踩坑到爬坑的过程。希望能把自己所学,实际工作中使用的技术、自学方法、心得及踩过的一些坑,记录下来。一是更好的梳理自己,二也是能做到更好的社区分享。
首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用。还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式。
学习规划与核心技术解析
为了帮助大家更好地构建知识体系,以下是对 Framework 核心模块的详细解析,这也是我转型过程中重点攻克的内容。
第一章 Android 系统启动流程
Android 系统的启动是一个复杂且严谨的过程,理解它有助于排查系统级问题。
- 第一节 Android 启动概览:了解从按下电源键到桌面加载完成的整个生命周期,包括 Bootloader、Kernel、Init 进程的作用。
- 第二节 init.rc 解析:init 进程是 Android 用户空间的第一个进程,负责初始化硬件设备、挂载文件系统、启动服务。init.rc 是其配置文件,定义了服务的启动顺序和参数。
- 第三节 Zygote:Zygote 是 Android 应用进程的孵化器,它预加载了常用类库和资源,通过 fork 机制快速创建新进程,极大提升了应用启动速度。
- 第四节 面试题:常问如'开机流程有哪些关键节点?'、'Zygote 是如何实现的?'等,需结合源码回答。
第二章 跨进程通信 IPC
Binder 是 Android 特有的 IPC 机制,是 Framework 的核心基石。
- 第一节 Service 还可以这么理解:Service 不仅是组件,更是 Binder 服务端的一种体现,理解其生命周期管理至关重要。
- 第二节 Binder 基础:Binder 驱动层、HAL 层、Java 层的架构设计,以及 AIDL 接口定义语言的作用。
- 第三节 Binder 应用:如何在实际开发中封装 Binder 服务,处理并发请求。
- 第四节 AIDL 应用(上/下):AIDL 编译生成代码的原理,如何处理复杂数据类型传递,以及 Binder 线程池的管理。
- 第五节 Messenger 原理及应用:Messenger 基于 Handler 的轻量级 IPC 方案,适用于简单场景。
- 第六节 服务端回调:实现客户端与服务端的双向通信,常用于通知机制。
- 第七节 获取服务(IBinder):如何通过 ServiceManager 获取系统服务实例。
- 第八节 Binder 面试题全解析:涵盖 Binder 内存映射、引用计数、死锁避免等深度问题。
第三章 Handler 源码解析
Handler 机制是 Android 多线程通信的核心。
- 第一节 源码分析:Looper 的消息循环机制,MessageQueue 的数据结构,Handler 如何绑定 Looper。
- 第二节 难点问题:Handler 内存泄漏的原因及解决方案,主线程消息阻塞的影响。
- 第三节 Handler 常问面试题:Handler 与 Thread 的区别,AsyncTask 为何被淘汰等。
第四章 AMS 源码解析
Activity Manager Service (AMS) 管理着所有 Activity 的生命周期。
- 第一节 引言:AMS 在 SystemServer 中的地位,它是 Android 四大组件的管理者。
- 第二节 Android 架构:理解 Client-Server 模型在 AMS 中的应用。
- 第三节 通信方式:AMS 与 App 进程通过 Binder 通信。
- 第四节 系统启动系列:SystemServer 启动 AMS 的时机。
- 第五节 AMS:Activity 启动流程(startActivity),状态机转换。
- 第六节 AMS 面试题解析:Activity 栈管理,TaskAffinity 配置等。
第五章 WMS 源码解析
Window Manager Service (WMS) 管理窗口层级和显示。
- 第一节 WMS 与 activity 启动流程:WMS 如何配合 AMS 完成窗口创建。
- 第二节 WMS 绘制原理:SurfaceFlinger 之前的合成逻辑。
- 第三节 WMS 角色与实例化过程:WMS 单例模式的实现。
- 第四节 WMS 工作原理:View 树到 Surface 的转换过程。
第六章 Surface 源码解析
Surface 是应用层与图形系统交互的桥梁。
- 第一节 创建流程及软硬件绘制:Surface 的创建涉及 SurfaceFlinger 和 Gralloc。
- 第二节 双缓冲及 SurfaceView 解析:双缓冲机制减少闪烁,SurfaceView 的性能优势。
- 第三节 Android 图形系统综述:从 OpenGL ES 到 Vulkan 的演进。
第七章 基于 Android 12.0 的 SurfaceFlinger 源码解析
SurfaceFlinger 是 Android 的合成器。
- 第一节 应用建立和 SurfaceFlinger 的沟通桥梁:Client 如何提交 Buffer。
- 第二节 SurfaceFlinger 的启动和消息队列处理机制:HWC 硬件合成器的调用。
- 第三节 SurfaceFlinger 之 VSync:垂直同步信号的处理,保证帧率稳定。
第八章 PKMS 源码解析
Package Manager Service (PKMS) 管理应用安装和权限。
- 第一节 PKMS 调用方式:PackageManager 接口的使用。
- 第二节 PKMS 启动过程分析:扫描 APK 文件的过程。
- 第三节 APK 的扫描:解析 Manifest 文件,提取签名信息。
- 第四节 APK 的安装:安装流程中的权限校验和数据拷贝。
- 第五节 PKMS 之权限扫描:动态权限与静态权限的区别。
- 第六节 静默安装:系统级应用的特殊安装流程。
- 第七节 requestPermissions 源码流程解析:运行时权限申请与授权机制。
- 第八节 PKMS 面试题:应用卸载流程,多用户环境下的包管理等。
第九章 InputManagerService 源码解析
InputManagerService 处理输入事件。
- 第一节 Android Input 输入事件处理流程:从硬件中断到 EventHub,再到 InputReader 和 InputDispatcher。
- 第二节 事件分发机制:ViewRootImpl 如何接收触摸事件。
第十章 DisplayManagerService 源码解析
DisplayManagerService 管理显示设备。
- 第一节 DisplayManagerService 启动:系统启动时的显示配置加载。
- 第二节 DisplayAdapter 和 DisplayDevice 的创建:虚拟显示器与物理显示器的抽象。
- 第三节 DMS 部分亮灭屏流程:屏幕休眠与唤醒的电源管理。
- 第四节 亮度调节:背光控制与自动亮度算法。
- 第五节 Proximity Sensor 灭屏原理:距离传感器在通话中的应用。
- 第六节 Logical Display 和 Physical Display 配置的更新:多屏协同与分辨率适配。
最后
现在,所有人都在谈职场转型,无论是互联网还是其他行业。好像只要逃离了现在的行业,中年危机就不会存在的一样。其实,在我被裁员的这一年多里面,所经历的、所见到的都说明了换个行业其实还是一样会面对相同的困境。最终,我们还是会选择那个你所熟悉的航道,只有通过不断学习和深耕才有希望找到一线生机。否则,留给我们的机会几乎为零。
技术没有捷径,唯有坚持。对于中年开发者而言,构建底层技术壁垒,比单纯追求业务功能实现更为重要。希望这篇总结能为你提供一些参考,在职业发展的道路上少走弯路。