AOSP
AOSP copied to clipboard
这是一个连载的博文系列,我将持续为大家提供尽可能透彻的Android源码分析
## 前言 源码下载是我们分析源码的开始,Android源码可以全量下载,也可以单个下载,我们先介绍全量下载 ## 全量下载 官方文档 https://source.android.com/source/downloading ,只要按照上面一步步做就可以了,但是由于需要翻墙,国内无法直接访问,而整个Android项目源码巨大,即便是翻墙后下载也很慢,所以还是使用国内镜像比较好。 我推荐清华大学开源镜像,地址 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ ,这上面也是有完整的教程,我就不复制粘贴了,但是有一点要注意,你一定要备一个比较大的磁盘,至少60个G吧,还不算后期编译的。 我们分析源码其实是不需要全部代码的,因为AOSP不仅包括系统源码,还有些工具代码,如aapt,adb等,这些我们根本不需要,而且即便是系统源码,也不是所有我们都需要看,如果真的全部看,你这辈子都看不完,所以我还是推荐大家单个下载。 ## 单个下载 官方地址 https://android.googlesource.com/ ,比如我们要下载platform/frameworks/base/目录下的代码,我们可以git clone https://android.googlesource.com/platform/frameworks/base ,不过这个还是会遇到翻墙的问题,当然我们也可以用镜像。 镜像地址 https://aosp.tuna.tsinghua.edu.cn/ ,比如我们要下载platform/frameworks/base/目录,就用git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base ,如果你带宽够的话,一般几分钟就可以下载好你想要的单个源码了。 如果你想下载单个文件,或者搜索文件名及代码,可以访问 http://androidxref.com/ ,这里有部分Android的源码 ##...
## 前言 上一篇中讲了init进程的第一阶段,我们接着讲第二阶段,主要有以下内容 - 创建进程会话密钥并初始化属性系统 - 进行SELinux第二阶段并恢复一些文件安全上下文 - 新建epoll并初始化子进程终止信号处理函数 - 设置其他系统属性并开启系统属性服务 本文涉及到的文件 ``` platform/system/core/init/init.cpp platform/system/core/init/keyutils.h platform/system/core/init/property_service.cpp platform/external/selinux/libselinux/src/label.c platform/system/core/init/signal_handler.cpp platform/system/core/init/service.cpp platform/system/core/init/property_service.cpp ``` 一、创建进程会话密钥并初始化属性系统 第二阶段一开始会有一个is_first_stage的判断,由于之前第一阶段最后有设置INIT_SECOND_STAGE, 因此直接跳过一大段代码。从keyctl开始才是重点内容,我们一一展开来看 ```C int main(int argc, char** argv)...
## 前言 当我们把源码下载下来之后,会感到茫然无措,因为AOSP的源码实在是太多了,这里我们需要明确一些问题: * 要阅读哪些源码 * 阅读源码的顺序和方式 * 用什么工具来阅读 下面我将从这三个问题一一展开 ## 一、要阅读哪些源码 这个问题是比较个性化的,因为不同的人从事着不同的工作,有的人从事应用开发,可能对Java层东西感兴趣;有的人从事Framework开发,可能对Framework层感兴趣;有的从事硬件开发,可能对底层实现感兴趣。 这个都因人而异,但是有一点,不能盲目地毫无目的地看源码,因为这样的话最终你会淹没在AOSP的大海里,看了一年半截啥都看了,却又感觉都没看透,别人问你源码的东西,都能说个一二,但是一往深了说,就不知所以了。 所以对于AOSP源码,不在于多,而在于精,你不要试图把所有的源码都看懂,你只要对自己感兴趣的那部分深入研究就可以,因为即便是Google工程师也不可能把AOSP全部读完。 对于我而言,我是从事应用层开发的,我主要会了解以下几个方面的源码: * Android系统启动流程,应用启动流程,四大组件启动流程,这将列入系统启动篇 * 系统常用服务ActivityManagerService,WindowManagerService等,这将列入系统服务篇 * 通信机制,主要是Binder和Handler,这将列入通信篇 * 进程和线程的创建,运行,销毁,这将列入进程篇 * View的绘制和显示流程,事件分发机制,这将列入图形绘制篇 * Android虚拟机ART运行机制,类加载机制,Java注解,Java反射,这将列入虚拟机篇 * Android对于Java集合的优化算法,这将列入Java基础篇...
## 前言 Android本质上就是一个基于Linux内核的操作系统,与Ubuntu Linux、Fedora Linux类似,我们要讲Android,必定先要了解一些Linux内核的知识。 Linux内核的东西特别多,我也不可能全部讲完,由于本文主要讲解Android系统启动流程,所以这里主要讲一些内核启动相关的知识。 Linux内核启动主要涉及3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd进程(PID = 2),这三个进程是内核的基础。 - idle进程是Linux系统第一个进程,是init进程和kthreadd进程的父进程 - init进程是Linux系统第一个用户进程,是Android系统应用程序的始祖,我们的app都是直接或间接以它为父进程 - kthreadd进程是Linux系统内核管家,所有的内核线程都是直接或间接以它为父进程  本文将以这三个进程为线索,主要讲解以下内容: - idle进程启动 - kthreadd进程启动 - init进程启动 本文涉及到的文件 ```...
Linux系统有提供许多方便的API,就像Andoird中TextView的setText方法一样,我们只需要简单调用就可以实现一些功能,为了方便大家阅读Linux源码,我将一些常用的API列举出来 我先大致分个类吧 - 进程与进程调度 - 同步与锁 - 内存与内存策略 ## 一、进程与进程调度 ### 1.1 kernel_thread 出现在《Android系统启动流程之Linux内核》 ```C kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); ``` 这个函数作用是启动进程 - 第一个参数表示新进程工作函数,相当于Java的构造函数 - 第二个参数是工作函数的参数,相当于Java带参构造函数的参数 - 第三个参数表示启动方式 |参数名|作用| |...
## 前言 上一篇中讲到,Linux系统执行完初始化操作最后会执行根目录下的init文件,init是一个可执行程序, 它的源码在platform/system/core/init/init.cpp。 之前我们讲过init进程是用户空间的第一个进程,我们熟悉的app应用程序都是以它为父进程的, init进程入口函数是main函数,这个函数做的事情还是比较多的,主要分为三个部分 - init进程第一阶段 - init进程第二阶段 - init.rc文件解析 由于内容比较多,所以对于init的讲解,我分为三个章节来讲,本文只讲解第一阶段,第一阶段主要有以下内容 - ueventd/watchdogd跳转及环境变量设置 - 挂载文件系统并创建目录 - 初始化日志输出、挂载分区设备 - 启用SELinux安全策略 - 开始第二阶段前的准备 本文涉及到的文件 ``` platform/system/core/init/init.cpp platform/system/core/init/ueventd.cpp platform/system/core/init/watchdogd.cpp platform/system/core/init/log.cpp platform/system/core/base/logging.cpp...
你好,我在我的AS上提示如下错误:Could not download commons-compress.jar (org.apache.commons:commons-compress:1.8.1): No cached version available for offline mode 请问有什么解决方案?能否设置自行下载使其在本地找这个包?
Android在C/C++封装了许多好用的API,记录一下,方便阅读 ### 1.android::base::Split 分割字符串,用法 ```C std::vector pieces = android::base::Split(entry, "="); if (pieces.size() == 2) { fn(pieces[0], pieces[1], in_qemu); } ```
为了方便大家理解C/C++的语法,我将源码中涉及到的一些小知识整理一下,以源码分析的顺序列出,我会在知识点下列出出现的地方,大家也可以对照着看。 ### 1.String相关函数 #### 1.1 strcmp 比较两个字符串,设这两个字符串为str1,str2 若str1==str2,则返回零 若str1 < str2,则返回负数 若str1 > str2,则返回正数 #### 1.2 clear 清空字符串 #### 1.3 reserve 函数reserve()将字符串的容量设置为至少size. 如果size指定的数值要小于当前字符串中的字符数, 容量将被设置为可以恰好容纳字符的数值. #### 1.4 strcspn strcspn用于返回字符所在下标,相当于String的indexof ``` size_t...
为了方便大家理解C/C++的语法,我将源码中涉及到的一些小知识整理一下,以源码分析的顺序列出,我会在知识点下列出出现的地方,大家也可以对照着看。 ### 1.oninline、inline、__init、void 出现在《Android系统启动流程之Linux内核》 ```C /* * C语言oninline与inline是一对意义相反的关键字,inline的作用是编译期间直接替换代码块,也就是说编译后就没有这个方法了,而是直接把代码块替换调用这个函数的地方,oninline就相反,强制不替换,保持原有的函数 * __init_refok是__init的扩展,__init 定义的初始化函数会放入名叫.init.text的输入段,当内核启动完毕后,这个段中的内存会被释放掉,在本文中有讲,关注3.5 free_initmem。 * 不带参数的方法会加一个void参数 */ static noinline void __init_refok rest_init(void) { } ``` 更多使用参考[GCC特性之__init修饰解析](http://blog.csdn.net/kasalyn/article/details/17012099) ### 2.struct 出现在《Android系统启动流程之Linux内核》 ```C /* *...