自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

天涯的专栏

长兄于病视神,未有形而除之,故名不出于家。中兄治病,其在毫毛,故名不出于闾。若扁鹊者,镵血脉,投毒药,副肌肤,闲而名出闻于诸侯。...

原创 WAV 音频格式学习

WAV 是最常见的声音文件格式之一,是微软公司专门为 Windows 开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。但 WAV 文件有一个致命的缺点,就是它所占用的磁盘空间太大。它符合资源互换文件格式(RIFF)规范,用于保存 Windows 平台的音频...

2020-10-23 17:11:34 55 0

原创 Android 源码 Camera2 openCamera 流程分析

打开相机的起点从 CameraManager 类 openCamera(…) 方法开始。 打开具有给定 ID 的相机连接。 使用 getCameraIdList 获取可用相机设备的列表。请注意,即使列出了 ID,但如果在对 getCameraIdList 和 openCamera 的调用之间断开...

2020-10-20 08:48:43 63 0

原创 Android 源码 Camera2 获取 CameraId 列表

获取 CameraId 列表通过调用 CameraManager 类 getCameraIdList() 实现。 getCameraIdList() 按标识符返回当前连接的摄像头设备列表,包括其他 camera API 客户端可能正在使用的摄像头。 不可移动摄像头的标识符使用以 0 开头的整数,而...

2020-09-24 08:43:10 746 0

原创 Android 源码 QCamera2 HAL 分析

我们以 moto Nexus 6 device/moto/shamu/camera/QCamera2/ 为例进行分析。QCamera2Hal.cpp 中给 hw_module_t 结构体 camera_common 进行了赋值,然后又给 camera_module_t 结构体 HAL_MODULE...

2020-09-20 15:20:46 268 4

原创 Android 源码 Camera2 CameraService 启动

CameraService 的起点需要从 init.rc 说起。解析 init.rc 脚本是在 init.cpp 入口方法 main 中开始解析的。mediaserver 服务进程随即就会启动。 system/core/rootdir/init.rc service media /system/b...

2020-09-19 18:53:46 64 0

原创 Android 源码 Camera2 获取 CameraManager 对象

CameraManager 类是开放给 App 使用相机的入口类,它包括了获取相机 ID 列表、打开和关闭相机等操作,用于检测、表征和连接到 CameraDevice。 下面是 APP 获取 CameraManager 类的代码。CAMERA_SERVICE 定义在 Context 中,CAMER...

2020-08-30 20:18:46 90 0

原创 Android 源码 Camera2 架构初识

android.hardware.camera2 包为连接到 Android 设备的单个相机设备提供了接口。 该包将相机设备建模为管道,它接收捕获单个帧的输入请求,捕获每个请求的单个图像,然后输出一个捕获结果元数据包,以及一组用于请求的输出图像缓冲区。请求按顺序处理,可以同时处理多个请求。由于相机...

2020-08-30 20:14:29 717 0

原创 Android 源码 图形系统之 SurfaceFlinger 服务启动

SurfaceFlinger 服务起点在 init.rc 中。boot Action 中最后 class_start 命令启动了分类为 core 的所有服务,这其中就包括 surfaceflinger。 system/core/rootdir/init.rc on boot ...... ...

2020-08-18 21:00:01 841 0

原创 Android 源码 图形系统之创建 Layer

层 Layer 创建起点是 new 一个 Layer 对象,当对象第一次被引用的时候就会触发其 onFirstRef() 方法。 Layer 构造器中初始化了一大堆成员变量。 onFirstRef() 方法中看到了几个重量级选手,这里创建了 BufferQueue 和 SurfaceFlinger...

2020-08-18 20:57:23 82 0

原创 Android 源码 图形系统之 Surface 初始化

在 《Android 源码 图形系统之 relayoutWindow》 一节中,outSurface 初始化(调用其 copyFrom(…) 方法,入参是 SurfaceControl 对象)没有继续分析了。现在详细来分析一下后续流程。 copyFrom(…) 方法将另一个 Surface 复制到...

2020-08-18 20:53:51 70 0

原创 Android 8.1 【FriendlyARM】读取 BMP180 温度和压力系统服务、APP 开发

上一节完成了 BMP180 HAL 开发,现在再来继续后续内容:Bmp180Service 服务开发、APP 开发和处理 SEAndroid。 一、Bmp180Service 服务开发 先到 frameworks/base/core/java/android/os 目录下新建 bmp180 目录,...

2020-08-15 20:32:26 115 0

原创 Android 8.1 【FriendlyARM】读取 BMP180 温度和压力 HAL 开发

接上一节我们已经将 BMP180 驱动开发完成,现在继续完成 HAL 开发,Android 8 版本新增的 HAL 一般采用 binder 的方式,使用 HIDL 语言进行开发。实际开发除了代码完成,绕不开 SEAndroid。下面分几个步骤介绍。 HAL 开发 HAL 验证 Bmp180Ser...

2020-08-15 17:28:22 86 0

原创 Android 源码 图形系统之 relayoutWindow

在 《Android 源码 图形系统之请求布局》 一节,分析到 ViewRootImpl 类 performTraversals() 方法内调用 relayoutWindow(…) 方法重新布局窗口时没有继续进一步深入,现在从 relayoutWindow(…) 开始来梳理后续流程。 ViewRo...

2020-08-13 19:41:24 141 0

原创 Android 源码 图形系统之 WindowState attach

在 《Android 源码 图形系统之窗口添加》 一节中提到 WindowManagerService 类 addWindow 方法首先创建了 WindowState 对象,然后调用了其 attach() 方法进行附着,现在继续分析其后续流程。 WindowState 类 attach() 方法...

2020-08-06 21:42:49 69 0

原创 Android 源码 图形系统之硬件渲染器同步和绘制帧

在《Android 源码 图形系统之硬件渲染器绘制》一节中没有分析 nSyncAndDrawFrame(…) 同步和绘制帧,这一节继续分析。 frameworks/base/core/java/android/view/ThreadedRenderer.java public class Thre...

2020-07-19 16:47:47 803 0

原创 Android 8.1 【FriendlyARM】温度压力传感器-BMP180 驱动开发

驱动开发主要位于 Linux 内核层,首先认识一下 BMP180,接着需要修改 DTS,最后才开始编写驱动,编写完驱动我们再来写一个用户层验证程序来获取温度和压力。 一、BMP180 芯片介绍 BMP180 是一款高精度、小体积、超低能的压力传感器,适用于移动电话、PDAs、GPS 导航设备和户外...

2020-07-19 15:58:13 165 0

原创 Android 源码 图形系统之硬件渲染器绘制
原力计划

硬件渲染器绘制从调用 HardwareRenderer 类 draw 方法实现 View 绘制开始。 frameworks/base/core/java/android/view/ViewRootImpl.java public final class ViewRootImpl implement...

2020-07-11 15:17:21 113 0

原创 Android 源码 图形系统之硬件渲染器初始化
原力计划

硬件渲染器初始化从 ViewRootImpl 类 setView(…) 方法中调用 enableHardwareAcceleration(…) 开始。 HardwareRenderer 是一个抽象类,代表使用硬件加速渲染视图层次结构的接口。 首先找到 mHardwareRenderer 赋值的位置...

2020-07-11 15:14:41 97 0

原创 Android 源码部署到服务器(Git+GitLab+Repo)
原力计划

Android 源码部署到服务器端,一共分为七个部分。 软件环境 GitLab 服务端部署 Repo Manifest.xml 生成 GitLab 建仓 Git Push 源码到服务器 Repo 同步源码 提交修改后的代码 一、软件环境 服务器端系统:Ubuntu 16.04 GitLab 软...

2020-07-08 17:50:28 438 4

原创 Android 8.1 【FriendlyARM】编译环境搭建与镜像烧写
原力计划

NanoPC-T4 不仅是世界上最小的全功能接口 RK3399 一体化主板, 而且是一款完全开源的高性能计算平台。它的尺寸只有 100x64mm,标配4GB LPDDR3 内存和 16GB 闪存, 板载2.4G & 5G 双频 WiFi 模组, 带有标准完整的 M.2 PCIe 接口, 可...

2020-07-05 20:26:14 483 0

原创 Android 源码 图形系统之请求布局
原力计划

在《Android 源码 图形系统之窗口添加》一节中遗留了 ViewRootImpl 类 setView 方法中调用 requestLayout() 函数分析。现在继续分析其流程。分析之前先来观摩一下整体流程。 requestLayout() 方法主要调用了 scheduleTraversals...

2020-07-05 09:55:18 134 0

原创 Android 源码 图形系统之窗口添加
原力计划

《Android 源码 输入系统之窗口关联》 一节着重考虑了窗口怎样和输入系统关联,而这一节的重点在于窗口如何添加到图形系统。 先来看一个整体概览,再来详细分析。 先从 setContentView 说起。此函数的作用是:从布局资源设置 Activity 内容。资源将被解析,将所有顶级视图添加到...

2020-06-26 19:06:15 104 0

原创 Android 源码 图形系统概述
原力计划

Android 框架提供了各种用于 2D 和 3D 图形渲染的 API,可与制造商的图形驱动程序实现方法交互。应用开发者可通过三种方式将图像绘制到屏幕上:使用 Canvas、OpenGL ES 或 Vulkan。 一、Android 图形组件 无论开发者使用什么渲染 API,一切内容都会渲染到“S...

2020-06-26 19:04:48 158 0

原创 Android 源码 installd 启动流程分析
原力计划

installd 进程具有 CAP_DAC_OVERRIDE 特权(Privilege)。对于具有 CAP_DAC_OVERRIDE 特权的进程,Linux 会跳过文件的读、写和执行权限的检查。所以,installd 可以访问任何目录下的文件。system 用户则会受限。 而 PackageMan...

2020-06-09 19:41:46 140 0

原创 Android 源码 PackageManagerService 启动流程分析
原力计划

《Android 源码 installPackage 流程分析》一节着重分析了 apk 安装流程,接下来我们分析 PackageManagerService 启动时都做了些什么? 执行 PackageManagerService main 静态方法; 调用 PackageManagerServi...

2020-06-08 17:45:04 151 0

原创 Android 源码 installPackage 流程分析
原力计划

installPackage 安装流程最终会调用 PackageManagerService 对应方法,当然是使用 binder 机制得以实现跨进程通信。 先来看看 installPackage 流程具体和各种进程如何关联调用,有个整体印象以后我们再来分析其流程。 起点是 Application...

2020-06-05 21:47:29 890 0

原创 Android 源码 关机流程分析
原力计划

Power 键长按 3s 可触发设备关机流程,关机我们能想到的有首先结束当前正在运行的界面,接着关闭显示屏,然后各种设备下电,最后设备彻底关闭。 在《Android 源码 输入系统之 InputReader》一节中,调用 InputDispatcher 类 notifyKey 方法,其中调用了 I...

2020-06-02 22:05:21 118 0

原创 Android 源码 输入系统之事件窗口分发
原力计划

handleReceiveCallback 方法对消息进行处理。 上一节打通了 InputDispatcher 和输入窗口之间双向的通道,这是通过 InputChannel 承载的。现在可以继续分析从 InputDispatcher 发送出的事件如何被接收处理了。 NativeInputEvent...

2020-06-02 21:36:34 113 0

原创 Android 源码 输入系统之 InputChannel 通信通道建立
原力计划

上一节完成了焦点窗口关联,现在可以分析如何将输入事件继续从 InputDispatcher 继续分发。InputChannel 的 sendMessage 将消息发送出去。实际是调用 socket 的 send 接口来发送消息的。具体一点其实使用的是 socketpair。所以我们先来学习 Lin...

2020-06-01 21:22:35 123 0

原创 Android 源码 输入系统之窗口关联
原力计划

在前一节中,InputDispatcher 的事件派发工作调用 InputChannel sendMessage 方法标志着 InputDispatcher 一个周期的工作结束。但意味着事件找到对应的窗口处理的开始。 上一节中 mFocusedWindowHandle 是 InputDispatc...

2020-06-01 21:20:15 103 0

原创 Android 源码 输入系统之 InputDispatcher
原力计划

InputDispatcherThread 线程负责派发事件。InputDispatcherThread 启动后会执行 threadLoop 函数。threadLoop 函数返回 true,InputDispatcherThread 就会循环执行 threadLoop 函数。具体可以参见关于 Na...

2020-06-01 21:18:23 104 0

原创 Android 源码 输入系统之 InputReader
原力计划

InputReaderThread 线程负责读取事件。InputReaderThread 启动后会执行 threadLoop 函数。threadLoop 函数返回 true,InputReaderThread 就会循环执行 threadLoop 函数。具体可以参见关于 Native Thread ...

2020-05-31 15:18:34 162 0

原创 Android 源码 InputManagerService 启动

上一节分析了 InputManagerService 初始化,这一节重点关注启动以后都做了一些什么? frameworks/base/services/java/com/android/server/SystemServer.java public final class SystemServer...

2020-05-30 15:42:13 125 0

原创 Android 源码 InputManagerService 初始化
原力计划

InputManagerService 是在 SystemServer 中启动的。它包装了 C++ InputManager 并提供其回调。它分为 Java 层和 Native 层两部分。Java 层负责与 WindowManagerService 的通信。而 Native 层则是 InputRe...

2020-05-30 15:40:38 127 0

原创 Android 源码 输入系统初识

触摸屏与键盘是 Android 最普遍也是最标准的输入设备。当输入设备可用时,Linux 内核会在 /dev/input/ 下创建对应的名为 event0 ~ eventN 或其他名称的设备节点。而当输入设备不可用时,则会将对应的节点删除。 当用户操作输入设备时,Linux 内核接收到相应的硬件...

2020-05-30 11:19:28 72 0

原创 Android 源码开放语言设置给第三方 APP 实践
原力计划

常规 App 开发,Android SDK 下载都是通过 Google 官方渠道获得的。对于定制过的 Android 系统,我们一般手里都有源码,会在 Framework 定制一些需求,这需要我们导出 API 给 App 使用。 一、编译 win-sdk 编译 win-sdk,只能使用 Linux...

2020-05-18 18:35:02 159 0

原创 Android 源码 Native Thread 分析
原力计划

Native Thread 是架设在 Pthread 基础上为了方便 Native 开发使用的。关于 Pthread 的基础学习请移步《Linux Pthread 常用函数学习与使用》。 下面是 Native Thread 的头文件,注释非常详细了。 /system/core/include/ut...

2020-05-15 21:04:36 125 0

原创 Linux Pthread 常用函数学习与使用
原力计划

POSIX.1 指定了一组接口(函数、头文件),用于线程编程,通常称为 POSIX 线程或 Pthread。一个进程可以包含多个线程,所有线程都执行相同的程序。这些线程共享相同的全局内存(数据段和堆段),但是每个线程都有自己的栈(自动变量)。 POSIX.1 还要求线程共享一系列其他属性(即,这些...

2020-05-14 19:51:02 133 0

原创 libmatroska 与 libebml 在 Android 平台上使用
原力计划

上一节《libmatroska 与 libebml 移植到 Android 支持 mkv 格式解析与创建》成功编译了 Android 平台可用的 libmatroska.so 和 libebml.so。具体如何使用它们还没开始,这一节以创建 mkv 格式为例对它们进行使用。当然还要排坑!这花费了我...

2020-05-11 18:05:58 152 0

原创 libmatroska 与 libebml 移植到 Android 支持 mkv 格式解析与创建
原力计划

Matroska 多媒体容器(Multimedia Container)是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以其不是一种压缩格式,而是 Matroska 定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的...

2020-05-11 18:00:57 127 0

提示
确定要删除当前文章?
取消 删除