2019-02-20 18:48:14 +08:00
2019-02-19 22:51:25 +08:00
2019-02-20 18:48:14 +08:00
2018-04-22 23:36:16 +08:00
2017-10-24 10:24:43 +08:00
2018-04-10 23:53:48 +08:00
2017-10-04 16:58:06 +08:00
2017-10-04 16:58:06 +08:00
2018-03-06 22:50:19 +08:00
2018-04-10 23:53:48 +08:00

Android 源码分析

关于我

前言

AOSP的源码是非常庞大的里面的语言主要有C/C++Java, 汇编,为了让大家能有更好的阅读体验,我专门写了篇文章作为导读

如何阅读Android源码

系统结构

Android系统结构很复杂可能大家平常都是应用层开发比较多我们开发的app属于最上层

应用层下面有个应用框架层framework,也就是我们经常在Android Studio中可以直接点击看到那些源码应用层和应用框架层都是用Java写的

在应用框架层下面是Native层也就是我们调用的native方法的实现层这一层主要是用C/C++写的

在Native层再往下就是Linux内核层这一层主要是用C和汇编来写的

在Native层和Linux内核层之间还有个硬件抽象层准确讲它应该属于Linux内核层因为都是些驱动相关的 但是因为Linux是开源的如果放在Linux内核层就必须开源代码为了保护厂商的驱动源码所以将这些代码专门提出来放到了一个硬件抽象层

可以看到Android系统用了Java,C/C++汇编这些不同的语言和层级是如何打通的呢这里主要涉及到JNI和Syscall 我们知道Java是运行在虚拟机中的在Native层就有一个专门的虚拟机dex代码和so动态链接库都会加载到这个虚拟机中 使用同一个进程空间dex代码和so动态链接库之间定义的相同的接口就像我们平时写服务器和客户端用相同的接口字段一样 这样Java和C/C++之间就可以相互通信了而这套机制就叫JNIJava Native Interface

Native层是运行在用户空间的Linux内核层是运行在内核空间一般情况下用户进程是不能访问内核的 它既不能访问内核所在的内存空间,也不能调用内核中的函数. 而Syscall就是专门用来让Native访问Linux内核的 在/platform/bionic/libc/kernel/uapi/asm-generic/unistd.h中在这个文件中为每一个系统调用规定了唯一的编号叫做系统调用号

#define __NR_epoll_create1 20
#define __NR_epoll_ctl 21
#define __NR_epoll_pwait 22
#define __NR_dup 23

这里面每一个宏就是一个系统调用号,每一个调用号都会对应Linux内核的一个操作. Syscall是单向的只能是Native调用Linux内核 JNI却是双向的Java可以调用C++,C++也可以调用Java.那么Linux内核如何调用Native呢其实也很简单 内核直接运行一个可执行程序就可以了,比如native中的init进程就是这样调用的

通信方式

Android系统中有许多通信方式最常见就是Binder和Handler这是我们平常开发中用到的另外底层常见的还有Socket, pipesignal 除了Handler只能用于线程间通信外其他都可以进行进程间通信当然你也可以用来做线程间通信只是有点杀鸡用牛刀的感觉.

Binder作为Android系统提供的一种IPC机制无论从系统开发还是应用开发都是Android系统中最重要的组成. Binder通信采用c/s架构从组件视角来说包含Client、Server、ServiceManager以及binder驱动 其核心实现原理是用系统调用ioctl在内核空间进行进程间通信它还做了许多良好的封装比如如果发现调用者和接收者是同一进程就不会去走系统调用,而是直接调用

Handler消息机制我们比较熟悉Handler消息机制是由一组MessageQueue、Message、Looper、Handler共同组成的为了方便且称之为Handler消息机制. 其核心实现原理是共享内存由于工作线程与主线程共享地址空间即Handler实例对象mHandler位于线程间共享的内存堆上工作线程与主线程都能直接使用该对象. Handler最经典的地方就是消息队列MessageQueue存放要处理的消息MessageLooper无限循环从MessageQueue中取Message发到对应线程处理

内容分类

本项目以android-8.0.0_r17和kernel/msm(高通内核android-8.0.0_r0.16)为基础,重点分析跟应用程序相关的源码,主要内容如下:

  • Android系统启动流程应用启动流程四大组件启动流程这将列入系统启动篇
  • 系统常用服务ActivityManagerService,WindowManagerService等这将列入系统服务篇
  • 通信机制主要是Binder和Handler这将列入通信篇
  • 进程和线程的创建,运行,销毁,这将列入进程篇
  • View的绘制和显示流程事件分发机制这将列入图形绘制篇
  • Android虚拟机ART运行机制类加载机制Java注解Java反射这将列入虚拟机篇
  • Android对于Java集合的优化算法这将列入Java基础篇

我将持续更新本项目尽可能地为大家提供透彻的Android源码分析每篇文章我会挂在issue上方便大家探讨并提出问题

工具篇

系统启动篇

Description
这是一个连载的博文系列,我将持续为大家提供尽可能透彻的Android源码分析
Readme 1.2 MiB
Languages
C++ 63%
C 29.6%
Java 6.4%
Assembly 0.8%
CMake 0.1%