zoukankan      html  css  js  c++  java
  • 肝疼了3万字的Android源码学习指南

    深入学习Android源码,知其然而知其所以然。计划整理一系列源码分析文章。

    一、准备

    • Java/C/C++基础,Java Framework和C++ Framework,一部分Lib则采用C。
    • Linux相关知识,Android是基于Linux内核。
    • Makefile知识,Android采用make编译,可以看到有很多Android.mk类似的文件。
    • Source insight,源码阅读工具神器。
    • StarUML,类图工具。
    • ProcessOn/Visio,流程图工具。

    二、入门学习

    入门学习建议可以参考如下:

    三、进阶学习

    作为一名合格的码农,肯定不仅仅限于使用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 工具篇

    5.8 其它

    六、写在最后

    由于博主水平和经历有限,肯定还有很多知识点遗漏,博主同时也整理了一份系列源码分析的笔记,如果有对Android系统源码PDF感兴趣的朋友,不妨点个赞+评论【1】。我都会回复提供下载方式的!

  • 相关阅读:
    Android 千牛数据库分析
    Flutter 你需要知道的那些事 01
    Flutter 异常处理之图片篇
    Flutter 即学即用系列博客——09 EventChannel 实现原生与 Flutter 通信(一)
    Flutter 即学即用系列博客——08 MethodChannel 实现 Flutter 与原生通信
    Flutter 即学即用系列博客——06 超实用 Widget 集锦
    Kingfisher-swift缓存图片框架
    swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,swift基数排序
    swift声明属性为某个类型同时遵循某协议
    Xcode真机运行报错iPhone has denied the launch request
  • 原文地址:https://www.cnblogs.com/Android-Alvin/p/14031670.html
Copyright © 2011-2022 走看看