Android 深入系统完全讲解

Posted 程序员入门进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 深入系统完全讲解相关的知识,希望对你有一定的参考价值。

1 android 是什么

1 如何理解 Android

Android 是一种基于 Linux 的开放源代码软件栈,为各类设备和机型而创建。下图所示为
Android 平台的主要组件。

这个图是一个框架图,很多人看到这个其实会混淆一个逻辑,这里画的是每一层,但是没有
按照进程的方式去画,我在这个基础上补充了进程方式的一个框架,主要是启动过程。

Android 本身网上讲解的启动流程很多,那为什么我还要画这张图呢? 原因是网上讲的是
比较多,但是画出来的图,我在理解的时候,总是有偏差,自己在整理,想给别人传输概念
时候,发现网上的那些图总是会带来一些误导。

我在画这张图的时候,里面标注最明显的就是进程,以及一些线程的文字,我想传递出去的
就是,虚拟机是在 Zygote 里面,是属于内部的一个实现,然后其他的 APK 在 fork 的时候,
直接拿到了一个虚拟机。

而我们的 AMS PMS 这些,我画在了 system_server 进程里面,标注是线程。让你直观上去看
到 AMS 这些是在 system_server 进程内部,不会出现理解偏差。
在 Zygote 进程里面,我标注了一些 so jar apk 的信息,这些就是在 Zygote 进程启动时候,自
己首先加载了一堆库和资源,这样子我们启动 APK 的时候,从它这里 fork 的时候,就直接
带过去了,这样子我们 APK 就直接有了一个虚拟机,这样子就能解析执行 Java 语言编出来
的 DEX 字节码了。
说回来,Android 该怎么理解呢?我想简单的说下,就是我们有一堆硬件,想让更多的人开
发使用,于是我们研究了一套开发套件,这个开发套件定义了硬件的添加接口,以及别人开
发时候的一些 API,我们把这一套东西称之为一套解决方案。
而这个解决方案,我们把它称之为 Android。Android 就可以这么去理解,先弄清楚它整个是
什么。

2 如何从已有的知识类比到 Android
这里我们主要讲的是,是否有一定的开发基础。我们在学习一个新的知识的时候,一般来讲
是跟我们已知的信息进行类比的。比如内存地址,讲的时候就是用楼房门牌号去讲的。
这个在学习的时候是叫做类比法,非常重要。如果没有这技巧,你基本上学习新知识很慢,
这也是你跟大佬的差距。
这里说下怎么来学习 Android,已知的语言比如是 C,那么第一点就是开发 Android ,主要
语言是 Java,于是如何从 C 语言学习到 Java 语言,就是你第一个要做的事情。
学习完这个,下来就是搭建 Android 环境,开发 APP.而开发 APP 过程中使用的方法,系统接
口,就是我们 C 里面的库,有头文件和静态或者动态库组成。
这是我想说的,如何去找到这样的技巧,快速的进行比对,映射,最终以最高效的方式掌握
Android 开发,这个也是我们当时一个月内就对接了 Android 项目。
C 语言到 Java 语言,基本上一周内就适应的差不多,剩下的就是多看代码,多写,多翻资料,
已经属于边用边学。
然后 Android 的知识,就是去看看网上的资料,同时要知道每个动作的意义,从而很快的总
结出来学习路径,而且是可以给同事来讲的,让大家都能够跟着快速掌握 Android 的学习知
识。
3 都有哪些知识点需要掌握
这里我们主要讲一下 Framework 需要掌握的一些知识点,希望大家能有个概念。我们后面
会逐个展开。
Java 是 Android 主要的语言,所以相关的基础需要学扎实,基础的语法,用法,以及它的锁,
高级用法在系统中很常见,所以需要注意。还有一些常见的 Hash 用法,都是需要掌握的。
这里推荐基本经典的 Java 书籍,大家可以去翻阅。《Java 编程思想 》《Effective Java》
Java 虚拟机相关的去官网去看,同时的话,可以去下载 openJDK 的源码,我当时有些实现
不懂,就是翻看的这个代码学习的。
Android 相关的虚拟机,有几个人出的书,《Android Dalvik 虚拟机结构及机制剖析》《深入
理解 Android:Java 虚拟机 ART》。为什么还推荐老的虚拟机,主要是实现的逻辑一致,对
于建立概念非常用帮助。
然后在学习 Android 的时候,书籍推荐《疯狂 Android 讲义》《第一行代码》,我们在学习
的时候,可以参考 Android 中文网,还有一个 www.androiddevtools.cn 去找相关的资料,方
便入门。

在学习的时候最好是在 Ubuntu 环境下,我们经典的版本就是 12,14,16,我再新的环境没怎
么搭建了,大家安装的时候可以参考网上文档,现在这块很成熟了。VM 虚拟机+ubuntu 系
统+Andoird 源码。
源码我们从清华园去下载就可以了。
还有的知识就是 Git 操作,这块网络资料很多,推荐个
https://www.runoob.com/git/git-tutorial.html ,有些时候我们还会用到 SVN,因为有些时候客
户给的驱动代码,modem 是 c 源码,建立在 SVN 仓库,所以两个都去学习下。
可以在本地搭建环境进行提交,删除等操作。
然后 C/C++相关的知识也是需要的,因为 Android 虚拟机内部的实现,我们的 Java 服务,实
现最后都会到 C 的底层服务支撑,最终跑到驱动或者硬件响应。
这里推荐几本书,《C 与指针》《C Primer Plus》《你必须知道的 495 个 C 语言问题》
随后我们需要掌握操作系统相关的内容,这个主要是解决理解 Linux 底层驱动,设计,整个
上层的进程管理概念,进程间通信,没有这些概念没法深入 Android 系统。
《现代操作系统》《深入理解 Linux 驱动程序设计》《深入理解 LINUX 内核 第三版》
《Unix/Linux 系统编程》《鸟哥的 Linux 私房菜》《LINUX 设备驱动程序》
在这个之外还需要掌握 Python,Makefile 的相关知识,这个直接网上找找资料就可以了。
4 源码目录结构详细讲解
对于一个学习系统的人来说,每个目录都有什么,都是很熟悉的,这个也是没办法的,必须
要掌握。一个大牛你问他这个东西怎么解决,他们有时候没有答案,但是能够快速的定位出
来,最终搞定问题,这个主要就是依赖对系统整个目录的熟知,知道该从哪个方向去找答案。
于 是 我 们 这 里 说 下 这 块 的 内 容 , 让 大 家 对 整 个 的 目 录 有 个 感 知 。 在 线 看 源 码 :
http://www.androidos.net.cn/sourcecode 或者是 androidxref,我一般用的 androidxref,因为
可以快速检索。我建议本地也下载一份代码,去阅读学习。
我们在学习安卓的时候,要记得官网文档,非常重要。
https://developer.android.google.cn/guide/platform,再一个就是很多时候我们遇见问题,都
是从源码去找答案的,这个解决问题的能力才是最为关键的,也是在一般的视频课程中讲不
到的。
下来我们说下一些目录,后面我们会单独讲怎么找代码,怎么看源码。
Android 深入系统完全讲解
1 代码目录结构
abi 应用程序二进制接口
art ART 虚拟机
bionic Android 移植的 C 库
bootable 引导程序以及 recovery
build 存放系统编译规则及 generic 等基础开发包配置
cts Android 兼容性测试套件标准
dalvik dalvik 虚拟机
developers 开发者目录
development 应用程序开发相关
device 项目配置相关内容
docs 参考文档
external 三方开源库
frameworks 应用程序框架层,Android 应用开发核心代码,由 Java 和 C++编写
hardware 硬件抽象层代码
libcore 核心库相关文件
libnativehelper 动态库,实现 JNI 库的基础
ndk NDK 相关库和代码
out 编译过程和结果输出目录
packages 应用程序包,Settings/Dialer 等系统应用都在这里
pdk Plug Development Kit 的缩写,本地开发套件
platform_testing 平台测试
prebuilts 预编译的一些资源,参与编译过程
sdk sdk 和模拟器
system 底层文件系统库、应用和组件
toolchain 工具链文件
tools 工具文件
Makefile 全局 Makefile 文件,用来定义编译规则
kernel Linux 内核
vendor 厂商定制部分,比如 MTK/展讯三方客制化部分
标记红色的代表开发时候经常会去看的代码路径,更多细节可以在随后学习中不断扩充,这
个是我常去看的目录。
这里我们再详细说下 out 目录,很多人不注意,这个里面有大宝藏 ,学习的时候要多去看
看,对编译过程,流程,最终出来的文件有很好的理解。
2 out 目录结构
out/ 编译输出目录
out/host/ 主机可执行文件,作为工具使用
out/target/product/product 目标文件

boot.img Android 启动映像(Linux 内核+根 FS)
system.img Android 核心支撑镜像
userdata.img Android 开发应用程序和数据库,挂载在 data 分区
root/ 编译到 ramdisk.img 且合并到 boot.img
system/ 整体打包成 system.img
obj/ 中间对象文件
include/ 来自组件的已编译包含文件
lib/ 引用的库文件
STATIC_LIBRARIES/ 每个子目录显示对应的静态库生成过程文件
SHARED_LIBRARIES/ 每个子目录显示对应的动态库生成过程文件
EXECUTABLES/ 每个子目录显示对应的可执行文件生成过程文件
APPS/ 每个子目录显示对应的 APK 文件生成过程文件
out/target/common/obj/APPS
symbols/ 所有目标二进制代码的符号,在出现 native 异常时候使用 addr2line 工具定位代码
位置
这个里面基本都是常看的,所以不做标记,有任何疑问可以找我,参加我的训练营。我的
微信 code_gg_boy 。
我们再来看一个手机上的目录结构,基本上目录这一节就会讲到这里,后面会不断的展开。
3 手机目录结构
init.rc 初始化配置文件
dev/驱动节点
proc/ 虚拟节点,存储进程相关的内容
sys/ 系统/内核配置,可以通过此处驱动节点,读写驱动数据
sbin/ 系统启动二进制代码(ADB 后台程序;只读
system/ 来自 system.img(读-写)
– bin/ Android 系统二进制代码
– lib/ Android 系统库
– xbin/ 非必要二进制代码
– framework/ Android 框架组件(Java) – app/ Android 应用程序(Java) – priv-app/ 系统级别的应用程序
– etc/ Android 配置文件
– etc/permissions 权限信息
– etc/wifi wifi 配置信息
– etc/bluetooth 蓝牙配置信息

  • vendor 方案公司的相关框架内容
  • media 铃声和开关机动画资源
  • fonts 字体相关
  • tts 语音播报资源

recovery/ 放置进入 recovery 模式的相关配置及应用
sdcard/ SD 卡挂载点
data/– app/ 用户安装的 Android 应用程序
– tombstones/Android 崩溃日志

  • anr/ 出现 anr 时出现的目录
    这个是手机上常看的目录清单,更多的随后会讲到,讲的过程中会给你补充进来。
    4 frameworks 目录分析
    frameworks\\native\\cmds 常 见 的 一 些 c 实 现 的 工 具 , 服 务 , 比 如 dumpsys , cmd ,
    servicemanager,后面也会单独讲到。
    frameworks\\opt 扩展的一些工具,服务。
    frameworks\\av 跟音视频相关的服务
    frameworks\\base 系统开发最常用的目录,重要。
    frameworks\\base\\packages 系统内部 APP,有 SystemUI SettingsLib 设置对应的公共库,
    SettingsProvider 操作设置相关的 db
    frameworks\\base\\core 重中之重
    frameworks\\base\\core\\java\\com\\android\\internal 系统内部使用的类,不对外部调用
    frameworks\\base\\core\\jni 系统实现的一部分 c 代码,使用 jni 对接的底层实现
    frameworks\\base\\cmds 一些底层的 bin 文件,jar 实现,比如 am pm wm
    frameworks\\base\\services\\core\\java\\com\\android\\server 系统服务在这里面,am wm pm 都
    在对应的目录下
    5 Linux 和 Android 的关系
    Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底
    层功能,例如线程和低层内存管理。
    使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发
    硬件驱动程序。
    这是官方的介绍,我这里再简单来讲下这个,应该就能很容易的理解。
    在前面我说了就是我们有一堆硬件,想让更多的人开发使用,于是我们研究了一套开发套件,
    这个开发套件定义了硬件的添加接口,以及别人开发时候的一些 API,我们把这一套东西称
    之为一套解决方案。
    而这个解决方案,我们把它称之为 Android。而 Android 的实现是在 Linux 操作系统的基础上
    的客制化。
    Android 深入系统完全讲解
    Linux,全称 GNU/Linux,是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX
    和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。伴随着互联网的发展,Linux
    得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器方面保持着强劲的发展
    势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操
    作系统的实现机制,而且可以根据自身的需要来修改完善 Linux,使其最大化地适应用户的
    需要。 [1]
    Linux 不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证
    了系统的安全。在很多企业网络中,为了追求速度和安全,Linux 不仅仅是被网络运维人员
    当作服务器使用,它还被当作服务器,甚至当作网络防火墙,这是 Linux 的一大亮点。 [2]
    Linux 具有开放源码、没有版权、技术社区用户多等特点,开放源码使得用户可以自由裁剪,
    灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈,经过适当的配置就可实现路由
    器的功能。这些特点使得 Linux 成为开发路由交换设备的理想开发平台。 [3]
    我们知道了 Linux 是一个操作系统,是可以直接使用它去开发各种软件的,Android 在 Linux
    上面,主要实现了一个称之为 ART 的虚拟机,这个主要解决的是让系统可以支持 Java 代码
    的编写。
    所以,我们把 Android 简单的理解成=Linux+Java 虚拟机。而如果我们要开发应用,就需要类
    似 SDK 的系统库支持,而 Android 中把这些称之为 Framework,实现在系统进程里面。
    而这里 Framework 简单的可以是这些:丰富、可扩展的视图系统,可用以构建应用的 UI,
    包括列表、网格、文本框、按钮甚至可嵌入的网络浏览器
    资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件
    通知管理器,可让所有应用在状态栏中显示自定义提醒
    Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈
    内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的
    数据
    这样子去理解,就比较简单一些。我们在学习知识的时候一定要记得,要做一个类比,简单
    化的框架结构,否则学的很乱,最终跟到细枝末节导致自己困惑。

以上是关于Android 深入系统完全讲解的主要内容,如果未能解决你的问题,请参考以下文章

Android 深入系统完全讲解(33)

Android 深入系统完全讲解(31)

Android 深入系统完全讲解(31)

Android深入系统完全讲解(38)

Android深入系统完全讲解(38)

Android 深入系统完全讲解(25)