Android之系统源码学习与下载
[TOC]
概述阅读Android源码的好处有很多,可以加深我们对系统的了解,可以参考牛人优雅的代码实现,可以从根本上找出一些bug的原因…我们应该庆幸Android是开源的,所有的功能都可以看到实现,所有的bug都能追踪溯源。
我想大家或多或少听说过Android源码开源项目,即AOSP(Android Open Source Project) ,有些人可能还不知道如何下载AOSP,有些人虽然下载下来了,但是面对庞大的Android源码项目又望而却步,不知道从哪儿下手。
学习Android系统源码方式有两种:
1、在线学习
可以访问http://androidxref.com来阅读系统源码;
Android在线阅读源码的网站有很多.
比如 http://www.grepcode.com 、http://androidxref.com、https://www.androidos.net.cn 等,
这里推荐使用http://androidxref.com 进行在线阅读,这个网址提供了Android1.6到Android 8.0.0的源码,
需要掌握系统源码目录,最好是将源码下载下来,所 ...
Android之系统源码编译教程
[TOC]
概述源码编译中m、mm、mmm、mma、mmma的区别文章参考:https://blog.csdn.net/alley98/article/details/53559486
编译类型m:编译整个安卓系统makes from the top of the tree
mm:编译当前目录下的模块当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Android.mk文件。
builds all of the moudles in the current directory
mma:当前目录新增或删除文件后,可以用mma重新编译。mmm:编译指定路径下的模块指定的路径下面需要有Android.mk这个makefile文件
builds all of the moudles in the supplies directory
mmm命令 的编译过程:build/core/main.mk(是Android编译系统的入口文件)
build/core/config.mk(会定好编译类型和目标文件)
->build ...
Android系统之Zygote进程启动流程解析
[TOC]
文章参考:http://kmanong.top/kmn/qxw/form/article?id=18053&cate=45
概述我们都知道Android中非特殊进程(除init进程和Zygote进程外的进程,源码中称其为unspecialized app process),都是由Zygotefork出来的子进程,包括SystemServer,也是由Zygote fork出来的。
那么Zygote进程到底是个什么东西?
在Android系统中,DVM(Dalvik虚拟机)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。它通过fock(复制进程)的形式来创建应用程序进程和SystemServer进程,由于Zygote进程在启动时会创建DVM,因此通过fock而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM的实例拷贝。
这篇文章我们主要来探讨以下几个问题:
Zygote进程是如何启动的?
Zygote又是如何fork出SystemServer的?
其他普通进程又是通过什么方 ...
SystemServer启动流程分析
概述SystemServer进程主要用于创建系统服务,我们熟悉的AMS、WMS、PMS都是由SystemServer创建的。关于这些系统服务我们后来再讲。本文我们先来熟悉并了解SystemServer进程是如何启动的,他在启动时做了哪些重要的工作。
源码分析Zygote启动SyetemServer进程在上一篇文章中我们讲到在ZygoteInit.java的startSystemServer函数中启动了SyetemServer进程,如下所示。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281 ...
SystemServer进程的启动流程解析
[TOC]
文章从参考:https://jsonchao.github.io/2019/03/03/Android%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E6%B5%81%E4%B9%8BSystemServer%E8%BF%9B%E7%A8%8B%E5%90%AF%E5%8A%A8/
概述其中Zygote进程由init进程启动,SystemServer进程和应用进程由Zygote进程启动。
SystemServer进程主要是用于创建系统服务的,例如AMS、WMS、PMS。这篇文章将从以下两个部分来对SystemServer进行分析:
Zygote处理SystemServer进程
SystemServer进程解析
SystemServer启动流程SystemServer进程主要用于创建系统服务,我们熟悉的AMS、WMS、PMS都是由SystemServer创建的。关于这些系统服务我们后来再讲。本文我们先来熟悉并了解SystemServer进程是如何启动的,他在启动时做了哪些重要的工作。
1234567891011121314151617181920 ...
Android之Activity启动流程学习(基于Android10)
文章参考:https://www.jianshu.com/p/b78a38c857e8
概述Activity启动流程中设计到的重点类:
1234567891011121314151617181920212223242526Instrumentation.java // 负责调用Activity和Application生命周期。ActivityTaskManagerService.java// 负责Activity管理和调度等工作。android10中新增的ActivityManagerService.java//负责管理四大组件和进程,包括生命周期和状态切换。ActivityTaskManagerInternal.java//ActivityTaskManagerService对外提供的一个抽象类,真正的实现在ActivityTaskManagerService#LocalServiceActivityThread.java//Activity线程:管理应用程序进程中主线程的执行.ActivityStackSupervisor.jaba//Activity栈管理者:负责所有Activi ...
Android之Surface的显示系统学习
[TOC]
文章转自:https://source.android.google.cn/devices/graphics
文章转自:https://juejin.cn/post/6944960866404007944
概述Surface可以简单的理解成一块画布,在Android的Activity中,UI的显示就是通过把图形绘制在Surface对象上完成的。每个Surface对象在SurfaceFlinger中都有对应的图像层(Layer),SurfaceFlinger会把所有图像层混合在一起并输出到Framebuffer中,这样在屏幕上就看到最后合成的图像。
应用开发中很少直接使用Surface,因为每个Activity中已经创建好了各自的Surface对象,通常只有一些特殊的应用才需要在Activity之外再去创建Surface,例如照相机应用、视频播放应用。通常这些应用也是通过创建SurfaceView来使用Surface。在应用中不能直接去创建一个可用的Surface对象,或者说直接创建出来的Surface对象也没有实际的用途,因为这样创建出的Surface对象和SurfaceF ...
Android系统的Choreographer的原理
[TOC]
文章参考:https://www.androidperformance.com/2019/10/22/Android-Choreographer/
一.概述前面两篇文章介绍了SurfaceFlinger原理,讲述了SurfaceFlinger的启动过程,绘制过程,以及Vsync处理过程。 本文再介绍一下Choreographer的启动与Vsync处理过程。
要学习Choreographer的的原理,我们先来看一段日志。
12I/Choreographer: Skipped 85 frames! The application may be doing too much work on its main thread.I/Choreographer: Skipped 56 frames! The application may be doing too much work on its main thread.
这个日志,我想我们已经很熟悉了。我们如果应用比较卡顿掉帧的时候,控制台就会有这样的日志打印。
123private static final int SKIPP ...
Android之input输入系统之ImputManagerService启动
概述当用户触摸屏幕或者按键操作,首次触发的是硬件驱动,驱动收到事件后,将该相应事件写入到输入设备节点, 这便产生了最原生态的内核事件。接着,输入系统取出原生态的事件,经过层层封装后成为KeyEvent或者MotionEvent ;最后,交付给相应的目标窗口(Window)来消费该输入事件。可见,输入系统在整个过程起到承上启下的衔接作用。
Input模块的主要组成:
Native层的InputReader负责从EventHub取出事件并处理,再交给InputDispatcher;
Native层的InputDispatcher接收来自InputReader的输入事件,并记录WMS的窗口信息,用于派发事件到合适的窗口;
Java层的InputManagerService跟WMS交互,WMS记录所有窗口信息,并同步更新到IMS,为InputDispatcher正确派发事件到ViewRootImpl提供保障;
InputManagerService启动在SystemServer的main方法里面会调用startOtherServices。startOtherServices里面会启动Inp ...
InputManagerService的InputReader机制
文章参考:http://gityuan.com/2016/12/11/input-reader/
概述介绍IMS服务的启动过程会创建两个native线程,分别是InputReader,InputDispatcher. 接下来从InputReader线程的执行过程从threadLoop为起点开始分析。
InputManager::start123456789101112131415161718status_t InputManager::start() { // 启动InputDispatcher的事件分发 status_t result = mDispatcher->start(); if (result) { ALOGE("Could not start InputDispatcher thread due to error %d.", result); return result; } // 启动InputReader result = mReader->s ...