- 博客(318)
- 资源 (1)
- 收藏
- 关注
原创 安卓InputDispatching Timeout ANR 流程
输入事件(包括按键和触屏事件)在5秒内无响应,就会弹出 ANR 提示框,供用户选择继续等待程序响应或者关闭这个应用程序(也就是杀掉这个应用程序的进程)。这一类是指因为消息处理超时而发生的 ANR,在 log,会看到 “Input dispatching timed out (Waiting because the focused window has not finished processing。
2024-11-20 21:21:27 1390
原创 【安卓13 源码】Input子系统(4)- InputReader 数据处理
/ up 的事件为 AMOTION_EVENT_ACTION_POINTER_UP,事件保存再 cookedPointerData.pointerCoords:走dispatchMotion 方法。类型B特有的,实际上,每个slot会和一个ID相对应,一个非负数的表示一次接触,-1表示这是一个无用的slot(或者理解为一次接触的结束)。根据事件获得相应的设备类型,然后将事件交给相应的设备处理,给触摸设备相关的类去处理。// 2-1-1)同步触摸事件 syncTouch,调用的是子类的方法。
2024-11-04 23:17:20 1036
原创 【安卓13 源码】Input子系统(3) - EventHub增加设备的流程
由前面的分析知道,在创建inputreader 线程的时候,会去循环执行 looponce 方法。
2024-09-10 23:26:18 709
原创 【安卓13 源码】RescueParty救援机制
RescueParty机制正是在这个背景下诞生的,当它注意到系统或系统核心组件陷入循环崩溃状态时,就会根据崩溃的程度执行不同的救援行动,以期望让设备恢复到正常使用的状态。开机后会自动重启,进入Recovery界面。经查找,是由于有一个进程phone进程在系统开机的时候,不断崩溃,触发了RescueParty机制,代码基于安卓 13。
2024-06-25 23:14:48 1262
原创 【安卓13 源码】Input子系统(2) - input系统与应用进程通信
点击手机屏幕,可以分发input 事件到对应的view,由上一节知道input 是运行在system 进程的,那应用进程与系统进程是如何通讯的呢,相信本文可以给到一点小小的答案。先给个结论:应用在resume 的时候才去建立与input 服务的联系。其中还创建了Token 对象和WindowState 对象等应用执行resume 代码流程。
2024-06-11 21:57:06 1180 1
原创 【安卓12源码】Input子系统(1) - input启动流程
Android Input 体系中,大致有两种类型的事件:实体按键 key 事件,屏幕点击触摸事件。如果根据事件类型的不同我们还能细分为基础实体按键的 key(power,volume up/down,recents,back,home),实体键盘按键,屏幕点击 (多点,单点),屏幕滑动等等的事件。在 Android 整个 Input 体系中有三个格外重要的成员:Eventhub,InputReader,InputDispatcher。
2024-05-22 21:47:39 1550
原创 【安卓12源码】adb 的dumpsys和cmd实现原理
主要分析下列 2 个流程:// dump activity 的一些信息// a11 打开 ActivityManagerDebugConfig 的开关。
2023-12-12 19:38:14 1709
原创 【安卓12源码】WMS系列:addWindow 和 removeWindow流程
Window的属性定义在WindowManager的内部类LayoutParams中,了解Window的属性能够更好的理解WMS的内部原理。Window的属性有很多种,与应用开发最密切的有三种,它们分别是Type(Window的类型)、Flag(Window的标志)和SoftInputMode(软键盘相关模式)Window的类型有很多种,比如应用程序窗口、系统错误窗口、输入法窗口、PopupWindow、Toast、Dialog等等。
2023-12-05 20:10:36 1647 1
原创 【安卓源码】安卓Watchdog 机制
在Android系统中,也设计了一个软件层面Watchdog,用于保护一些重要的系统服务,比如:AMS、WMS、PMS等,由于以上核心服务运行在system_server进程里面,所以当以上服务出现异常时,通常会将system_server进程kill掉,即让Android系统重启。WatchDog 的启动是在系统进程初始化后。
2023-10-08 21:30:13 718
原创 【安卓12源码】WMS的作用及其启动流程
WMS 在 Android 系统的地位,它作为中间层,连接了上层的 View 框架和下层的 SurfaceFingler。AMS,WMS之间数据是对应的,通过token值可以在AMS,WMS,应用程序之后来唯一确定一组Window,token是关联着一组窗口的,可能有多个WindowState的token值是相同的.
2023-07-11 23:37:06 2786 2
原创 【安卓源码】安卓app应用进程启动原理
fork的主要工作是寻找空闲的进程号pid,然后从父进程拷贝进程信息,例如数据段和代码段,fork()后子进程要执行的代码等。===== startProcessLocked 在fork 一个应用进程之后,保存这个 pid 值:handleProcessStartedLocked =====Zygote利用fork方法生成新进程,对于新进程A复用Zygote进程本身的资源,再加上新进程A相关的资源,构成新的应用进程A。// 执行 runSelectLoop 循环监听客户端的创建进程的消息。
2023-05-22 21:06:49 1074 2
原创 【安卓源码】Binder机制5 -- Java层Framework Binder机制和 AIDL
因为 应用进程均是 zygote fork 出来的子进程,会复制父进程的内存AppRuntime start("com.android.internal.os.RuntimeInit", args, zygote) 启动一个普通应用或者zygote,都会注册jni所以 gRegJNI 是个结构体数组。NELEM(gRegJNI) 是计算该数组的大小 size这里主要关注 register_android_os_Binder 函数。
2023-05-15 21:54:10 771
原创 【安卓源码】Binder机制4 -- getService 和进程通信
看下 getMediaplayerService 的实现defaultServiceManager() 为:new BpServiceManager(new BpBinder(0))通过 IPCThreadState 去实现,一个线程对应一个 IPCThreadState等待回复 waitForResponsetalkWithDriver 与binder 驱动交互与binder 驱动交互调用 binder_ioctl_write_read 方法。
2023-05-10 21:19:31 913 2
原创 【安卓源码】Binder机制3 -- Binder线程池
Binder本身是C/S架构,就可能存在多个Client会同时访问Server的情况。在这种情况下,如果Server只有一个线程处理响应,就会导致客户端的请求可能需要排队而导致响应过慢的现象发生。解决这个问题的方法就是引入多线程。【多个客户端不同线程去请求,服务端需要使用多线程机制,binder线程池,创建多个线程去回复多个客户端的请求】Binder机制的设计从最底层–驱动层,就考虑到了对于多线程的支持。
2023-04-26 21:16:44 2507
原创 【安卓源码】Binder机制2 -- addService 流程
一次完整的 Binder IPC 通信过程通常是这样:首先 Binder 驱动在内核空间创建一个数据接收缓存区;接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。
2023-04-25 19:52:06 895 1
原创 【安卓源码】Binder机制1-Servicemanager 进程的启动和defaultServiceManager
对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。Client进程向Server进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client端与Server端进程往往采用ioctl等方法跟内核空间的驱动进行交互。Binder通信采用C/S架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。
2023-04-23 20:33:40 1412
原创 C语言-实现顺序二叉树和平衡二叉树AVL
在实现二叉树之前先看下结构体的一些使用方法数组是保存一系列相同的数据。在实际问题中,一组数据往往有很多种不同的数据类型。例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄访问其中的各个元素,用结构成员运算符点(.)。即访问成员的一般形式是:结构变量名 . 成员名如 a.name 表示学生 a 的姓名。1)结构体的成员逐个赋值2)整体赋值也可以在初始化的时候赋值3)整体拷贝如上每次使用结构体均需要写struct,可以使用typedef 简化书写。
2023-04-10 21:44:02 1152
原创 【安卓源码】SurfaceFlinger 启动及其与应用通信
surfaceflinger 的makefile 文件init进程就可以解析 "surfaceflinger.rc" ,启动 SurfaceFlinger 服务进程,执行 main 方法,启动surfaceflinger 进程:基本操作如下:调用的是 SurfaceFlingerFactory 头文件创建了消息队列 mFactory.createMessageQueueDefaultFactory 头文件创建独占智能指针 MessageQueue代码路径为如下:方法解析。
2023-03-19 22:26:54 1395 1
原创 【安卓源码】TextureView 的BufferQueue 生产者消费者机制
图像流的最常见消费者是 SurfaceFlinger,该系统服务会消耗当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到屏幕。它的作用很简单:将生成图形数据缓冲区的一方(生产方)连接到接受数据以进行显示或进一步处理的一方(消耗方)。硬件混合渲染器 HAL 则进行另一半的工作,是所有 Android 图形渲染的中心点。创建Surface的过程会涉及到与SurfaceFlinger的互动,SurfaceFlinger是一个系统级的服务,负责创建/管理/合成Surface对应的Layer。
2023-03-13 18:39:02 2248
原创 C++ 三种智能指针及其设计实现unique_ptr、 share_ptr 指针
0、差不多春节啦。。。。。好久没有写博客,写一写吧。。。。。。祝大家嗨皮,提前恭喜发财。
2023-01-17 20:27:08 1640
原创 C语言str-xxx字符串库函数处理大全【超详细】
C语言str系列库函数在面试中经常容易被面试官喊在纸上写某一个函数的实现,库函数的实现包含在头文件中,有如下方法。
2022-12-17 23:09:54 958
原创 安卓源码:广播机制
在Android系统中,广播(BroadCast)是组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用.BroadcastReceiver也有自己独立的生命周期,但是它又和Activity、Service不同。在发送广播时,可以通过设置属性来将广播定义为前台广播,如果未定义,默认为后台广播。1.广播接受者的生命周期是非常短暂的,在接受到广播的时候创建,onReceive()方法结束后销毁。............
2022-07-21 19:07:06 10540
原创 【FFmpeg学习】FFmpeg常见的结构体
音视频播放的原理主要分为:解协议->解封装->解码->音视频同步->播放。那 FFmpeg 的解码流程结构体也可以由以上流程进行分类:涉及的主要的结构体和函数 在解码的情况下,buffer用于存储ffmpeg读入的数据。例如打开一个视频文件的时候,先把数据从硬盘读入buffer,然后在送给解码器用于解码。其中opaque指向了URLContext。在avformat_open_input()中进行初始化。AVIOContext中有以下几个变量比较重要:AVFormatContext是一个贯穿始终的数据结构
2022-06-10 15:11:13 1371 1
原创 MediaPlayer 播放本地视频源码流程【2】-setSurface和prepareAsync
1.setSurface//设置画布进行展示mediaPlayer.setSurface(new Surface(textureView.getSurfaceTexture()));frameworks/base/media/java/android/media/MediaPlayer.java public void setSurface(Surface surface) { if (mScreenOnWhilePlaying && surface !.
2022-05-24 18:20:04 1010
原创 【安卓R 源码】native层媒体模块通信AHandler机制源码
本章将分析native层媒体模块通信AHandler机制源码实现,类图关系如下:from:Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 1】_小白兔LHao的博客-CSDN博客frameworks/av/media/libstagefright/MediaClock.cppvoid MediaClock::processTimers_l() { int64_t nowMediaTimeUs; status_t sta.
2022-05-16 18:33:51 623
原创 MediaPlayer 播放本地视频源码流程【1】-setDataSource
MediaPlayer 播放本地视频源码流程1. MediaPlayer 结合 textureView 播放本地视频xml 文件<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://sch
2022-05-10 18:20:38 2782
原创 【安卓R 源码】从 Telecom CallAudioModeStateMachine详解StateMachine状态机源码
状态机是将对象的状态与行为封装在一起;可以解决庞大的分支语句带来程序阅读性差和不便于进行扩展问题,使整个结构变得更加清晰明了,降低程序管理的复杂性提高灵活度。Android系统的StateMachine机制是一个State模式的应用,StateMachine是一个分层处理消息的状态机,并且是能够有分层排列状态。以 Telecom 的CallAudioModeStateMachine 作为分析:1. 状态机的构造函数/packages/services/Telecomm/src/com/and
2022-04-21 18:10:46 2915
原创 【FFmpeg学习】H264 视频码流分析
H264 原始码流和解码流程1. H264编码分层NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。 VCL层:(Video Coding Layer,视频数据编码层): 对视频原始数据进行压缩我们可以看到视频帧序列每一帧图像是由slice构成.
2022-03-31 18:23:25 2828
原创 【FFmpeg学习】H264 视频编码格式详细总结
一、音视频的一些名词解释1. 码率指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高,这样表现出来的的效果就是:视频画面更清晰画质更高。一般以秒为单位,如:128 kbps,表示每秒通过网络传送的数据量为 128k bit.2. 帧率指视频每秒钟包含多少张画面,一般单位为fps。帧率越高,表示单位时间内图像帧的个数,普通的视频文件一般在25fps - 30fps之间,表示每秒钟25-30张图像,而一般涉及到游戏等帧率会比较高一些
2022-03-17 23:11:07 5544
原创 【FFmpeg学习】YUV采样方式与存储格式
1. 音视频播放原理音视频播放的原理主要分为:解协议->解封装->解码->音视频同步->播放。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6XASE4OD-1646829498402)(<> “点击并拖拽以移动”)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8CnXBENa-1646829498410)(<> “点击并拖拽以移动”)]1.解协议:将流媒体协议的数据解析为相应
2022-03-09 20:40:39 4056
原创 【FFmpeg学习】Visual Studio 2019 使用 ffmpeg 详细方法
目录1. 下载FFmpeg编译好的Windows版本2.VS2019配置ffmpeg3. Windows控制台使用ffmpeg命令1. 下载FFmpeg编译好的Windows版本地址如下:Download FFmpeg点击如下:选择 shared2.VS2019配置ffmpeg比如:你下载上述的编译好的 ffmpeg 版本路径为:C:\ffmpeg\ffmpeg-4.4.1-full_build-shared1)右键项...
2022-03-06 23:20:13 8026 7
原创 【安卓R 源码】获取音频焦点和释放音频焦点
一. 获取焦点流程1. 电话焦点只有系统可以申请,如果是电话焦点,系统会把所有多媒体和游戏的音频流实例全部mute。同理电话焦点释放会解除mute操作2. 系统管理的焦点栈有大小限制限制为100.大于100,抢占焦点失败。3. 电话焦点状态下,其他app的所有抢占焦点的操作都会失败。4. 我们传的OnAudioFocusListener决定了ClientID,相同的ClientID焦点栈中不会重复存储,OnAudioFocusListener最好进行复用,除了特殊的业务场景。电话焦点...
2022-02-18 09:20:28 3477
原创 【安卓R 源码】Ripple 水波纹效果源码
安卓使用ripple实现点击时的涟漪效果 - 简书https://www.jb51.net/article/145309.htmAndroid:RippleDrawable 水波纹/涟漪效果 - 简书Android5.0 水波控件RippleDrawable简析_Jeepend的专栏-CSDN博客在Android5.0中新增了一种水波效果控件,叫RippleDrawable,当控件使用RippleDrawable作为背景(android:background)且在控件可以接受点击动作
2022-01-07 00:10:26 953 1
原创 【安卓R 源码】 View事件分发机制源码流程
1. 屏幕点击事件事件 简介 ACTION_DOWN 手指 初次接触到屏幕 时触发。 ACTION_MOVE 手指 在屏幕上滑动 时触发,会多次触发。 ACTION_UP 手指 离开屏幕 时触发。 ACTION_CANCEL 事件 被上层拦截 时触发。 安卓中输入事件主要分为KeyEvent(键盘)和MotionEvent(触摸屏)两种,其中 KeyEvent是指键盘输入事件,本文主要讲 MotionEvent。正常情况下,无论你手指在屏幕做多少操作
2022-01-06 23:42:48 1885
原创 【安卓 R 源码】从源码角度看Context
1. Context 是什么?Context,中文直译为“上下文”,它描述的是一个应用程序环境的信息,从程序的角度上来理解:Context是个抽象类,而Activity、Service、Application等都是该类的一个实现。SDK中对其说明如下:Interface to global information about an application environment. This is an abstract class whose implementation is provided
2021-11-22 16:25:35 2336
原创 【安卓 R 源码】Activity 启动流程及其生命周期源码分析
1. Activty 的生命周期activity的生命周期oncreate()->onstart()->onResume()->onPause()->onStop()->onDestory()onCreate():当我们点击activity的时候,系统会调用activity的oncreate()方法,在这个方法中我们会初始化当前布局setContentLayout()方法。onStart():onCreate()方法完成后,此时activity进入.
2021-11-18 18:27:37 3832
原创 【安卓R 源码】Hnadler 消息处理机制源码分析
1. Handler 的常用使用方法Handler是安卓提供的一种消息机制。通常用于接受子线程发送的数据,并用此数据配合主线程更新UI。比如,点击一个按钮去服务器请求数据。如果直接在主线程(UI线程)做请求操作,界面会出现假死现象, 如果长时间还没有完成的话,会收到Android系统的一个错误提示 "应用程序无响应(ANR)"。为什么呢?因为在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下三种情况下会弹出ANR对.
2021-11-12 18:07:06 507 1
原创 【安卓 R 源码】 bindService 源码分析
使用bindService主要分两种情形:1. Service的调用者client与Service在同一个App中;2. Service的调用者client是App1中的一个Activity,而Service是App2中的Service,client与service分属两个App,这种情形下主要用于实现跨进程的通信。bindService 的生命周期:Service被绑定bindService()的时候调用onCreate()和onBind()方法,onStartCommand()方法不被
2021-11-10 15:51:09 2795
转载 CompletableFuture 的使用方法
https://www.jianshu.com/p/6bac52527ca4CompletableFuture是java8引入的新类,该类实现了 Future 接口和 CompletionStage 接口,封装了future、forkjoin相关类来执行异步,所以你还是可以像以前一样通过阻塞(get)或者轮询的方式获得结果,尽管这种方式不推荐使用。 CompletionStage 接口代表异步计算中的 不同阶段,以及如何 组合 这些计算阶段。 CompletableStage 接口中有 50 多个.
2021-09-01 00:05:40 956
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人