<commit_before>---
layout: post
title: Android 源码分析开篇
categories: Android
description: 开始 Android 源码和一些优秀的第三方类库的分析
keywords: Android, RTFSC
---

终于要开篇了，虽然迟了点。

自 2014 年底从 Windows 开发转向 Android 开发以后，到现在的两年多时间里，也陆陆续续看了一些强相关的书籍和教程，按我在豆瓣标记的时间顺序：

* 《Android Programming: The Big Nert Ranch Guide》
* 《疯狂 Java 讲义》
* 《疯狂 Android 讲义》
* 《深入理解 Java 虚拟机》
* 《Android Training》
* 《Android 开发艺术探索》
* 《Android 群英传》
* 《App 研发录》

再加上平时在 GitHub 和掘金等技术社区的晃荡，接触过的资料其实也不少了，但回想起年初找工作的时候一些比较失落的经历，很要命的一点就是如自己一直也知道的那样，技术的广度还可以，可深度不够，不够聚焦。这个尴尬的年纪，在一个个焦虑的夜晚，躺在床上听着窗外偶尔传来的狗叫，汽车的呼啸，也会对自己呐喊，我不要做一个会用九种语言写 Hello World 但无一精通的程序员。

首先最应该精通的当然是自己的工作内容最相关的技术与业务。业务相关的知识可以主要放在工作时间来积累，业余的时间里，多 Read The F*cking Source Code，从优秀的源码和设计里汲取营养才是正道。有 AOSP 这样包罗万象的宝藏在侧，也无需纠结和寻觅到底应该看些什么。所以，最近计划开始写一系列 Android 源码分析的文章，包括 Android 系统源码及一些常用三方类库等等。这将是一个比较漫长的过程，需要一个脉络，可选的方式是自底向上和自顶向下：

**自底向上**，一开始就是啃硬骨头，理解各种底层概念和知识，对我这样的选手来讲，容易失去兴趣，但是后期理解上层的东西更顺畅，毕竟基础知识点已经铺垫好了。比如《老罗的 Android 之旅》，就是比较典型的采用这种方式的。

```
 ^ 难度
 |    ---
 |   /   \
 |   |   |
 |  /    |
 |  |    |
 | /     |
 | |     |
 | |     +-----------------
 |/
 +------------------------->
                        时间
```

**自顶向下**，预计是需要 从几个熟悉的话题展开，充分下探之后，基础知识大致铺垫开，后面才会比较容易。这样做的一个好处这样比较有目的性，总是知道下一个步要去找些什么，看些什么；另一点是从熟悉的东西讲起，前期曲线比较平滑。

```
 ^ 难度
 |              _
 |            _/ |
 |          _/    \
 |        _/       \
 |       /          \
 |     _/           |
 |   _/              \
 | _/                 \----
 |/
 +------------------------->
                        时间
```

自认为没有恒心与毅力像罗升阳那样自底向上面面俱到地把 Android 的各个方面都分析一遍，我的大致的思路是打算从我们最常用的一些类开始，自顶向下摸索，牵扯到哪些需要深入理解的知识点，就另开一篇详细说明，这个过程类似 JVM 的 GC 中采用的可达性算法，只要选好了 GC roots，无论是深度优先还是广度优先，天长日久，总会覆盖所有我们常用的技术及其内部的原理。

举个例子，比如我第一篇打算分析 Toast 类，那由它展开可能会逐渐讲到很多的话题：

```
Toast
|
|--- Handler
|    |
|    |--- Communicating with the UI thread
|    |
|    |--- Message/MessageQueue/Looper
|         |
|         |--- ThreadLocal
|
|--- Binder
|    |
|    |--- ServiceManager
|    |
|    |--- Inter-process communication
|    |
|    |--- ...
|
|--- Update UI outside the main thread
|
|--- ...
```

每介绍一篇，可能会发散出一些本篇中涉及但是没有深入讲解的知识点，留待后续补上，我将在文章最后把这些知识点列出来。在当前文章中需要提到的地方，就插个桩，留个尽量恰当的比喻在那里，「把它当作 XXX 理解就好了」。

大致思路就是这样，要是突然逮着什么别的想写的知识点也会直接写，年纪大了，该任性时就任性。

这么实践一阵试试，要是实在不行，还是乖乖回去跟着老罗的脚步学习吧。

开篇，就当先立个 Flag 在这里，万一成了呢，牛皮都不敢吹还哪敢做成什么事啊，了不起毕竟还有「世上无难事，只要肯放弃」嘛，有兴趣的朋友，请关注我的微信公众号「闷骚的程序员」，一起 Read The F*cking Android Source Code。

<div align="center"><img width="192px" height="192px" src="http://mazhuang.org/assets/images/qrcode.jpg"/></div><commit_msg>Update draft<commit_after>---
layout: post
title: Android 源码分析开篇
categories: Android
description: 开始 Android 源码和一些优秀的第三方类库的分析
keywords: Android, RTFSC
---

终于要开篇了，虽然迟了点。

自 2014 年底从 Windows 开发转向 Android 开发以后，到现在的两年多时间里，也陆陆续续看了一些强相关的书籍和教程，按我在豆瓣标记的时间顺序：

* 《Android Programming: The Big Nert Ranch Guide》
* 《疯狂 Java 讲义》
* 《疯狂 Android 讲义》
* 《深入理解 Java 虚拟机》
* 《Android Training》
* 《Android 开发艺术探索》
* 《Android 群英传》
* 《App 研发录》

再加上平时在 GitHub 和掘金等技术社区的晃荡，接触过的资料其实也不少了，但回想起年初找工作的时候一些比较失落的经历，很要命的一点就是如自己一直也知道的那样，技术的广度还可以，可深度不够，不够聚焦；掌握的知识是散乱的，不成体系，禁不住往深了问。这个尴尬的年纪，在一个个焦虑的夜晚，躺在床上听着窗外偶尔传来的狗叫，汽车的呼啸，也会对自己呐喊，我不要做一个会用九种语言写 Hello World 但无一精通的程序员。

首先最应该精通的是自己的工作内容最相关的技术与业务。业务相关的知识可以主要放在工作时间来积累，业余的时间里，多 Read The F\*cking Source Code，从优秀的源码和设计里汲取营养才是正道。有 AOSP 这样包罗万象的宝藏在侧，也无需纠结和寻觅到底应该看些什么，里面程序设计语言、设计模式、架构模式等等，应有尽有。所以，最近计划开始写一系列 Android 源码分析的文章，包括 Android 系统源码及一些优秀的第三方类库等等。这将是一个比较漫长的过程，需要一个脉络，可选的方式是自底向上和自顶向下：

**自底向上**，一开始就是啃硬骨头，理解各种底层概念和知识，对我这样的选手来讲，容易失去兴趣，但是后期理解上层的东西更顺畅，毕竟基础知识点已经铺垫好了。比如《老罗的 Android 之旅》，就是比较典型的采用这种方式的。

```
 ^ 难度
 |    ---
 |   /   \
 |   |   |
 |  /    |
 |  |    |
 | /     |
 | |     |
 | |     +-----------------
 |/
 +------------------------->
                        时间
```

**自顶向下**，预计是需要从几个熟悉的话题展开，充分下探之后，基础知识大致铺垫开，后面才会比较容易。这样做的一个好处是比较有目的性，总是知道下一个步要去找些什么，看些什么；另一点是从熟悉的东西讲起，前期曲线比较平滑。

```
 ^ 难度
 |              _
 |            _/ |
 |          _/    \
 |        _/       \
 |       /          \
 |     _/           |
 |   _/              \
 | _/                 \----
 |/
 +------------------------->
                        时间
```

自认为没有恒心与毅力像罗升阳那样自底向上面面俱到地把 Android 的各个方面都分析一遍，我的大致的思路是打算从我们最常用的一些类开始，自顶向下摸索，牵扯到哪些需要深入理解的知识点，就另开一篇详细说明，这个过程类似 JVM 的 GC 中采用的可达性算法，只要选好了 GC roots，无论是深度优先还是广度优先，天长日久，总会覆盖所有我们常用的技术及其内部的原理。

举个例子，比如我第一篇打算分析 Toast 类，那由它展开可能会逐渐讲到很多的话题：

```
Toast
|
|--- Handler
|    |
|    |--- Communicating with the UI thread
|    |
|    |--- Looper/Message/MessageQueue
|         |
|         |--- ThreadLocal
|
|--- Binder
|    |
|    |--- ServiceManager
|    |
|    |--- Inter-process communication
|    |
|    |--- ...
|
|--- Update UI outside the main thread
|
|--- ...
```

每介绍一篇，可能会发散出一些本篇中涉及但是没有深入讲解的知识点，留待后续补上，我将在文章最后把这些知识点列出来。在当前文章中需要提到的地方，就插个桩，留个尽量恰当的比喻在那里，「把它当作 XXX 理解就好了」。

当沿着某一个主题延伸不下去的时候，就按一些比较有体系的主题来写，比如「Android 里的设计模式」，可以单独写一个系列。

主要是想进行一些比较深入的学习和对过往知识的整理，将一个一个散落的知识点孤岛串联起来，让它们成为我的技能战斗群，写着应用代码时能对表面之下的原理了然于胸，减少写代码时对猜测和调试的依赖，对每一个我敢写出来的技能点，都禁得住往深了问。当然要是突然逮着什么别的想写的知识点也会直接写，年纪大了，该任性时就任性。

目前的计划是按照我最近一段时间更新公众号的频率，大约十天更新一篇，阅读源码主要使用的工具和方式是：

* GitHub 上的源码仓库配合 Chrome 插件 insight.io
* 自己电脑上搭建的 OpenGrok 浏览 Android 7.1.2 源码
* <http://androidxref.com/7.1.1_r6/>

大致思路就是这样，实践一阵试试。不知道自顶向下的思路是否走得下去，要是实在不行，还是乖乖回去跟着老罗的脚步学习吧。

开篇，就当先立个 Flag 在这里，万一成了呢，牛皮都不敢吹还哪敢做成什么事啊，了不起毕竟还有「世上无难事，只要肯放弃」嘛，有兴趣的朋友，请关注我的微信公众号「闷骚的程序员」，一起 Read The F\*cking Android Source Code。

<div align="center"><img width="192px" height="192px" src="http://mazhuang.org/assets/images/qrcode.jpg"/></div>
{'fraction_non_alphanumeric': 0.15293244246473645, 'fraction_numerical': 0.005011135857461025, 'mean_word_length': 3.0825757575757575, 'pattern_counts': {'":': 0, '<': 10, '<?xml version=': 0, '>': 14, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '751670', 'n_tokens_mistral': 3858, 'n_tokens_neox': 4428, 'n_words': 262}