![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android源码
文章平均质量分 93
TYYJ-洪伟
努力成为一名匠人。
展开
-
【Android 10 源码】Camera v1 startPreview 流程
Camera v1 startPreview 起点位于 android.hardware 包下的 Camera 类中,这是老版本的 Camera 预览的起点。有助于理解后续 Camera v2 API 所做的努力。原创 2022-07-28 07:52:49 · 1150 阅读 · 0 评论 -
【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 开始录制
前面已经分析过 MediaRecorder 初始化和配置过程,接下来就可以真正进入录制流程了。现在不难得出这个结论:MediaRecorder 录制 Camera 的数据实际上是将预览数据经过 MediaCodec 硬编码后封装成对应的容器。具体到现在谈的场景实际上将渲染数据直接绘制到硬编码器 Surface 上然后去编码,编码后的数据是 H264,将 MIC 音频硬编码为 AAC,然后将它们封装成 MP4。开始捕获数据并将数据编码到使用 setOutputFile() 指定的文件中。在 prepare原创 2022-05-08 12:16:44 · 1845 阅读 · 0 评论 -
【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 配置
MediaRecorder 录像配置主要涉及输出文件路径、音频来源、视频来源、输出格式、音频编码格式、视频编码格式、比特率、帧率和视频尺寸等。我们假设视频输入源来自 Camera,Camera2 API 将相机图像渲染到 MediaRecorder 提供的 Surface 上,而 MediaRecorder 将这个渲染数据编码为 H264。 /** * 配置录制视频相关数据 */ private void configMediaRecorder(){ F原创 2022-05-08 06:54:53 · 1806 阅读 · 2 评论 -
【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 初始化
MediaRecorder 用于录制音频和视频,录制控制基于一个简单的状态机。下面是典型的使用 camera2 API 录制,需要使用到的 MediaRecorder API。 /** * 初始化MediaRecorder */ private void initMediaRecorder(){ mMediaRecorder = new MediaRecorder(); } /** * 配置录制视频相关数据 */原创 2022-05-07 07:41:14 · 1762 阅读 · 0 评论 -
【Android 10 源码】healthd 模块 BatteryService 初始化
BatteryService 是在 SystemServer 中启动的,BatteryService 监控设备电池的充电状态和充电水平。当这些值改变时,这个服务会将这些新值广播给所有正在监听 ACTION_BATTERY_CHANGED 的广播接收者。BatteryService 被划分到核心服务类别。frameworks/base/services/java/com/android/server/SystemServer.javapublic final class SystemServer {原创 2022-03-16 07:41:32 · 1478 阅读 · 0 评论 -
【Android 10 源码】healthd 模块 HAL 2.0 分析
Android 9 引入了从 health@1.0 HAL 升级的主要版本 android.hardware.health HAL 2.0。原创 2022-03-14 08:21:40 · 7022 阅读 · 0 评论 -
【Android 10 源码】healthd 模块 HAL 1.0 分析
health@1.0:android.hardware.health@1.0 的缩写。指的是 Android 8.0 中发布的运行状况 HIDL 的 1.0 版 HAL。Android 8.x 中的“运行状况”服务在 Android 8.x 中,运行状况组件的工作原理详情如下图所示:在此图中:框架通过一次 Binder 调用和一次 hwbinder 调用与硬件进行通信。healthd 静态关联到 libhealthd_android、libbatterymonitor 和 libbattery原创 2022-03-14 08:16:45 · 1762 阅读 · 0 评论 -
【Android 10 源码】深入理解 MediaCodec configure
使用 MediaCodec 的关键一步是 configure,在 start 之前配置是必须的。以解码为例,并且直接解码到外部提供的 surface 上,所以输入的 surface 不为空。configure(…) 提供给外部调用的 public 方法内部调用了同名重载版本的方法。遍历从 MediaFormat 返回的 map,构造为 key 和 value 数组;调用 native_configure(…) 交给 native 层处理。frameworks/base/media/java/a原创 2021-10-29 19:42:36 · 6080 阅读 · 8 评论 -
【Android 10 源码】深入理解 MediaCodec 组件分配
MediaCodec 系列文章:【Android 10 源码】深入理解 MediaCodec 硬解码初始化【Android 10 源码】深入理解 Omx 初始化【Android 10 源码】深入理解 codecservice 启动【Android 10 源码】深入理解 software Codec2 服务启动【Android 10 源码】深入理解构建 MediaCodec 列表:buildMediaCodecList组件分配的起点位于 native MediaCodec 的 init 流程。原创 2021-10-29 19:36:02 · 2990 阅读 · 0 评论 -
【Android 10 源码】深入理解构建 MediaCodec 列表:buildMediaCodecList
构建 MediaCodec 列表——buildMediaCodecList(…) ,确切地说是构建了 std::vector<sp > 容器,容器内部是指向 MediaCodecInfo 对象的指针。关于 buildMediaCodecList(…) 在 MediaCodec 中初始化流程可以参考前一节《【Android 10 源码】深入理解 MediaCodec 硬解码初始化》。在 MediaCodecList 构造函数中,根据分析得出 builder 调用其 buildMediaCode原创 2021-10-24 20:03:50 · 6096 阅读 · 0 评论 -
【Android 10 源码】深入理解 software Codec2 服务启动
经过前面几节分析不难得出想要支持 Codec2 框架,需要实现其要求的 hal 接口,并实现相应的支撑服务。这里以源码中实现 software Codec2 服务启动为例进行分析。software Codec2 服务启动位于 CodecServiceRegistrant.cpp 中。在 rk3399 Android 10 平台上可以看到启动 Log:CodecServiceRegistrant: Creating software Codec2 service…CodecServiceRegistra原创 2021-10-24 16:16:57 · 2742 阅读 · 0 评论 -
【Android 10 源码】深入理解 codecservice 启动
MediaCodec 系列文章:【Android 10 源码】深入理解 MediaCodec 硬解码初始化【Android 10 源码】深入理解 Omx 初始化codecservice 主要负责 HAL 层给 framework 层提供调用音视频编解码接口。它的入口是 main_codecservice.cpp。首先我们来看下启动它的配置 rc 脚本。可以看到它放在 vendor 目录下,说明和供应商有关。frameworks/av/services/mediacodec/android.ha原创 2021-10-24 16:09:52 · 4780 阅读 · 0 评论 -
【Android 10 源码】深入理解 Omx 初始化
Omx 初始化分为四步,其中最为重要的一点在 Omx 初始化过程中会加载 libstagefrighthw.so。这个库是由供应商来实现的,实现多媒体编解码芯片级支持。Omx 初始化主要从其构造函数开始分析。创建 OMXMaster 对象,并初始化 mMaster 变量;初始化 MediaCodecsXmlParser 对象;调用 parseXmlFilesInSearchDirs() 方法从一组搜索目录解析顶级 XML 文件;调用 parseXmlPath(…) 方法解析顶级 XML 文件。原创 2021-10-22 20:20:46 · 3059 阅读 · 0 评论 -
【Android 10 源码】深入理解 MediaCodec 硬解码初始化
Android 中调用硬解码 API 是使用 MediaCodec 一步一步调用硬件实现的,通常需要最终调用 VPU 进行解码工作,现在先来分析其初始化过程。下面是一段典型的硬解码初始化代码,当然在异常处理上也做了处理,是为了更好的容错。根据 MIME_TYPE(video/avc) 创建解码器,调用 createDecoderByType 实现;根据视频长宽以及 MIME_TYPE 创建 MediaFormat 配置(设置解码颜色空间、Profile Baseline 和 Profile Lev原创 2021-10-21 19:54:21 · 9671 阅读 · 0 评论 -
【Android 10 Framework 定制】 app 升级后自启动
Android 高版本已经废弃了 installPackage 这套静默安装接口,取而代之的是 PackageInstaller,所以在 Android 10 实现静默安装需要使用 PackageInstaller,但需要注意的是必须采用系统签名。如果强行在 Framework 修改代码会发现 Framework 无法读取 sdcard(内置存储也属于 sdcard 路径) 路径上的安装包,这个限制是因为 sdcard 属于易插拔的外部设备,如果说我们系统 app 可以访问 sdcard,并且一直持有 sd原创 2021-09-21 21:33:09 · 1190 阅读 · 0 评论 -
Android 源码 Camera2 预览流程分析四
《Android 源码 Camera2 预览流程分析二》中进行了流启动,这是调用 QCamera3Channel start() 方法实现的,对应于 HAL_PIXEL_FORMAT_YCbCr_420_888 格式创建的 QCamera3Channel 实现类指向了 QCamera3RegularChannel。device/moto/shamu/camera/QCamera2/HAL3/QCamera3Channel.cppint32_t QCamera3RegularChannel::start原创 2020-12-10 07:55:45 · 1013 阅读 · 0 评论 -
Android 源码 Camera2 预览流程分析三
接着《Android 源码 Camera2 预览流程分析二》,先来分析 QCamera3Channel 初始化,通过《Android 源码 Camera2 HAL3 流配置》一节可以知道实际上 对应于 HAL_PIXEL_FORMAT_YCbCr_420_888 格式创建的 QCamera3Channel 实现类指向了 QCamera3RegularChannel。调用 init(…) 初始化;确定流格式;调用 addStream(…) 添加流。device/moto/shamu/camera原创 2020-12-08 19:38:51 · 2628 阅读 · 0 评论 -
Android 源码 Camera2 HAL3 流配置
HAL 流配置的起点位于 Camera3Device 类 configureStreamsLocked() 方法中,首先调用 configure_streams(…) 进行配置。frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cppstatus_t Camera3Device::configureStreamsLocked() { ...... // 做 HAL 配置 ATRACE_BEG原创 2020-12-01 20:02:47 · 3418 阅读 · 2 评论 -
Android 源码 Camera2 预览流程分析二
RequestThread 是在 Camera open 流程中启动的。RequestThread 是用于管理向 HAL 设备提交捕获请求的线程。frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cppstatus_t Camera3Device::initialize(CameraModule *module){ ...... /** Start up request queue thread *原创 2020-11-30 19:29:57 · 2822 阅读 · 0 评论 -
Android 源码 Camera2 预览流程分析一
先上一段典型的预览代码,梳理一下相机预览流程。从 TextureView 获取到 SurfaceTexture将 SurfaceTexture 默认缓冲区的大小配置为相机预览的大小新建一个 Surface 作为预览输出CaptureRequest.Builder 设置 Surface创建 CameraCaptureSession 用于相机预览创建成功 CameraCaptureSession 后给 CaptureRequest.Builder 设置自动对焦,必要时开启闪光灯现在可以开始显示相原创 2020-11-26 14:31:16 · 1958 阅读 · 0 评论 -
Android 源码 Camera2 openCamera 流程分析
打开相机的起点从 CameraManager 类 openCamera(…) 方法开始。打开具有给定 ID 的相机连接。使用 getCameraIdList 获取可用相机设备的列表。请注意,即使列出了 ID,但如果在对 getCameraIdList 和 openCamera 的调用之间断开了设备的连接,或者如果优先级更高的相机 API 客户端开始使用相机设备,则打开可能会失败。从 API 级别 23 开始,由于优先级较低的后台相机 API 客户端正在使用该设备,因此已调用 Availability原创 2020-10-20 08:48:43 · 2004 阅读 · 0 评论 -
Android 源码 Camera2 获取 CameraId 列表
获取 CameraId 列表通过调用 CameraManager 类 getCameraIdList() 实现。getCameraIdList() 按标识符返回当前连接的摄像头设备列表,包括其他 camera API 客户端可能正在使用的摄像头。不可移动摄像头的标识符使用以 0 开头的整数,而可移动摄像头即使是同一型号,也为每个设备都分配唯一的标识符。frameworks/base/core/java/android/hardware/camera2/CameraManager.javapubli原创 2020-09-24 08:43:10 · 47119 阅读 · 10 评论 -
Android 源码 QCamera2 HAL 分析
我们以 moto Nexus 6 device/moto/shamu/camera/QCamera2/ 为例进行分析。QCamera2Hal.cpp 中给 hw_module_t 结构体 camera_common 进行了赋值,然后又给 camera_module_t 结构体 HAL_MODULE_INFO_SYM 赋值,HAL_MODULE_INFO_SYM 名字是固定的,这样 hw_get_module(…) 函数才能正常工作。device/moto/shamu/camera/QCamera2/QCa原创 2020-09-20 15:20:46 · 1209 阅读 · 4 评论 -
Android 源码 Camera2 CameraService 启动
CameraService 的起点需要从 init.rc 说起。解析 init.rc 脚本是在 init.cpp 入口方法 main 中开始解析的。mediaserver 服务进程随即就会启动。system/core/rootdir/init.rcservice media /system/bin/mediaserver class main user media group audio camera inet net_bt net_bt_admin net_bw_acct dr原创 2020-09-19 18:53:46 · 1484 阅读 · 1 评论 -
Android 源码 Camera2 获取 CameraManager 对象
CameraManager 类是开放给 App 使用相机的入口类,它包括了获取相机 ID 列表、打开和关闭相机等操作,用于检测、表征和连接到 CameraDevice。下面是 APP 获取 CameraManager 类的代码。CAMERA_SERVICE 定义在 Context 中,CAMERA_SERVICE = “camera”。val manager = activity.getSystemService(Context.CAMERA_SERVICE) as CameraManager由于传原创 2020-08-30 20:18:46 · 1389 阅读 · 0 评论 -
Android 源码 Camera2 架构初识
android.hardware.camera2 包为连接到 Android 设备的单个相机设备提供了接口。该包将相机设备建模为管道,它接收捕获单个帧的输入请求,捕获每个请求的单个图像,然后输出一个捕获结果元数据包,以及一组用于请求的输出图像缓冲区。请求按顺序处理,可以同时处理多个请求。由于相机设备是一个多阶段的管道,所以在大多数 Android 设备上,要保持完整的帧率需要有多个请求在运行。要枚举、查询和打开可用的相机设备,需要获取 CameraManager 实例。各个 CameraDevices原创 2020-08-30 20:14:29 · 2827 阅读 · 0 评论 -
Android 源码 图形系统之 SurfaceFlinger 服务启动
SurfaceFlinger 服务起点在 init.rc 中。boot Action 中最后 class_start 命令启动了分类为 core 的所有服务,这其中就包括 surfaceflinger。system/core/rootdir/init.rcon boot ...... class_start core......service surfaceflinger /system/bin/surfaceflinger class core user syste原创 2020-08-18 21:00:01 · 1438 阅读 · 0 评论 -
Android 源码 图形系统之创建 Layer
层 Layer 创建起点是 new 一个 Layer 对象,当对象第一次被引用的时候就会触发其 onFirstRef() 方法。Layer 构造器中初始化了一大堆成员变量。onFirstRef() 方法中看到了几个重量级选手,这里创建了 BufferQueue 和 SurfaceFlingerConsumer。Layer 类首次引用图层时,将创建新的 BufferQueue 和新的 SurfaceFlingerConsumer。它还实现了 onFrameAvailable(),该函数通知 Surfac原创 2020-08-18 20:57:23 · 1075 阅读 · 0 评论 -
Android 源码 图形系统之 Surface 初始化
在 《Android 源码 图形系统之 relayoutWindow》 一节中,outSurface 初始化(调用其 copyFrom(…) 方法,入参是 SurfaceControl 对象)没有继续分析了。现在详细来分析一下后续流程。copyFrom(…) 方法将另一个 Surface 复制到此 Surface。现在,此 Surface 拥有对与原始 Surface 相同数据的引用,并且不是所有者。这是供窗口管理器从客户端返回窗口 Surface 时使用的,将其从窗口管理器管理的表示形式转换为客户端用来原创 2020-08-18 20:53:51 · 824 阅读 · 0 评论 -
Android 源码 图形系统之 relayoutWindow
在 《Android 源码 图形系统之请求布局》 一节,分析到 ViewRootImpl 类 performTraversals() 方法内调用 relayoutWindow(…) 方法重新布局窗口时没有继续进一步深入,现在从 relayoutWindow(…) 开始来梳理后续流程。ViewRootImpl 类 relayoutWindow(…) 方法内部最终调用了 Session 类 relayout(…) 方法。mWindowSession 指向相应的代理对象 IWindowSession.Stub.原创 2020-08-13 19:41:24 · 3384 阅读 · 0 评论 -
Android 源码 图形系统之 WindowState attach
在 《Android 源码 图形系统之窗口添加》 一节中提到 WindowManagerService 类addWindow 方法首先创建了 WindowState 对象,然后调用了其 attach() 方法进行附着,现在继续分析其后续流程。WindowState 类 attach() 方法中仅仅调用了 Session 类的 windowAddedLocked() 方法。frameworks/base/services/core/java/com/android/server/wm/WindowSt原创 2020-08-06 21:42:49 · 705 阅读 · 0 评论 -
Android 源码 图形系统之硬件渲染器同步和绘制帧
在《Android 源码 图形系统之硬件渲染器绘制》一节中没有分析 nSyncAndDrawFrame(…) 同步和绘制帧,这一节继续分析。frameworks/base/core/java/android/view/ThreadedRenderer.javapublic class ThreadedRenderer extends HardwareRenderer { ...... @Override void draw(View view, AttachInfo attach原创 2020-07-19 16:47:47 · 3177 阅读 · 0 评论 -
Android 源码 图形系统之硬件渲染器绘制
硬件渲染器绘制从调用 HardwareRenderer 类 draw 方法实现 View 绘制开始。frameworks/base/core/java/android/view/ViewRootImpl.javapublic final class ViewRootImpl implements ViewParent, View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks { ...... pr原创 2020-07-11 15:17:21 · 1084 阅读 · 0 评论 -
Android 源码 图形系统之硬件渲染器初始化
硬件渲染器初始化从 ViewRootImpl 类 setView(…) 方法中调用 enableHardwareAcceleration(…) 开始。HardwareRenderer 是一个抽象类,代表使用硬件加速渲染视图层次结构的接口。首先找到 mHardwareRenderer 赋值的位置,我们才能确认它具体是什么子类。这在 ViewRootImpl 类 setView 方法中调用 enableHardwareAcceleration(…) 方法启用硬件加速开始。frameworks/base/c原创 2020-07-11 15:14:41 · 1029 阅读 · 0 评论 -
Android 源码部署到服务器(Git+GitLab+Repo)
Android 源码部署到服务器端,一共分为七个部分。软件环境GitLab 服务端部署Repo Manifest.xml 生成GitLab 建仓Git Push 源码到服务器Repo 同步源码提交修改后的代码一、软件环境服务器端系统:Ubuntu 16.04GitLab 软件:GitLab Community Edition客户端系统:Ubuntu 14.04Git 软件:Git 2.27.0二、GitLab 服务端部署必要组件安装sudo apt-get update原创 2020-07-08 17:50:28 · 5023 阅读 · 20 评论 -
Android 源码 图形系统之请求布局
在《Android 源码 图形系统之窗口添加》一节中遗留了 ViewRootImpl 类 setView 方法中调用 requestLayout() 函数分析。现在继续分析其流程。分析之前先来观摩一下整体流程。requestLayout() 方法主要调用了 scheduleTraversals() 进一步处理。frameworks/base/core/java/android/view/ViewRootImpl.javapublic final class ViewRootImpl implemen原创 2020-07-05 09:55:18 · 722 阅读 · 0 评论 -
Android 源码 图形系统之窗口添加
《Android 源码 输入系统之窗口关联》 一节着重考虑了窗口怎样和输入系统关联,而这一节的重点在于窗口如何添加到图形系统。先来看一个整体概览,再来详细分析。先从 setContentView 说起。此函数的作用是:从布局资源设置 Activity 内容。资源将被解析,将所有顶级视图添加到 Activity 中。首先调用 getWindow() 获取 Window 对象(实际为 PhoneWindow 对象),然后调用其 setContentView(…) 方法。frameworks/base/c原创 2020-06-26 19:06:15 · 644 阅读 · 0 评论 -
Android 源码 图形系统概述
Android 框架提供了各种用于 2D 和 3D 图形渲染的 API,可与制造商的图形驱动程序实现方法交互。应用开发者可通过三种方式将图像绘制到屏幕上:使用 Canvas、OpenGL ES 或 Vulkan。一、Android 图形组件无论开发者使用什么渲染 API,一切内容都会渲染到“Surface”。Surface 表示缓冲队列中的生产方,而缓冲队列通常会被 SurfaceFlinger 消耗。在 Android 平台上创建的每个窗口都由 Surface 提供支持。所有被渲染的可见 Surfac原创 2020-06-26 19:04:48 · 826 阅读 · 0 评论 -
Android 源码 installd 启动流程分析
installd 进程具有 CAP_DAC_OVERRIDE 特权(Privilege)。对于具有 CAP_DAC_OVERRIDE 特权的进程,Linux 会跳过文件的读、写和执行权限的检查。所以,installd 可以访问任何目录下的文件。system 用户则会受限。而 PackageManagerService 属于系统进程,system 用户并没有访问应用程序目录的权限,这就需要委托给 installd 处理。SystemServer 类 startBootstrapServices() 方法中原创 2020-06-09 19:41:46 · 956 阅读 · 2 评论 -
Android 源码 PackageManagerService 启动流程分析
《Android 源码 installPackage 流程分析》一节着重分析了 apk 安装流程,接下来我们分析 PackageManagerService 启动时都做了些什么?执行 PackageManagerService main 静态方法;调用 PackageManagerService 类 isFirstBoot() 方法;调用 PackageManagerService 类 getUsageStatsIfNoPackageUsageInfo() 方法;调用 PackageManager原创 2020-06-08 17:45:04 · 695 阅读 · 0 评论