作为一名程序员,肯定不仅仅限于使用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源码学习相关推荐

  1. Android源码学习之浅析SystemServer脉络

    在之前的博文中<Android源码学习之如何创建使用JNI>和<Android源码学习之如何使用eclipse+NDK>中,浅谈了如何创建使用JNI和如何利用NDK工具开发创建 ...

  2. 【Android 源码学习】 init启动

    目录 Android 源码学习 init启动 从main.cpp开始 init.cpp 部分逻辑 init启动zygote 属性服务 总结 Android 源码学习 init启动 Android 11 ...

  3. 【Android 源码学习】Zygote启动原理

    Android 源码学习 Zygote启动原理 望舒课堂 Zygote进程启动原理学习记录整理. Zygote简介 Zygote是进程在init进程启动时创建的,进程本身是app_process,来源 ...

  4. 【Android 源码学习】系统架构和启动流程

    Android 源码学习 系统架构和启动流程 望舒课堂 学习记录整理.以及以下参考文章的整理汇总.便于我个人的学习记录. 感谢IngresGe,Gityuan的精彩文章.为我们这些初探android系 ...

  5. 【Android 源码学习】SystemServer启动原理

    Android 源码学习 SystemServer启动原理 望舒课堂 SystemServer进程启动原理学习记录整理. 参考文章: Android系统启动流程(三)解析SyetemServer进程启 ...

  6. android源码学习-Toast实现原理讲解

    前言: 前些日志QQ群有朋友发了一个Toast的崩溃日志.Toast如此简单的用法怎么会崩溃呢?所以顺便就学习了一下Toast在源码中的实现,不算复杂,但内容挺多的,这里就来分享一下,方便读者. 一. ...

  7. 【Android 源码学习】SharedPreferences 源码学习

    第一章:SharedPreferences 源码学习 文章目录 第一章:SharedPreferences 源码学习 Android SharedPreferences的缺陷 MMKV.Jetpack ...

  8. Android源码学习之工厂方法模式应用

    主要内容: 工厂方法模式定义 工厂方法模式优势 工厂方法模式在Android源码中的应用 一.工厂方法模式定义 工厂方法模式定义: Define an interface for creating a ...

  9. Android源码学习之handler

    前言 是滴!我又来了...今天来讲讲老少皆宜的大名鼎鼎的handler.是的,想必handler这个东西已经被讨论的天花乱坠了,也经常被我们用在实际开发中,但是其中很多细节知识还是值得我们去学习深究的 ...

  10. Android源码学习以及在工作中的应用01-TextView

    有人说种下一棵树最好的时间是十年前,其次是现在.我已经浪费了整整十年,所以从现在起,脚踏实地,静下心来学习,一切从头开始.期望十年后的自己,无怨无悔. 我们在自动化测试的工作中,有一个这样的场景需求. ...

最新文章

  1. Vue2.0环境安装
  2. ansible playbook中使用迭代with_items案例
  3. 图像离群值_什么是离群值?
  4. “约见”面试官系列之常见面试题第二十四篇之vue-router使用(建议收藏)
  5. Hadoop的改进实验(中文分词词频统计及英文词频统计)(4/4)
  6. vs2019中如何创建qt项目_Qt在vs2019中使用及设置方法
  7. 华为 HMS 上线独立搜索服务;苹果 App Store 出现 Bug ;Ant Design 4.2.5 发布| 极客头条...
  8. [转]Java 的强引用、弱引用、软引用、虚引用
  9. 最简便的Unity详细安装步骤及官网插件
  10. Conda 下 安装 Allennlp
  11. Mathtype启动失败与Microsoft公式编辑器Equation的问题处理案例
  12. android gpio 驱动,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
  13. EditText属性输入框Kotlin.Android
  14. 记录手机连接笔记本热点无法上网问题
  15. 微信电脑版多用户登录
  16. 403 forbidden
  17. SAP MM模块-库存盘点BAPI的使用及注意点
  18. 一对一直播源码 一对一视频直播软件未来发展趋势
  19. Lucene IKAnalyzer(V2012)
  20. 如何引导市场和社会力量发展社区托育养老等服务业态?

热门文章

  1. HTTP缓存机制及其在iOS中的应用
  2. .NET回归 HTML----表单元素(1)和一些常用的标记
  3. px,em,rem单位转换工具
  4. 第六章 第一个Linux驱动程序:统计单词个数
  5. 【jQuery】jQ处理xml文件和xml字符串
  6. 如何实现一套鼠标键盘控制二台主机
  7. PostgreSQL 的 target_list分析(三)
  8. python实现文件压缩
  9. stata面板数据单位根检验llc_干货分享 | 面板数据单位根检验软件操作和解读
  10. 4 4c语言表格的画法_别再用Vlookup函数了,查找4个表格它更简单