内容涵盖绝大部分 Android 程序员所需要的技能:「数据结构算法」「程序架构」「设计模式」「性能优化」「组件化」「插件化」「热修复」「NDK技术」「自定义View」「性能优化」「Android源码分析」「深入理解Kotlin」「Java核心技术」「Jetpack」「Router」「Flutter」「RxJava」「Glide」「LeakCanary」「Dagger2」「Retrofit」「OkHttp」「ButterKnife」「GreenDAO」「经典书籍」等。如果您有任何问题或建议欢迎 Issues ,核心技术栈包括:
-
Java核心技术
-
深入理解Kotlin技术
-
Android基础
- 四大组件
- Activity 启动模式
- 数据存储
- 异步操作
- IPC
- 熟悉常用框架的使用
-
Android进阶
- UI 原理
- 性能优化
- 常用的开源框架实现原理
- Android 架构(MVC、MVP、MVVM、Clean、Jetpack)
- 设计模式、6 大设计原则
- AOP、IoC、DI
- APT、Gradle Plugin、ASM、Javassist、AspectJ
- 组件化、插件化、热修复
- NDK 技术
- Android 虚拟机
-
跨平台
- Flutter
- ReactNative
- Weex
-
团队
- 如何提高整体的团队水平?
- 如何提高提高团队内代码质量?
- 如何提高团队积极性?
我编写了一份详细的 Android 技术栈思维导图,由于 GitHub 图片国内展示不稳定,所以下面使用的树形结构目录。你可以点击查看详细的 -> 思维导图 ,下面是每个技术点的明细:
├─ Computer Sience
│ ├─ Protocol
│ │ └─ OSI、TCP/IP Model
│ ├─ Operating System
│ │ ├─ Unix、Linux
│ │ └─ Windows
├─ Java
│ ├─ Java Basic
│ │ ├─ OOP
│ │ ├─ Class/Interface
│ │ ├─ Annotation/Reflection
│ │ └─ Generic
│ ├─ 多线程
│ │ ├─ 多线程通信
│ │ │ ├─ volatile/synchronized
│ │ │ └─ await/notify/notifyAll
│ │ ├─ Thread Pool
│ │ │ ├─ Callable/Future
│ │ │ └─ 线程池各参数的意义
│ │ ├─ 并发库
│ │ │ ├─ Lock
│ │ │ ├─ Condition
│ │ │ ├─ Semaphore
│ │ │ ├─ CyclicBarrier
│ │ │ ├─ CountDownLatch
│ │ │ ├─ Exchanger
│ │ │ └─ ArrayBlockingQueue
│ │ └─ Java 并发编程
│ ├─ I/O
│ │ ├─ 字节流
│ │ │ ├─ InputStream
│ │ │ │ ├─ FileInputStream
│ │ │ │ ├─ FilterInputStream
│ │ │ │ │ ├─ BufferedInputStream
│ │ │ │ │ ├─ DataInputStream
│ │ │ │ │ └─ PushbackInputStream
│ │ │ │ ├─ ByteArrayInputStream
│ │ │ │ ├─ ObjectInputStream
│ │ │ │ ├─ SequenceInputStream
│ │ │ │ └─ PipedInputStream
│ │ │ └─ OutputStream
│ │ │ │ ├─ FileOutputStream
│ │ │ │ ├─ FilterOutputStream
│ │ │ │ │ ├─ BufferedOutputStream
│ │ │ │ │ ├─ DataOutputStream
│ │ │ │ │ └─ PrintStream
│ │ │ │ ├─ ByteArrayOutputStream
│ │ │ │ ├─ ObjectOutputStream
│ │ │ │ └─ PipedOutputStream
│ │ ├─ 字符流
│ │ │ ├─ Reader
│ │ │ │ ├─ BufferedReader
│ │ │ │ ├─ InputStreamReader
│ │ │ │ │ └─ FileReader
│ │ │ │ ├─ StringReader
│ │ │ │ ├─ PipedReader
│ │ │ │ ├─ CharArrayReader
│ │ │ │ └─ FilterReader
│ │ │ │ │ └─ PushbackReader
│ │ │ ├─ Writer
│ │ │ │ ├─ BufferedWriter
│ │ │ │ ├─ InputStreamWriter
│ │ │ │ │ └─ FileWriter
│ │ │ │ ├─ PrintWriter
│ │ │ │ ├─ StringWriter
│ │ │ │ ├─ PipedWriter
│ │ │ │ ├─ CharArrayWriter
│ │ │ │ └─ FilterWriter
│ ├─ 集合框架
│ │ ├─ List
│ │ │ ├─ ArrayList
│ │ │ ├─ LinkedList
│ │ │ ├─ Stack
│ │ │ ├─ Vector
│ │ │ └─ TreeList
│ │ ├─ Set
│ │ │ ├─ HashSet
│ │ │ ├─ LinkedHashSet
│ │ │ └─ TreeSet
│ │ ├─ Map
│ │ │ ├─ HashMap
│ │ │ ├─ LinkedHashMap
│ │ │ ├─ WeakHashMap
│ │ │ └─ TreeMap
│ │ ├─ Queue
│ │ │ ├─ PriorityQueue
│ │ │ └─ ArrayDeque
│ │ ├─ 并发包
│ │ │ ├─ ConcurrentHashMap
│ │ │ ├─ CopyOnWriteArrayList
│ │ │ ├─ CopyOnWriteArraySet
│ │ │ ├─ ArrayBlockingQueue
│ │ │ ├─ LinkedBlockingDeque
│ │ │ ├─ LinkedBlockingQueue
│ │ │ ├─ ConcurrentLinkedQueue
│ │ │ └─ DelayQueue
│ ├─ JVM
│ │ ├─ class 字节码
│ │ │ ├─ class 字节码的构成
│ │ │ ├─ class 字节码指令
│ │ │ └─ 学习字节码对开发的指导意义
│ │ ├─ class 字节码的执行
│ │ │ ├─ 方法调用
│ │ │ │ ├─ 方法调用指令
│ │ │ │ ├─ 方法重载解析
│ │ │ │ ├─ 动态分派
│ │ │ │ └─ 动态类型语言的支持
│ │ │ ├─ 方法执行
│ │ │ │ ├─ 局部变量表
│ │ │ │ ├─ 操作数栈
│ │ │ │ ├─ 动态连接
│ │ │ │ └─ 方法返回地址
│ │ │ └─ 对象的创建
│ │ │ │ ├─ 对象的创建过程
│ │ │ │ ├─ 对象的内存布局
│ │ │ │ └─ 对象的访问定位
│ │ ├─ 类加载
│ │ │ ├─ 类的加载时机
│ │ │ ├─ 类的加载过程
│ │ │ └─ 类加载器
│ │ │ │ ├─ 双亲委派机制
│ │ │ │ ├─ 自定义类加载器
│ │ │ │ ├─ 类加载器死锁问题
│ │ │ │ └─ Class.forName VS ClassLoader.loadClass
│ │ ├─ JVM 内存区域
│ │ │ ├─ 程序计数器
│ │ │ ├─ Java 虚拟机栈
│ │ │ ├─ 本地方法栈
│ │ │ ├─ Java 堆
│ │ │ ├─ 方法区
│ │ │ └─ 运行时常量池
│ │ ├─ 垃圾回收
│ │ │ ├─ 什么样的对象可以被回收
│ │ │ ├─ 什么是 GC Root
│ │ │ ├─ 垃圾回收算法
│ │ │ │ ├─ 标记-清除算法
│ │ │ │ ├─ 复制算法
│ │ │ │ ├─ 标记整理算法
│ │ │ │ └─ 分代收集算法
│ │ │ ├─ 常见的垃圾收集器
│ │ │ │ ├─ Serial 收集器
│ │ │ │ ├─ ParNew 收集器
│ │ │ │ ├─ Parallel Scavenge 收集器
│ │ │ │ ├─ Serial Old 收集器
│ │ │ │ ├─ CMS 收集器
│ │ │ │ ├─ Parallel Old 收集器
│ │ │ │ ├─ G1 收集器
│ │ │ │ └─ ZGC
│ │ │ ├─ 垃圾回收相关的内存池
│ │ │ │ ├─ Eden Space
│ │ │ │ ├─ Survivor Space
│ │ │ │ ├─ Old Gen
│ │ │ │ ├─ Metaspace
│ │ │ │ ├─ Compressed Class Space
│ │ │ │ └─ Code Cache
│ │ │ └─ JVM 内存模型
├─ Kotlin
│ ├─ Kotlin数据类型、访问修饰符
│ ├─ Kotlin 中的 Class 和 Interface
│ ├─ Lambda 表达式
│ │ ├─ 定义 Lambda 表达式
│ │ ├─ Member Reference
│ │ ├─ 常用函数 let、with、run、apply 分析
│ │ └─ Lambda 原理分析
│ ├─ 高阶函数
│ │ ├─ 高阶函数的定义
│ │ ├─ 高阶函数的原理分析
│ │ └─ 高阶函数的优化
│ ├─ Kotlin 泛型
│ │ ├─ Java 泛型:不变、协变、逆变
│ │ ├─ Kotlin 中的协变、逆变
│ │ └─ Kotlin 泛型擦除和具体化
│ ├─ Kotlin 集合
│ │ ├─ Kotlin 集合创建方式有哪些
│ │ ├─ Kotlin 集合的常用的函数
│ │ └─ Kotlin 集合 Sequence 原理
│ ├─ Kolint 操作符重载
│ │ ├─ 算术操作符重载
│ │ ├─ 比较操作符重载
│ │ ├─ 集合相关的操作符重载
│ │ ├─ 区间操作符重载
│ │ ├─ 解构操作符重载
│ │ └─ 属性委托
│ └─ Koltin 和 Java 交互的一些问题
├─ Android
│ ├─ Android 基础
│ │ ├─ 四大组件
│ │ │ ├─ Activity
│ │ │ ├─ Service
│ │ │ ├─ ContentProvider
│ │ │ └─ BroadcastReceiver
│ │ ├─ Activity 启动模式
│ │ │ ├─ standard
│ │ │ ├─ singleTop
│ │ │ ├─ singleTask
│ │ │ └─ singleInstance
│ │ ├─ 数据存储
│ │ │ ├─ SharedPreferences
│ │ │ ├─ File
│ │ │ ├─ SQLite
│ │ │ └─ Realm
│ │ ├─ 线程异步
│ │ │ ├─ Thread
│ │ │ ├─ AsyncTask
│ │ │ ├─ IntentService
│ │ │ └─ 线程池
│ │ ├─ IPC
│ │ │ ├─ IPC 方式
│ │ │ │ ├─ Bundle
│ │ │ │ ├─ 文件共享
│ │ │ │ ├─ AIDL
│ │ │ │ ├─ Messager
│ │ │ │ ├─ ContentProvider
│ │ │ │ └─ Socket
│ │ │ └─ 框架
│ │ │ │ ├─ Hermes
│ │ │ │ └─ HermesEventBus
│ │ ├─ 熟悉常用的开源框架
│ │ │ │ ├─ Glide
│ │ │ │ ├─ Retrofit
│ │ │ │ ├─ OkHttp
│ │ │ │ ├─ Dagger2
│ │ │ │ ├─ Router
│ │ │ │ ├─ EventBus
│ │ │ │ ├─ LeakCanary
│ │ │ │ └─ RxJava
│ ├─ Android 进阶
│ │ ├─ UI 原理
│ │ │ ├─ UI绘制流程及原理
│ │ │ ├─ 事件的传递机制
│ │ │ ├─ 自定义 View
│ │ │ └─ 屏幕适配
│ │ ├─ 性能优化
│ │ │ ├─ 安装包大小优化
│ │ │ ├─ 启动优化(冷启动、暖启动、热启动)
│ │ │ ├─ 耗电量优化
│ │ │ ├─ UI性能优化
│ │ │ │ ├─ XML 布局优化
│ │ │ │ └─ 代码优化
│ │ │ ├─ 字节码技术
│ │ │ │ ├─ 全局的 bug 修复
│ │ │ │ └─ 日志打点统计
│ │ │ ├─ 网络优化
│ │ │ └─ 线上、线下全链路性能监控
│ │ ├─ UI 原理
│ │ │ ├─ UI绘制流程及原理
│ │ │ ├─ 事件的传递机制
│ │ │ ├─ 自定义 View
│ │ │ └─ 屏幕适配
│ │ ├─ Android架构
│ │ │ ├─ 程序架构
│ │ │ │ ├─ MVC
│ │ │ │ ├─ MVP
│ │ │ │ ├─ MVVM
│ │ │ │ ├─ Clean
│ │ │ │ └─ Jetpack
│ │ │ ├─ 设计模式
│ │ │ │ ├─ 6大设计原则
│ │ │ │ ├─ 模板模式
│ │ │ │ ├─ 观察者模式
│ │ │ │ ├─ 单例模式
│ │ │ │ ├─ 建造者模式
│ │ │ │ ├─ 工厂模式
│ │ │ │ ├─ 适配器模式
│ │ │ │ └─ 代理模式
│ │ │ ├─ 架构**
│ │ │ │ ├─ 概念
│ │ │ │ │ ├─ IoC 控制反转
│ │ │ │ │ ├─ DI 依赖注入
│ │ │ │ │ └─ AOP 面向切面
│ │ │ │ ├─ 开源方案
│ │ │ │ │ ├─ ASM
│ │ │ │ │ ├─ Javasisit
│ │ │ │ │ └─ AspectJ
│ │ │ │ └─ 工具
│ │ │ │ │ ├─ APT
│ │ │ │ │ └─ Gradle plugin
│ │ │ ├─ 组件化
│ │ │ │ ├─ 如何处理组件之间的代码边界
│ │ │ │ ├─ 组件之间的 Router 路由
│ │ │ │ ├─ 控制反转和依赖注入
│ │ │ │ └─ 如何管理拆分的 Module
│ │ │ ├─ 插件化
│ │ │ │ ├─ 发展历程
│ │ │ │ │ ├─ 2014 年
│ │ │ │ │ │ └─ Dynamic-load-apk
│ │ │ │ │ ├─ 2015 年
│ │ │ │ │ │ ├─ OpenAltas
│ │ │ │ │ │ ├─ DroidPlugin
│ │ │ │ │ │ └─ Small
│ │ │ │ │ ├─ 2016 年
│ │ │ │ │ │ └─ Zeus
│ │ │ │ │ ├─ 2017 年
│ │ │ │ │ │ ├─ Atlas
│ │ │ │ │ │ ├─ RePlugin
│ │ │ │ │ │ └─ VirtualAPK
│ │ │ │ │ ├─ 2019 年
│ │ │ │ │ │ ├─ Qigsaw
│ │ │ │ │ │ └─ Shadow
│ │ │ ├─ 热修复
│ │ │ │ ├─ Native Hook
│ │ │ │ │ ├─ Dexposed
│ │ │ │ │ ├─ AndFix
│ │ │ │ │ └─ HotFix
│ │ │ │ ├─ Java Multidex
│ │ │ │ │ ├─ QZone
│ │ │ │ │ ├─ QFix
│ │ │ │ │ ├─ Nuwa
│ │ │ │ │ └─ RocooFix
│ │ │ │ ├─ Java Hook
│ │ │ │ │ ├─ Robust
│ │ │ │ │ └─ Aceso
│ │ │ │ ├─ Dex Replace
│ │ │ │ │ ├─ Tinker
│ │ │ │ │ └─ Amigo
│ │ │ │ ├─ 混合/优化(商业收费)
│ │ │ │ │ └─ Sophix
│ │ │ ├─ 知晓常用开源框架的实现原理
├─ Android 虚拟机
│ ├─ Dalvik
│ └─ ART
├─ NDK
│ ├─ C/C++
│ ├─ FFmpeg
│ └─ AndroidStudio NDK
├─ 跨平台
│ ├─ H5
│ ├─ ReactNative
│ ├─ Weex
│ └─ Flutter
├─ 团队
│ ├─ 如何提高整体的团队水平?
│ ├─ 如何提高提高团队内代码质量?
│ └─ 如何提高团队积极性?
- 数据结构与算法(十四)深入理解红黑树和JDK TreeMap和TreeSet源码分析
- 数据结构与算法(十三)平衡二叉树之AVL树
- 数据结构与算法(十二)并查集(Union Find)及时间复杂度分析
- 数据结构与算法(十一)Trie字典树
- 数据结构与算法(十)线段树(Segment Tree)入门
- 数据结构与算法(九)Set集合和BinarySearchTree的时间复杂度分析
- 数据结构与算法(八)二分搜索树(Binary Search Tree)
- 数据结构与算法(七)树和二叉树
- 数据结构与算法(六)二叉堆、优先队列和Java PriorityQueue
- 数据结构与算法(五)深入理解递归
- 数据结构与算法(四)队列和 Java ArrayDeque 源码剖析
- 数据结构与算法(三)栈和 Java Stack 源码分析
- 数据结构与算法(二)线性表之链式存储和LinkedList实现
- 数据结构与算法(一)线性表之顺序存储和 ArrayList、Vector 源码剖析
- Java I/O 流操作(一)System Properties Runtime 类
- Java I/O 流操作(二)字节流与缓冲流
- Java I/O 流操作(三)File 文件操作、PrintWriter、SequenceInputStream
- Java I/O 流操作(四)对象的序列化
- Java 多线程(一)线程间的互斥和同步通信
- Java 多线程(二)同步线程分组问题
- Java 多线程(三)线程池入门 Callable 和 Future
- Java 多线程(四)ThreadPoolExecutor 线程池各参数的意义
- Java 多线程(五)Lock 和 Condition 实现线程同步通信
- Java 多线程(六)Semaphore 实现信号灯
- Java 多线程(七)CyclicBarrier 同步的工具类
- Java 多线程(八)CountDownLatch 同步工具类
- Java 多线程(九)Exchanger 同步工具类
- Java 多线程(十)ArrayBlockingQueue 阻塞队列
- Java 多线程(十一)JDK 同步集合
- 数据结构与算法(十四)深入理解红黑树和JDK TreeMap和TreeSet源码分析
- 数据结构与算法(十三)平衡二叉树之AVL树
- 数据结构与算法(十二)并查集(Union Find)及时间复杂度分析
- 数据结构与算法(十一)Trie字典树
- 数据结构与算法(十)线段树(Segment Tree)入门
- 数据结构与算法(九)Set集合和BinarySearchTree的时间复杂度分析
- 数据结构与算法(八)二分搜索树(Binary Search Tree)
- 数据结构与算法(七)树和二叉树
- 数据结构与算法(六)二叉堆、优先队列和Java PriorityQueue
- 数据结构与算法(五)深入理解递归
- 数据结构与算法(四)队列和 Java ArrayDeque 源码剖析
- 数据结构与算法(三)栈和 Java Stack 源码分析
- 数据结构与算法(二)线性表之链式存储和LinkedList实现
- 数据结构与算法(一)线性表之顺序存储和 ArrayList、Vector 源码剖析
- ArrayBlockingQueue 阻塞队列
- 深入理解 Java 虚拟机(一)~ class 字节码文件剖析
- 深入理解 Java 虚拟机(二)~ 类的加载过程剖析
- 深入理解 Java 虚拟机(三)~ class 字节码的执行过程剖析
- 深入理解 Java 虚拟机(四)~ 各种容易混淆的常量池
- 深入理解 Java 虚拟机(五)~ 对象的创建过程
- 深入理解 Java 虚拟机(六)~ Garbage Collection 剖析
- 设计模式 ~ 面向对象 6 大设计原则剖析与实战
- 设计模式 ~ 模板方法模式分析与实战
- 设计模式 ~ 观察者模式分析与实战
- 设计模式 ~ 单例模式分析与实战
- 设计模式 ~ 深入理解建造者模式与实战
- 设计模式 ~ 工厂模式剖析与实战
- 设计模式 ~ 适配器模式分析与实战
- 设计模式 ~ 装饰模式探究
- 设计模式 ~ 深入理解代理模式
- 设计模式 ~ 小结
- Android MVP架构改造~如何重用顶层业务
- 二维火Android云收银模块化架构实践
- Android架构—MVP架构在Android中的实践
- Android-MVVM架构-Data Binding的使用
- 使用 repo 管理 Android 组件化项目
- Android Jetpack(一)Lifecycle 组件原理剖析
- Android Jetpack(二)ViewModel 组件原理剖析
- Android Jetpack(三)LiveData 组件原理剖析
- RxJava create操作符的用法和源码分析
- RxJava map操作符用法详解
- RxJava flatMap操作符用法详解
- RxJava concatMap操作符用法详解
- RxJava onErrorResumeNext操作符实现app与服务器间token机制
- RxJava retryWhen操作符实现错误重试机制
- RxJava 使用debounce操作符优化app搜索功能
- RxJava concat操作处理多数据源
- RxJava zip操作符在Android中的实际使用场景
- RxJava switchIfEmpty操作符实现Android检查本地缓存逻辑判断
- RxJava defer操作符实现代码支持链式调用
- combineLatest操作符的高级使用
- RxJava导致Fragment Activity内存泄漏问题
- interval、takeWhile操作符实现获取验证码功能
- RxJava线程的自由切换
- Android Retrofit 源码系列(一)~ 原理剖析
- Android Retrofit 源码系列(二)~ 自定义 CallAdapter
- Android Retrofit 源码系列(三)~ 整合 RxJava、Coroutine 分析
- Android Retrofit 源码系列(四)~ 文件上传
- Android Retrofit 源码系列(五)~ 设计模式分析