Android源码学习
作为一名程序员,肯定不仅仅限于使用API文档,因为浮于表面是远远不够的。进阶学习的阶段,需要我们保持一颗好奇的心,深入阅读Android源码,学习优秀的代码风格和设计思想,知其然并且知其所以然。
引用Google的一张框架图:
- Applications层,和用户直接交互的就是这些应用程序,它们都是用Java开发的。
- Java Framework层,这一层大部分用Java语言编写。它是Android平台上Java世界的基石。
- C++ Framework/Libraries层,这一层提供动态库(也叫共享库)、Android运行时库、Dalvik虚拟机等。从编程语言上来说,这一层大部分都是用C或C++写的,所以也可以简单地把它看成是Native层。
- Linux Kernel层,Android是基于Linux内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。
四、Android架构
Google提供的四层架构非常经典,如果我们要深入学习这个架构,最好就是以Android系统启动流程开始学起,然后一步一步展开,牵引学习。这样不至于我们陷入源码的大海里而没有方向。
这个是之前我画的一张启动流程图:
Java和C++通过JNI连接,C/C++通过system call直接调用linux os。
4.1 Loader层
1. Boot ROM:
上电后,BootRom会被激活,引导芯片代码开始从预定义的地方(固化在ROM)开始执行,然后加载引导程序到RAM。
2. Boot Loader引导程序
Boot Loader是启动Android系统之前的引导程序,引导程序是OEM厂商或者运营商加锁和限制的地方,它是针对特定的主板与芯片的。OEM厂商要么使用很受欢迎的引导程序比如redboot、uboot、ARMboot等或者开发自己的引导程序,它不是Android操作系统的一部分。
Boot Loader主要作用是检查RAM,初始化硬件参数等功能。
4.2 Kernel层
Kernel的启动流程:
alps/kernel/init/main.c
start_kernel() ==> rest_init() ==> kernel_thread(kernel_init) ==> kernel_init()
0号进程:
swapper进程(pid=0):又称为idle进程, 叫空闲进程,由系统自动创建, 运行在内核态。
系统初始化过程Kernel由无到有开创的第一个进程, 也是唯一一个没有通过fork或者kernel_thread产生的进程。
swapper进程用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作。
1号进程
init进程(pid=1):由0号进程通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终运行在用户空间,init进程是所有用户进程的鼻祖。
2号进程
kthreadd进程(pid=2):由0号进程通过kernel_thread创建,是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。
kthreadd运行在内核空间, 负责所有内核线程的调度和管理 , kthreadd进程是所有内核进程的鼻祖。
4.3 Native层
Native层主要是init一号进程,并且由其孵化出来的一系列daemon进程,还有一些列native service。
- init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;
- init进程还启动servicemanager、bootanim、mediaserver等重要本地服务
- init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程,Zygote是所有Java进程的父进程。
4.4 Java层
- Zygote是第一个Java进程,并且是所有java进程的父进程,由init进程解析init.rc文件后fork生成。
- System Server进程,是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程。System Server负责启动和管理整个Java framework,包含ActivityManager,PackageManager,WindowManager等服务。
4.5 Application层
Zygote进程孵化出的第一个App进程是Launcher,Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。所有的App进程都是由Zygote进程fork生成的。
五、学习计划
了解了大致的框架体系之后,接下来就是给自己列一个学习计划。博主不定期总结学习内容到博客上面来,与大家一起分享。博客会以Android N源码为主来分析,尽量每个知识点做到多画图,多总结,少贴大段源码,避免犯困。
5.1 四大组件
Android应用的四大组件Activity,Service,Broadcast Receiver, Content Provider。
- 四大组件基础知识
- Android四大组件
- Android组件 - Activity
- Android组件 - Service
- Android组件 - Broadcast Receiver
- Android组件 - Content Provider
5.2 消息处理机制
- Android消息处理机制 Looper、Handler、Message介绍
- Android消息机制
5.3 IPC通信
- Binder机制
- Binder实用指南(一) - 理解篇
- Binder实用指南(二) - 实战篇
- Socket通信
5.4 系统启动
- Android系统启动总结,包含如何启动
init进程
,如何启动zygote进程
和system_server进程
:- Android系统启动流程
- init进程相关包含init rc语法
- Zygote进程相关知识
- system_server进程
- DVM的启动
5.4 系统服务
- Android系统服务 - ActivityManagerService
- AMS启动流程
- AMS的Activity调度
- Android系统服务 - PackageManagerService
- PackageManagerService启动流程
- 应用程序安装流程
- 应用程序卸载流程
- Installd守护进程
- Android系统服务 - WindowManagerService
- Surface View原理
- Android系统服务- SurfaceFlinger推图
- Input系统
- InputReader介绍
- InputDispatcher介绍
- Android系统服务 - PowerManagerService
- Android系统服务 - UserManagerService
- MediaServer
- AudioFlinger - 处理上层AudioTrack创建的音频
- MediaPlayerService服务:StageFrightPlayer本地播放、NuPlayer在线播放
5.5 安全机制
- Android系统build阶段签名机制
- APK签名机制
- APK逆向 - smali注入
5.6 问题分析
- ANR问题原理和分析
- Crash/Exception问题分析
- Java Exception
- Native Exception
- Kernel Panic
- LowMemoryKiller
5.7 工具篇
- Android.mk介绍
- 理解和使用systrace
参考:https://maoao530.github.io/2017/02/06/android-study/
Android源码学习相关推荐
- Android源码学习之浅析SystemServer脉络
在之前的博文中<Android源码学习之如何创建使用JNI>和<Android源码学习之如何使用eclipse+NDK>中,浅谈了如何创建使用JNI和如何利用NDK工具开发创建 ...
- 【Android 源码学习】 init启动
目录 Android 源码学习 init启动 从main.cpp开始 init.cpp 部分逻辑 init启动zygote 属性服务 总结 Android 源码学习 init启动 Android 11 ...
- 【Android 源码学习】Zygote启动原理
Android 源码学习 Zygote启动原理 望舒课堂 Zygote进程启动原理学习记录整理. Zygote简介 Zygote是进程在init进程启动时创建的,进程本身是app_process,来源 ...
- 【Android 源码学习】系统架构和启动流程
Android 源码学习 系统架构和启动流程 望舒课堂 学习记录整理.以及以下参考文章的整理汇总.便于我个人的学习记录. 感谢IngresGe,Gityuan的精彩文章.为我们这些初探android系 ...
- 【Android 源码学习】SystemServer启动原理
Android 源码学习 SystemServer启动原理 望舒课堂 SystemServer进程启动原理学习记录整理. 参考文章: Android系统启动流程(三)解析SyetemServer进程启 ...
- android源码学习-Toast实现原理讲解
前言: 前些日志QQ群有朋友发了一个Toast的崩溃日志.Toast如此简单的用法怎么会崩溃呢?所以顺便就学习了一下Toast在源码中的实现,不算复杂,但内容挺多的,这里就来分享一下,方便读者. 一. ...
- 【Android 源码学习】SharedPreferences 源码学习
第一章:SharedPreferences 源码学习 文章目录 第一章:SharedPreferences 源码学习 Android SharedPreferences的缺陷 MMKV.Jetpack ...
- Android源码学习之工厂方法模式应用
主要内容: 工厂方法模式定义 工厂方法模式优势 工厂方法模式在Android源码中的应用 一.工厂方法模式定义 工厂方法模式定义: Define an interface for creating a ...
- Android源码学习之handler
前言 是滴!我又来了...今天来讲讲老少皆宜的大名鼎鼎的handler.是的,想必handler这个东西已经被讨论的天花乱坠了,也经常被我们用在实际开发中,但是其中很多细节知识还是值得我们去学习深究的 ...
- Android源码学习以及在工作中的应用01-TextView
有人说种下一棵树最好的时间是十年前,其次是现在.我已经浪费了整整十年,所以从现在起,脚踏实地,静下心来学习,一切从头开始.期望十年后的自己,无怨无悔. 我们在自动化测试的工作中,有一个这样的场景需求. ...
最新文章
- Vue2.0环境安装
- ansible playbook中使用迭代with_items案例
- 图像离群值_什么是离群值?
- “约见”面试官系列之常见面试题第二十四篇之vue-router使用(建议收藏)
- Hadoop的改进实验(中文分词词频统计及英文词频统计)(4/4)
- vs2019中如何创建qt项目_Qt在vs2019中使用及设置方法
- 华为 HMS 上线独立搜索服务;苹果 App Store 出现 Bug ;Ant Design 4.2.5 发布| 极客头条...
- [转]Java 的强引用、弱引用、软引用、虚引用
- 最简便的Unity详细安装步骤及官网插件
- Conda 下 安装 Allennlp
- Mathtype启动失败与Microsoft公式编辑器Equation的问题处理案例
- android gpio 驱动,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
- EditText属性输入框Kotlin.Android
- 记录手机连接笔记本热点无法上网问题
- 微信电脑版多用户登录
- 403 forbidden
- SAP MM模块-库存盘点BAPI的使用及注意点
- 一对一直播源码 一对一视频直播软件未来发展趋势
- Lucene IKAnalyzer(V2012)
- 如何引导市场和社会力量发展社区托育养老等服务业态?
热门文章
- HTTP缓存机制及其在iOS中的应用
- .NET回归 HTML----表单元素(1)和一些常用的标记
- px,em,rem单位转换工具
- 第六章 第一个Linux驱动程序:统计单词个数
- 【jQuery】jQ处理xml文件和xml字符串
- 如何实现一套鼠标键盘控制二台主机
- PostgreSQL 的 target_list分析(三)
- python实现文件压缩
- stata面板数据单位根检验llc_干货分享 | 面板数据单位根检验软件操作和解读
- 4 4c语言表格的画法_别再用Vlookup函数了,查找4个表格它更简单