自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

天涯的专栏

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

  • 博客(126)
  • 资源 (10)
  • 收藏
  • 关注

原创 WAV 音频格式学习

WAV 是最常见的声音文件格式之一,是微软公司专门为 Windows 开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。但 WAV 文件有一个致命的缺点,就是它所占用的磁盘空间太大。它符合资源互换文件格式(RIFF)规范,用于保存 Windows 平台的音频信息资源,被 Windows 平台及其应用程序所广泛支持。Wave 格式支持 MSADPCM、CCITT A 律、CCITT μ 律和其他压缩算法,支持多种音频位数、采样频率和声道,是 PC 机上最为流行的声音文件

2020-10-23 17:11:34 55

原创 Android 源码 Camera2 openCamera 流程分析

打开相机的起点从 CameraManager 类 openCamera(…) 方法开始。打开具有给定 ID 的相机连接。使用 getCameraIdList 获取可用相机设备的列表。请注意,即使列出了 ID,但如果在对 getCameraIdList 和 openCamera 的调用之间断开了设备的连接,或者如果优先级更高的相机 API 客户端开始使用相机设备,则打开可能会失败。从 API 级别 23 开始,由于优先级较低的后台相机 API 客户端正在使用该设备,因此已调用 Availability

2020-10-20 08:48:43 59

原创 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 755

原创 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 267 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 62

原创 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 90

原创 Android 源码 Camera2 架构初识

android.hardware.camera2 包为连接到 Android 设备的单个相机设备提供了接口。该包将相机设备建模为管道,它接收捕获单个帧的输入请求,捕获每个请求的单个图像,然后输出一个捕获结果元数据包,以及一组用于请求的输出图像缓冲区。请求按顺序处理,可以同时处理多个请求。由于相机设备是一个多阶段的管道,所以在大多数 Android 设备上,要保持完整的帧率需要有多个请求在运行。要枚举、查询和打开可用的相机设备,需要获取 CameraManager 实例。各个 CameraDevices

2020-08-30 20:14:29 714

原创 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 839

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

层 Layer 创建起点是 new 一个 Layer 对象,当对象第一次被引用的时候就会触发其 onFirstRef() 方法。Layer 构造器中初始化了一大堆成员变量。onFirstRef() 方法中看到了几个重量级选手,这里创建了 BufferQueue 和 SurfaceFlingerConsumer。Layer 类首次引用图层时,将创建新的 BufferQueue 和新的 SurfaceFlingerConsumer。它还实现了 onFrameAvailable(),该函数通知 Surfac

2020-08-18 20:57:23 82

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

在 《Android 源码 图形系统之 relayoutWindow》 一节中,outSurface 初始化(调用其 copyFrom(…) 方法,入参是 SurfaceControl 对象)没有继续分析了。现在详细来分析一下后续流程。copyFrom(…) 方法将另一个 Surface 复制到此 Surface。现在,此 Surface 拥有对与原始 Surface 相同数据的引用,并且不是所有者。这是供窗口管理器从客户端返回窗口 Surface 时使用的,将其从窗口管理器管理的表示形式转换为客户端用来

2020-08-18 20:53:51 70

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

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

2020-08-15 20:32:26 115

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

接上一节我们已经将 BMP180 驱动开发完成,现在继续完成 HAL 开发,Android 8 版本新增的 HAL 一般采用 binder 的方式,使用 HIDL 语言进行开发。实际开发除了代码完成,绕不开 SEAndroid。下面分几个步骤介绍。HAL 开发HAL 验证Bmp180Service 服务开发APP 开发处理 SEAndroid一、HAL 开发在 Android 8.0 及更高版本中,较低级别的层已重新编写以采用更加模块化的新架构。搭载 Android 8.0 或更高版本的设

2020-08-15 17:28:22 86

原创 Android 源码 图形系统之 relayoutWindow

在 《Android 源码 图形系统之请求布局》 一节,分析到 ViewRootImpl 类 performTraversals() 方法内调用 relayoutWindow(…) 方法重新布局窗口时没有继续进一步深入,现在从 relayoutWindow(…) 开始来梳理后续流程。ViewRootImpl 类 relayoutWindow(…) 方法内部最终调用了 Session 类 relayout(…) 方法。mWindowSession 指向相应的代理对象 IWindowSession.Stub.

2020-08-13 19:41:24 139

原创 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 69

原创 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 803

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

驱动开发主要位于 Linux 内核层,首先认识一下 BMP180,接着需要修改 DTS,最后才开始编写驱动,编写完驱动我们再来写一个用户层验证程序来获取温度和压力。一、BMP180 芯片介绍BMP180 是一款高精度、小体积、超低能的压力传感器,适用于移动电话、PDAs、GPS 导航设备和户外设备。在与仅仅 0.25 米低空噪音快速转换时,BMP180 提供卓越的性能。使用 I2C 接口可以很轻松的跟主控制器系统进行通讯。BMP180 基于压阻式技术 EMC 稳健性、高精度以及线性长期稳定性,被设计用

2020-07-19 15:58:13 165

原创 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 113

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

硬件渲染器初始化从 ViewRootImpl 类 setView(…) 方法中调用 enableHardwareAcceleration(…) 开始。HardwareRenderer 是一个抽象类,代表使用硬件加速渲染视图层次结构的接口。首先找到 mHardwareRenderer 赋值的位置,我们才能确认它具体是什么子类。这在 ViewRootImpl 类 setView 方法中调用 enableHardwareAcceleration(…) 方法启用硬件加速开始。frameworks/base/c

2020-07-11 15:14:41 97

原创 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 437 4

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

NanoPC-T4 不仅是世界上最小的全功能接口 RK3399 一体化主板, 而且是一款完全开源的高性能计算平台。它的尺寸只有 100x64mm,标配4GB LPDDR3 内存和 16GB 闪存, 板载2.4G & 5G 双频 WiFi 模组, 带有标准完整的 M.2 PCIe 接口, 可直接安装使用 NVME SSD 高速固态硬盘。NanoPC-T4 还带有 MIPI-CSI 双摄像头接口, MIPI-DSI 和 eDP 双显示接口, HDMI 2.0 视频输出口,并具备 Type-C/DP,U

2020-07-05 20:26:14 483

原创 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 132

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

《Android 源码 输入系统之窗口关联》 一节着重考虑了窗口怎样和输入系统关联,而这一节的重点在于窗口如何添加到图形系统。先来看一个整体概览,再来详细分析。先从 setContentView 说起。此函数的作用是:从布局资源设置 Activity 内容。资源将被解析,将所有顶级视图添加到 Activity 中。首先调用 getWindow() 获取 Window 对象(实际为 PhoneWindow 对象),然后调用其 setContentView(…) 方法。frameworks/base/c

2020-06-26 19:06:15 104

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

Android 框架提供了各种用于 2D 和 3D 图形渲染的 API,可与制造商的图形驱动程序实现方法交互。应用开发者可通过三种方式将图像绘制到屏幕上:使用 Canvas、OpenGL ES 或 Vulkan。一、Android 图形组件无论开发者使用什么渲染 API,一切内容都会渲染到“Surface”。Surface 表示缓冲队列中的生产方,而缓冲队列通常会被 SurfaceFlinger 消耗。在 Android 平台上创建的每个窗口都由 Surface 提供支持。所有被渲染的可见 Surfac

2020-06-26 19:04:48 158

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

installd 进程具有 CAP_DAC_OVERRIDE 特权(Privilege)。对于具有 CAP_DAC_OVERRIDE 特权的进程,Linux 会跳过文件的读、写和执行权限的检查。所以,installd 可以访问任何目录下的文件。system 用户则会受限。而 PackageManagerService 属于系统进程,system 用户并没有访问应用程序目录的权限,这就需要委托给 installd 处理。SystemServer 类 startBootstrapServices() 方法中

2020-06-09 19:41:46 138

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

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

2020-06-08 17:45:04 151

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

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

2020-06-05 21:47:29 886

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

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

2020-06-02 22:05:21 117

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

handleReceiveCallback 方法对消息进行处理。上一节打通了 InputDispatcher 和输入窗口之间双向的通道,这是通过 InputChannel 承载的。现在可以继续分析从 InputDispatcher 发送出的事件如何被接收处理了。NativeInputEventReceiver 类 handleEvent 被调用,用来处理 InputDispatcher 发送来的事件。frameworks/base/core/jni/android_view_InputEventRec

2020-06-02 21:36:34 113

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

上一节完成了焦点窗口关联,现在可以分析如何将输入事件继续从 InputDispatcher 继续分发。InputChannel 的 sendMessage 将消息发送出去。实际是调用 socket 的 send 接口来发送消息的。具体一点其实使用的是 socketpair。所以我们先来学习 Linux 如何使用 socketpair,然后“破解” InputChannel 通信,最后再去分析输入事件窗口分发。一、socketpair 使用用于创建一对无名的、相互连接的套接字。#include <

2020-06-01 21:22:35 121

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

在前一节中,InputDispatcher 的事件派发工作调用 InputChannel sendMessage 方法标志着 InputDispatcher 一个周期的工作结束。但意味着事件找到对应的窗口处理的开始。上一节中 mFocusedWindowHandle 是 InputDispatcher 的成员变量,它是确定发送事件消息的关键。我们以它为突破口寻找“出路”。mFocusedWindowHandle 在 setInputWindows 方法中进行了赋值,我们需要反推一下。frameworks

2020-06-01 21:20:15 103

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

InputDispatcherThread 线程负责派发事件。InputDispatcherThread 启动后会执行 threadLoop 函数。threadLoop 函数返回 true,InputDispatcherThread 就会循环执行 threadLoop 函数。具体可以参见关于 Native Thread 实现一节《Android 源码 Native Thread 分析》。InputDispatcherThread(称为“ InputDispatcher”)线程在队列上等待新事件,并异步将其分

2020-06-01 21:18:23 104

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

InputReaderThread 线程负责读取事件。InputReaderThread 启动后会执行 threadLoop 函数。threadLoop 函数返回 true,InputReaderThread 就会循环执行 threadLoop 函数。具体可以参见关于 Native Thread 实现一节《Android 源码 Native Thread 分析》。InputReaderThread(称为“ InputReader”)读取并预处理原始输入事件,应用策略,并将消息发布到由 InputDispat

2020-05-31 15:18:34 162

原创 Android 源码 InputManagerService 启动

上一节分析了 InputManagerService 初始化,这一节重点关注启动以后都做了一些什么?frameworks/base/services/java/com/android/server/SystemServer.javapublic final class SystemServer { ...... public static void main(String[] args) { new SystemServer().run(); } ....

2020-05-30 15:42:13 125

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

InputManagerService 是在 SystemServer 中启动的。它包装了 C++ InputManager 并提供其回调。它分为 Java 层和 Native 层两部分。Java 层负责与 WindowManagerService 的通信。而 Native 层则是 InputReader 和 InputDispatcher 两个输入系统关键组件的运行容器。InputManagerService 在 startOtherServices() 方法中启动,先创建 InputManagerSe

2020-05-30 15:40:38 126

原创 Android 源码 输入系统初识

触摸屏与键盘是 Android 最普遍也是最标准的输入设备。当输入设备可用时,Linux 内核会在 /dev/input/ 下创建对应的名为 event0 ~ eventN 或其他名称的设备节点。而当输入设备不可用时,则会将对应的节点删除。当用户操作输入设备时,Linux 内核接收到相应的硬件中断,然后将中断加工成原始的输入事件数据并写入其对应的设备节点中,在用户空间可以通过 read() 函数将事件数据读出。Android 输入系统的工作原理概括来说,就是监控 /dev/input/ 下的所有设备节

2020-05-30 11:19:28 72

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

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

2020-05-18 18:35:02 159

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

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

2020-05-15 21:04:36 125

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

POSIX.1 指定了一组接口(函数、头文件),用于线程编程,通常称为 POSIX 线程或 Pthread。一个进程可以包含多个线程,所有线程都执行相同的程序。这些线程共享相同的全局内存(数据段和堆段),但是每个线程都有自己的栈(自动变量)。POSIX.1 还要求线程共享一系列其他属性(即,这些属性是进程范围而不是每个线程的):-进程 ID-父进程 ID-进程组 ID 和会话 ID-控制终端-用户和组 ID-打开的文件描述符-记录锁(请参阅 fcntl(2))-信号配置-文件模式创建掩码

2020-05-14 19:51:02 136

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

上一节《libmatroska 与 libebml 移植到 Android 支持 mkv 格式解析与创建》成功编译了 Android 平台可用的 libmatroska.so 和 libebml.so。具体如何使用它们还没开始,这一节以创建 mkv 格式为例对它们进行使用。当然还要排坑!这花费了我不少力气去找到库中的 bug。一、使用 libmatroska 与 libebml首先在 Android Studio 中新建一个 Project。复制上一节编译出的 so 和 头文件到 libs/ 路径下

2020-05-11 18:05:58 152

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

Matroska 多媒体容器(Multimedia Container)是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以其不是一种压缩格式,而是 Matroska 定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的电影、电视节目等多媒体内容。在概念上 Matroska 和其他容器,比如 AVI、MP4 或 ASF(Advanced Streaming Format,即高级流格式)比较类似,但其在技术规程上完全开放,在实现上包

2020-05-11 18:00:57 127

ORMLite和GreenDao性能对比Demo

ORMLite和GreenDao性能对比Demo,两个常用数据库ORM框架用法与比较

2016-01-03

android使用html写一个关于页面

使用html写一个android的关于页面,动态修改版本号,让你从繁重的Textview 堆砌中彻底解放出来

2015-11-07

Android FTP客户端与服务端

两部手机其中一部手机作为服务器,另一部手机作为客户端下载,使用FTP方式传输文件,图片下载,多图加载,滑动停止加载完整DEMO。

2015-09-13

MPAndroidChart

关于MPAndroidChart就不多说了,是一个开源的android图表库,包含折线图、柱状图、散点图、雷达图等等,功能非常强大

2015-09-05

Android图片局部放大镜

图片上某一点看不清楚,你不需要将整张图片都放大,只需要放大你想看到的部分,这个时候放大镜就派上用场了。

2015-08-16

Android发送邮件功能实现

使用commons-net-3.3.jar或mail.jar核心邮件包实现邮件发送功能,可发送附件、图片、HTML邮件,灵活控制,甚至实现后台发送邮件功能!

2015-08-16

android图片堆叠效果实现

android图片堆叠效果实现,实现任意小角度堆叠显示,可用于图片相册缩略图

2015-07-18

软件内每日提醒功能实现

软件内每日提醒功能实现,可添加到工程中实现每日提醒,隔天提醒等提醒功能

2015-07-12

可分割的环形进度条

可分割的环形进度条,适合倒计时等场景,已经定义好,只需把文件拷入即可使用

2015-06-13

高仿今日头条字体渐变指示器

今日头条的指示器很炫酷,随着你的滑动字体颜色可以逐渐的变化,实现方法主要是使用自定义控件结合ViewPager。 CompleteTrackColorViewDemo实现高仿今日头条字体渐变指示器,滑动+点击切换,如丝顺滑

2015-04-26

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

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