Android源码学习「建议收藏」

Android源码学习「建议收藏」作为一名程序员,肯定不仅仅限于使用API文档,因为浮于表面是远远不够的。进阶学习的阶段,需要我们保持一颗好奇的心,深入阅读Android源码,学习优秀的代码风格和设计思想,知其然并且知其所以然。引用Google的一张框架图:Applications层,和用户直接交互的就是这些应用程序,它们都是用Java开发的。 JavaFramework层,这一层大部分用Java语言编写。它是An…

大家好,又见面了,我是你们的朋友全栈君。

作为一名程序员,肯定不仅仅限于使用API文档,因为浮于表面是远远不够的。进阶学习的阶段,需要我们保持一颗好奇的心,深入阅读Android源码,学习优秀的代码风格和设计思想,知其然并且知其所以然。

引用Google的一张框架图:

android-framework

  • Applications层,和用户直接交互的就是这些应用程序,它们都是用Java开发的。
  • Java Framework层,这一层大部分用Java语言编写。它是Android平台上Java世界的基石。
  • C++ Framework/Libraries层,这一层提供动态库(也叫共享库)、Android运行时库、Dalvik虚拟机等。从编程语言上来说,这一层大部分都是用C或C++写的,所以也可以简单地把它看成是Native层。
  • Linux Kernel层,Android是基于Linux内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。

四、Android架构

Google提供的四层架构非常经典,如果我们要深入学习这个架构,最好就是以Android系统启动流程开始学起,然后一步一步展开,牵引学习。这样不至于我们陷入源码的大海里而没有方向。

这个是之前我画的一张启动流程图:

android-boot-up.png

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组件 – Activity
  • Android组件 – Service
  • Android组件 – Broadcast Receiver
  • Android组件 – Content Provider

5.2 消息处理机制

5.3 IPC通信

5.4 系统启动

  • Android系统启动总结,包含如何启动init进程,如何启动zygote进程system_server进程
  • init进程相关包含init rc语法
  • Zygote进程相关知识
  • system_server进程
  • DVM的启动

5.4 系统服务

  • Android系统服务 – ActivityManagerService
    • AMS启动流程
    • AMS的Activity调度
  • Android系统服务 – PackageManagerService
  • Android系统服务 – WindowManagerService
    • Surface View原理
  • Android系统服务- SurfaceFlinger推图
  • Input系统
    • InputReader介绍
    • InputDispatcher介绍
  • Android系统服务 – PowerManagerService
  • Android系统服务 – UserManagerService
  • MediaServer
    • AudioFlinger – 处理上层AudioTrack创建的音频
    • MediaPlayerService服务:StageFrightPlayer本地播放、NuPlayer在线播放

5.5 安全机制

5.6 问题分析

  • ANR问题原理和分析
  • Crash/Exception问题分析
    • Java Exception
    • Native Exception
    • Kernel Panic
  • LowMemoryKiller

5.7 工具篇

参考:https://maoao530.github.io/2017/02/06/android-study/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134747.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java中Scanner的用法:单行/多行输入

    Java中Scanner的用法:单行/多行输入Java的Scanner用法,主要用于算法笔试时的控制台输入问题:解决这种情况下的Scanner输入:单行,多行,数值,字符串最好解决的情况单行输入多个字符串多行输入多个字符串问题:解决这种情况下的Scanner输入:单行,多行,数值,字符串平时写程序一般不用Scanner,线上笔试的时候,各大公司热衷于Scanner输入。平时用LeetCode刷题也不会用到,结果多次在笔试时候卡在Scan……

    2022年7月20日
    83
  • IUnKNown接口——QueryInterface函数

    IUnKNown接口——QueryInterface函数COM笔记-QueryInterface函数fangyukuan2010.6.1客户同组件的交互都是通过一个接口完成的。在客户查询组件的其他接口时,也是通过接口完成的。这个接口就是IUnknown。它在UNKNWN.H头文件定义:如下       Interface IUnknown       {            virtual HRESULT _

    2022年6月29日
    27
  • IT十大名言 |IT历史上被引述最多的10句名人名言

    IT十大名言 |IT历史上被引述最多的10句名人名言IT十大名言|IT历史上被引述最多的10句名人名言1)1899″Everythingthatcanbeinventedhasalreadybeeninvented.”—–CharlesH.Duell,directoroftheU.S.PatentOffice2)1943″Ithinkthereisaworldmarketformay

    2022年10月21日
    0
  • wireshark抓包新手使用教程_无root抓包使用教程

    wireshark抓包新手使用教程_无root抓包使用教程WireShark抓包使用教程–详细Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括:1、Wireshark软件下载和安装以及Wireshark主界面介绍。2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析数据包内容。3、Wireshark过滤器使用。通过过滤器可以筛选出想要分析的内容。包括按照协议过滤、端口和主机名过滤、数据包内容过滤。Wires…

    2022年9月7日
    0
  • matlab设计理想高斯巴特沃斯低通滤波器_完整二阶有源带通滤波器设计!(下载:教程+原理图+视频+代码)…[通俗易懂]

    matlab设计理想高斯巴特沃斯低通滤波器_完整二阶有源带通滤波器设计!(下载:教程+原理图+视频+代码)…[通俗易懂]1、背景对于微弱的信号的处理方式一般是:放大和滤波,这个过程中就涉及到放大电路的选取、滤波器的选择以及偏置电路的设计。本例以实例的方式讲解并附带参数计算、仿真、实物测试三个环节。假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范围的信号通过,…

    2022年6月3日
    37
  • PhpStorm 2021.5.2 最新激活码(最新序列号破解)

    PhpStorm 2021.5.2 最新激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号