🔥【Android 面经 + Android 学习指南】一份帮助 Android 开发者知识积累与能力进阶的学习路线
APACHE-2.0 License
这是一份帮助 Android 开发者知识积累与能力进阶的学习路线,主要集中在 Java、Android、计算机基础、Flutter、NDK、产品和软实力等话题。
小彭的整个 Android 知识体系是参考了杜威十进制的知识分类思想进行分级整理,未来小彭也会按照这个体系去输出内容。有很多细节的地方,考虑到不是很完善的地方,大家可以提 Issue 给意见(别忘记 Star 哟)。
1、⭐ 先给一个 Star: 你的支持对我非常重要,我的内容质量绝对对得起你的 Star,给我一点创作的动力,感谢。
2、进小彭的 Android 交流群: 加我微信进群,我们对群质量有要求,你可以在这里找到志同道合的朋友。群里可以讨论技术、分享文章、聊天、吐槽,允许适当发招聘广告,不受欢迎的行为是严格禁止的:
3、关注我的 公众号: 坚持高质量原创内容,不人云亦云,公众号后续是我主要的内容更新平台;
4、关注我的 掘金、知乎 和 《AndroidFamily》 专栏: 掘金上有我历史发布过的所有文章;
5、关注 AndroidFamilyDemo 项目: 该项目作为 《AndroidFamily》 专栏配套 “示例程序” 而存在,旨在帮助读者更直观感性地理解纸面上的知识点,进一步提高学习效率;
6、催文: 我会优先输出大多数读者朋友感兴趣的内容,你可以在 Issue 里提出你的需求,小彭会按照大家普遍的需求调整方向。当然同时能请小彭喝一杯速溶咖啡的话,你就是很 Nice 的 boy!
很快的,再过几个月就已经是工作四年的老同学了。这几年和不少同学共事过,发现不少人(包括我在内)平时看起来工作努力,也有足够的能力“应付”需求,但一旦跳出舒适区,到更高的要求去解决问题, 却不一定能游刃有余。为什么会这样,我想原因是多方面的:
1、缺乏深度,不知其所以然: 懂得运用技术去解决问题,但没有思考过选择这些技术背后的逻辑,对技术背后的底层原理也知之甚少。这种状态在遇到有一定深度的任务时,会束手无策或南辕北辙。
2、知识碎片化,不成体系: 对每项技术都有所涉猎,但却无法站在更高 / 更深的角度理解使用的技术,也无法完整且有条理地描述出项目中使用到的技术。这种状态很难说有能力胜任复杂业务 / 复杂系统设计。
是什么原因导致出现这种状态,是公司的原因吗?也许。在初创团队,会更多地奉行 “拿来主义”,很多问题直接使用第三方 SDK 解决。只有在大型团队,才有机会真正参与到基础平台的研发。事实确实如此,业务和团队的限制因素的确存在并且影响巨大,但这是决定因素吗?我想,我们需要问自己是否真正地去努力了吗?既然在小厂,那么就更加应该坚持学习,持续探索技术深度,在自己的能力边界疯狂试探,这些行为会在将来晋升或者跳槽时称为自己的筹码和亮点。我会推荐你读读看张绍文(前微信工程师)的《做一名有高度的移动开发工程师》,包括整个专栏,很多内容会激发你的思考。
回到主题,如何成为有高度的移动开发工程师呢?首先需深度和广度:能站在客户端的角色上,深入钻研一个问题在客户端技术上的实现细节,并且持续打磨,同时又能横向全面地思考每个细节 / 边界。然而,移动开发已经不是单兵作战的时代,随着业务复杂性提升,单纯的客户端优化已经不能解决业务述求,这个时候就需要跳出客户端的角色范畴,站在更高的角度思考问题,清楚每个端能够做和不能做的事情,而不局限在客户端这一亩三分地。
很多 Android 开发者有焦虑和浮躁的心态,这似乎已经称为一种普遍的现象,更不用说还待在小厂的同学。的确,移动开发已经不再是 “风口”,很多初级移动开发的岗位在减少,一线大厂对候选人的要求也变得越来越严格,对算法和计算机底层知识也有深入的考察。难吗,你是不是在羡慕那些当年选择了前端或服务端的同学?但是据我观察,往往是服务端羡慕客户端,前端看着服务端眼馋,而客户端又盯着服务端手中的蛋糕。我不知道谁在说心里话,也许,别人碗里的饭就是香一点,更别提 AI、算法、音视频这些香饽饽。
有的人选择了转行,结果是站在风口上被吹到天上,还是在任何方向都没有深度积累,最终没有竞争力。我没有经历过,所以我也看不到最终的结果。我们唯一能看到的结果是:“风口是等来的,而不是追来的”,人家之所以能站在风口上,原因是有多年的积累,最终等来的风口。站在当前时代,我们首先要做的,就是抛弃焦虑,焦虑解决不了任何问题。唯有无所畏惧地往前冲,才能留有一席之地,那些落后于时代的移动开发者必将被淘汰。看过王争(前 Google 工程师)在文章里写过:“每一个优秀的人,都有一段沉默的时光,那段时光是付出了很多努力的,却得不到结果的日子,我们把它叫做扎根。” 你经历过这个阶段吗?
010 Java 编程
020 Kotlin 编程
030 Java 虚拟机
031 Java 虚拟机内存管理
031.1 内存分布模型
031.2 垃圾回收机制
031.3 对象创建过程
032 Java 编译过程
032.1 Java 编译过程
032.2 Class 文件结构
032.3 APT 注解处理器
032.4 注解
032.5 类加载机制
032.6 泛型机制
033 Java 虚拟机执行系统
033.1 方法调用与方法返回
033.2 重载与重写
033.3 反射机制
033.4 异常机制
034 并发编程
035 Java 集合
110 Android 四大组件
111 Activity
112 Service
113 BroadcastReceiver
114 ContentProvider
115 Intent
115.1 Intent 基础
116 Context
120 Android 核心原理
121 Android IPC 通信
122 Android 虚拟机
123 Android 系统层服务
123.1 Android 系统架构
123.2 Android 系统启动过程
123.3 应用安装过程
123.4 四大组件启动过程
124 Android 应用层机制
124.1 Handler 机制
124.2 事件分发机制
124.3 Window 机制
124.4 视图框架
124.5 布局解析
124.6 绘制机制
124.7 ANR 机制
125 Android 编译过程
125.1 APK 编译过程
125.2 APK 文件格式
125.3 DEX 文件格式
125.4 so 文件格式
126 Android 资源管理机制
126.1 资源基础
126.2 资源编译过程
126.3 资源匹配过程
126.4 资源案例:换肤
126.5 资源案例:插件化
126.6 资源案例:组件化资源冲突
130 Android 核心特性
131 Android 版本适配
132 权限机制
132.1 权限基础
132.2 动态权限
132.3 特殊权限 - 设备管理器
132.4 特殊权限 - 无障碍服务
132.5 特殊权限 - 通知使用权限
133 系统通知
134 持久化存储
134.1 键值对存储 - SharedPreference
134.2 键值对存储 - MMKV
134.3 键值对存储 - DataStore
135 网络请求
136 桌面微件 Widget
140 Android 组件原理
141 Jetpack 组件
141.08 RecyclerView:可复用型列表视图
141.09 Navigation:单 Activity 多 Fragment 的导航方案
141.11 Hilt:从 Dagger2 到 Hilt 玩转依赖注入(二)
141.14 DataStore:新一代键值对存储方案
141.15 Room:ORM 数据库访问框架
141.16 WindowManager:加强对多窗口模式的支持
141.17 WorkManager:加强对后台任务的支持
141.18 Compose:新一代视图开发方案
142 网络组件
142.1 OkHttp
142.2 Retrofit
142.3 Glide
143 序列化组件
143.2 Protobuf
144 持久化组件
145 调优组件
146 其他
150 Android UI 开发
151 Android UI 基础
151.1 Material Design
151.3 自定义 View 基础
152 文本
152.01 TextView 文本控件
152.02 Html 富文本
152.03 Span 富文本
152.04 IconFont 图标文字
153 图片
153.01 图片控件
153.02 ImageView 使用详解
153.03 Bitmap 使用详解
153.04 Drawable 使用详解
153.05 资源图片加载过程
153.07 图片解码过程
153.08 Bitmap 复用机制
153.09 Bitmap 硬件位图
153.10 计算图片内存占用
153.11 常见图片类型解析
153.12 图片优化概述
153.13 图片优化案例 - NativeBitmap
153.14 图片优化案例 - 大图加载
153.15 图片优化案例 - 大图监测
153.16 图片优化案例 - 图片慢响应排查
154 动画
154.1 动画基础
154.2 Lottie 动画
155 交互
156 高级组件
156.1 SurfaceView
156.2 NestedScrollView
156.3 RecyclerView
其他
160 Android 性能优化
170 Android 工程化
171 Gradle 构建工具
172 AGP 插件
172.1 AGP 构建过程
172.2 AGP 常用配置项
172.6 AGP 案例:多渠道打包
173 组件化开发
173.2 组件化基础
173.3 ARouter 原理分析
173.4 组件化案例 - 通用方案
173.6 组件化案例 - Key-Value
174 AOP 面向切面
174.01 AOP 基础
174.02 Java 注解
174.03 Java APT 注解处理器
174.06 AspectJ
174.07 Javassist
174.08 ASM
174.09 JavaPoet
174.10 KotlinPoet
175 应用测试
175.1 单元测试基础
175.2 Android 调试基础
176 动态化
177 安全与逆向
180 Compose
210 计算机组成原理
211 计算机组成结构
211.3 学习计算机组成原理,到底在学什么?
212 数制和编码
213 处理器系统
213.2 CPU 如何执行任务
213.3 从源码到程序执行
213.4 GPU 图形处理器
214 存储器系统
215 IO 系统
220 计算机网络
221 计算机网络基础
221.1 计算机网络基础概念
222 底层网络协议
222.01 TCP
222.02 UDP
223 应用层网络协议
223.02 HTTP 协议
223.04 HTTPS 协议
224 网络技术
224.1 CDN
224.2 Nginx 代理服务
225 网络调试工具
225.1 网络调试命令
225.3 Postman
225.4 WireShark
230 操作系统
231 操作系统基础
232 操作系统启动过程
233 进程管理
234 内存管理
235 文件管理
236 IO 管理
237 进程间通信
240 数据结构与算法
241 基础数据结构
241.1 线性表
241.3 队列
241.4 栈
242 高级数据结构
[242.02 差分数组]
242.04 树状数组(区间查询)
242.05 字典树
242.10 图
242.11 布隆过滤器(大数据判存)
243 算法设计基础
243.01 复杂度分析
243.03 分治算法
243.04 DFS、BFS
243.06 贪心算法
243.07 动态规划
244 算法应用
244.02 排序算法
245 编程技巧
246 经典题目
247 思维逻辑题
248 竞赛
250 数据库
260 设计模式
410 C/C++ 基础
420 JNI 基础
430 NDK 基础
430.1 NDK 编译基础:ndk-build & CMake
420.2 so 文件格式
420.4 NDK 案例 - so 文件动态化
420.5 NDK 案例 - so 文件精简
420.6 NDK 案例 - Native 内存泄漏监控
440 音视频基础理论
440.1 视频基础理论
440.2 音频基础理论
440.3 H.264 视频压缩编码
440.4 音频压缩编码
440.5 FFMPEG 基础
440.6 OPENSL ES 基础
510 Git 版本控制
520 CI/CD 持续集成
530 开源
地图
日志
数据
IM 即时通信
账号体系
推送
社交分享
红包
设备
信息流
搜索
应用网关
Hybird
深度链接
隐私
如果本仓库对你有帮助,可以请小彭喝杯速溶咖啡。
Copyright [2022] [Peng Xurui]
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.