自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 资源 (4)
  • 收藏
  • 关注

原创 Android11 DNS解析流程

​ DNS的全称是domain name system,即域名系统。主要目的是将域名解析为IP地址,域名是方便用户记忆,但网络传输中源目地址使用IP地址来进行标识的,所以Android中的网络应用程序在发起http请求之前必然要经历DNS解析过程。

2023-06-16 21:35:07 3574 6

原创 ImageReader实现原理

1. ImageReader1.1 概述ImageReader允许应用程序直接获取渲染到surface的图形数据,并转换为图片,这里我用Presentation+VirtualDisplay+ImageReader做一个Demo来探讨ImageReader的实现原理。Demo实现的功能是:Presentation指定显示在VirtualDisplay上,然后由ImageReader去获取VirtualDisplay上渲染的Presentation图像,获取之后将其转换为Bitmap,设置到一个Imag

2022-04-26 10:29:06 6717 3

原创 Android12 窗口组织方式(对比Android10)

1. Android10窗口容器组织方式1.1 AMS和WMSAndroid10上对窗口的组织方式有两部分,AMS和WMS,AMS容器从大到小依次为:ActivityDisplay->ActivityStack->TaskRecord->ActivityRecord,WMS容器这边复杂很多,因为有一些特殊的窗口,大致可以理解为:顶级容器DisplayContent,其下有四大窗口容器,1. mBelowAppWindowsContainers(存储非APP类型窗口,并且要求其显示在A

2022-01-06 18:15:27 7562 2

原创 Android12 多屏多用户

1. 多用户多屏(CarService)google在如下提交引入了CarOccupantZoneManager和CarOccupantZoneService:commit bb877e25c080aeabaae10f12e2f725dae0a65f90Author: Keun young Park <[email protected]>Date: Fri Aug 2 10:38:01 2019 -0700 Add CarOccupantZoneManager API

2022-01-05 11:02:32 6951 5

原创 AndroidQ 分屏窗口尺寸计算 (WMS部分)

1. 分屏窗口尺寸计算1.1 窗口添加到WMSActivity首次启动之后,在其resume阶段会将自己的Window添加到WMS: void makeVisible() { if (!mWindowAdded) { ViewManager wm = getWindowManager(); //顶层DecorView wm.addView(mDecor, getWindow().getAttributes())

2021-11-25 10:16:48 4488

原创 AndroidQ 分屏窗口模式 (AMS部分)

1. 多窗口1.1 栈Android7.0开始支持多窗口,多窗口分为三种,画中画,分屏,自有窗口,多窗口的核心原理其实就是分栈和设置栈边界,分栈即把不同窗口模式下的Activity放在不同的ActivityStack中,Android7.0为区分不同ActivityStack定义了不同stackId: /** First static stack ID. */ public static final int FIRST_STATIC_STACK_ID = 0;

2021-11-22 09:46:38 7981 12

原创 AndroidQ RRO(Runtime Resource Overlay)机制(4)

概述上篇文章说到目标应用的Overlay包路径被更新到了目标应用ApplicationInfo之后,就会将更新之后的ApplicationInfo传给APP进程,本篇继续来看APP进程的处理。ApplicationThread.scheduleApplicationInfoChanged public void scheduleApplicationInfoChanged(ApplicationInfo ai) { mH.removeMessages(H.APPLIC

2021-08-25 15:54:20 1563

原创 AndroidQ RRO(Runtime Resource Overlay)机制(3)

概述上一篇文章讲到当我们通过OMS的setEnabled方法去改变一个Overlay包的状态时会经过一系列的判断,如Overlay包是否存在,Overlay包的目标应用是否存在,目标应用的Idmap文件是否存在,Overlay包是否为静态等等,如果最终通过判断且Overlay包的状态确实发生了改变则会调onOverlaysChanged方法去通知目标应用其资源包发生了改变,进而使Overlay能够生效。 boolean setEnabled(@NonNull final String packageNa

2021-08-24 11:00:44 1049

原创 AndroidQ RRO(Runtime Resource Overlay)机制(2)

概述Android5.0引入了RRO,RRO全称Runtime Resource Overlay,是一种运行时动态替换资源的方式,它可以在不修改三方应用源码的情况下替换起资源文件,主要用于应用主题开发,Android8.0引入了一个系统服务OverlayManagerService来配合RRO: * <pre> * Android framework * | ^ * . . . | . . . . | . . . . *

2021-08-18 10:24:51 2166

原创 AndroidQ RRO(Runtime Resource Overlay)机制(1)

概述Android5.0引入了RRO,RRO全称(Runtime Resource Overlay),它可以实现在不修改三方应用源码的情况下,替换其资源,主要依靠一个叫做overlay apk的应用实现的, overlay apk和普通的应用相比只有一个区别,就是overlay apk不含任何代码(java或者C++),它的一般结构仅包含一个AndroidManifest.xml和res目录,当然因为需要在源码下编译,还包含一个Android.mk或者Android.bp(也可以用AS编译,前提是AS编译

2021-08-13 17:31:05 4151 2

原创 Android Automotive之Car API

本篇基于AOSP11简单来看看汽车专有的基础API。汽车相关的API源码集中在packages/services/Car/car-lib目录下,此目录提供了一个类Car,为外界提供汽车所有服务和数据的访问。打开packages/services/Car/car-lib的Android.bp可以发现此目录会被编译成一个名为"android.car"的java库java_library { name: "android.car", srcs: [ "src/**/*.jav

2021-06-07 16:56:16 4756 3

原创 Android Automotive之CarService开机启动

本篇基于AOSP11代码分析CarService相关启动流程,和汽车相关的服务的启动主要依靠一个系统服务CarServiceHelperService开机时在SystemServer中启动:CarServiceHelperService启动private static final String CAR_SERVICE_HELPER_SERVICE_CLASS = "com.android.internal.car.CarServiceHelperService";

2021-06-03 14:27:27 3140 4

原创 AndroidR Input子系统(10)View的事件分发机制

上一篇文章我们说到当输入事件从InputDispatcher通过server端InputChannel将输入事件发送给应用程序的client端,其实最终事件被发送到了java层ViewRootImpl中,此类定义了多种类型的InputStage,以责任链模式进行处理分发输入事件。final class SyntheticInputStage extends InputStage{}final class ViewPostImeInputStage extends InputStage{}final c

2021-04-24 17:33:49 885

原创 AndroidR Input子系统(9)UI线程对Input事件的分发与结束处理

上一篇文章分析到应用程序和InputDispatcher分别属于两个不同进程,他们之间的连接需要依靠InputChannel(内部通过一对socket实现)来建立,连接建立之后,InputDispatcher就可以将Input事件发送到应用程序的UI线程,而应用程序处理完事件之后也可以通过InputChannel通知到InputDispatcher。整个过程总结如下:首先当一个APP启动时,会将自己的Window添加到WMS,并传递一个空InputChannel过去。WMS端,通过openInput

2021-01-26 14:18:37 1788 3

原创 AndroidR Input子系统(8)InputChannel注册,建立APP和InputDispatcher的连接

上一篇文章分析到InputDispatcher将Input事件做了一些列处理之后,会将事件发送到APP进程,InputDispatcher和APP属于两个不同进程,他们之间是如何通信的呢?答案就是InputChannel,我们看看InputChannel的注释:/** * An input channel specifies the file descriptors used to send input events to * a window in another process. It is P

2020-12-20 16:48:07 2596 3

原创 AndroidR Input子系统(7)InputDispatcher线程分发输入事件

我们在AndroidR Input子系统(3)InputReader线程中分析了EventHub读取了输入系统的原始事件之后会将其转换为NotifyKeyArgs(对于按键事件来说),接着会调用InputDispatcher的notifyKey函数将NotifyKeyArgs发送到InputDispatcher线程做进一步处理。我们先来简单看看NotifyKeyArgs这个结构体,它是在KeyboardInputMapper的processKey函数中构造的:NotifyKeyArgs结构体void

2020-12-06 17:54:19 1979 6

原创 AndroidR Input子系统(6)解析“.kcm“文件

上一篇文章分析了".kl"文件的解析,".kl"文件的作用是将linux scancode转换为Android keycode,相比之下".kcm"文件的解析要复杂一些。“.kcm"文件意为按键字符映射文件,作用是将 Android按键代码与修饰符的组合映射到 Unicode字符,注意这里提到组合,意思是它可以提供组合按键功能,其实就目前的Android手机来说,基本都是全触摸屏,除了外接键盘,否则已经很少会用到”.kcm"文件了,但我们出于学习的目的还是来分析下其内部解析原理,和".kl"文件一样,系统

2020-11-22 18:21:08 1440 5

原创 AndroidR Input子系统(5)解析“.kl“文件

上一篇文章看了Input系统首次启动时会扫描/dev/input目录,并且会通过函数loadKeyLayout和loadKeyCharacterMap加载和解析".kl",".kcm"文件,这两个文件的解析规则对应熟悉Input系统还是比较重要的,上一篇文章限于篇幅只看了加载过程,本篇我们就来分析一下其解析过程,还是先将loadKeyLayout函数贴出来看看:KeyMap::loadKeyLayoutstatus_t KeyMap::loadKeyLayout(const InputDeviceIde

2020-11-15 13:24:50 1882 2

原创 AndroidR Input子系统(4)扫描/dev/input目录

上一篇文章分析了InputReader线程对Input事件的处理流程,主要分为了三大步骤:EventHub通过INotify与Epoll监听/dev/input下的事件,在读取到事件之后放入mEventBuffer,此步骤将input_event转换为了RawEvent。拿到原始事件RawEvent之后调用processEventsLocked对事件进行加工,不同事件类型有不同的加工厂(InputMapper),此步骤将RawEvent转换为了NotifyKeyArgs。通过QueuedListen

2020-11-08 16:26:05 2329 2

原创 AndroidR Input子系统(3)InputReader线程读取输入事件

上一篇文章分析了Input系统的启动之后会通过INotify与Epoll监听dev/input/目录下文件的创建和删除,并且启动两个线程InputReader和InputDispatcher,InputReader启动之后调用其loopOnce()函数,InputDispatcher启动之后调用其dispatchOnce函数,它们都是死循环的调用,这篇文章就先来看看InputReader的loopOnce()函数://InputReader.cppvoid InputReader::loopOnce()

2020-11-03 19:32:02 1639 5

原创 AndroidR Input子系统(2)Input子系统的启动

分析Input子系统的启动主要是看InputManagerService的启动,InputManagerService是java层的一个系统服务,继承IInputManager.Stub,作为binder服务端,在SystemServer中启动:private void startOtherServices(@NonNull TimingsTraceAndSlog t) { ...... t.traceBegin("StartInputManagerServ

2020-10-18 14:20:50 1927 8

原创 AndroidR Input子系统(1)INotify与Epoll机制

之前写过几篇Input系统相关的分析,但是比较零散,本篇来时准备基于Android 11代码看一下Android Input子系统的大概流程,首先来学习下Linux下的INotify与Epoll机制,这两个机制主要是对Input子系统下的文件节点的增删和文件节点发生的事件进行监听。INotify机制INotify是Linux提供给用户态监听内核文件系统变化的机制,可以监听文件/目录的增删等。INotify的用法很简单,首先需要调用如下代码创建一个文件描述符:int inotifyfd = inoti

2020-09-28 15:09:15 1655 2

原创 C++11/C++14学习(2)

1.=default,=delete【=default】C++类中如果自己没有定义构造函数,编译器便会给一个默认构造函数,但是如果自己已经定义了则不会有默认构造函数:如果我们想编译器能够给出默认构造函数则可以使用=default关键字:=default关键字只能用在构造函数,祈构函数,拷贝/移动构造函数中,但是对于已经主动声明了的拷贝/移动/祈构函数是不能使用=default的,因为拷贝/移动/祈构函数不能重载,对于这样使用就会报错:再来看看【=delete】用法=delete意为删除某

2020-09-20 20:28:01 254

原创 C++11/C++14学习(1)

1.统一初始化引入对数组,容器的全新初始化方式:int main(){ int arr[]{ 1,2,3 }; vector<int> v{ 1,2,3,4 }; map<int, string> m{ {1,"a"},{2,"b"} }; string str{ "hello" }; int* p = new int[5]{ 1,2,3,4,5 };}2.类型推导在传统 C 和 C++中,参数的类型都必须明确定义,C++11 引入了 auto 和 d

2020-09-10 22:40:49 509 1

原创 AndroidQ 图形系统(11)UI刷新,SurfaceFlinger,Vsync机制总结

Android4.x版本对UI显示系统进行了重构,引入了三个重要的东西VSYNC、Triple Buffer 和 Choreographer,目的是为UI绘制提供一个稳定的,及时的处理时机。我们知道60HZ的屏幕刷新率是16.6ms一帧,在没有4.x版本之前没有VSYNC时CPU对UI绘制的处理是随机的,也就是View的绘制请求一发出即CPU开始机制UI的处理,那么就有可能出现如下情况:没有VSYNC在绘制第N+1帧时CPU没有及时的处理UI绘制请求,在这个屏幕刷新的后半段CPU才开始,最后导致的情

2020-08-14 15:15:33 3896 3

原创 AndroidQ 图形系统(10)SurfaceView实现原理之surface创建和绘制原理

上一篇文章说了SurfaceView默认Z-order是小于主窗口的,为了能够显示出来,需要以自身所占矩形区域在主窗口设置透明区域,这是在SurfaceView的回调onAttachedToWindow中实现的,本篇接着看SurfaceView另一个回调onWindowVisibilityChanged。首先还是贴出上一篇分析的ViewRootImpl的performTraversals方法部分代码:private void performTraversals() { final View host

2020-07-04 14:45:26 4059 12

原创 AndroidQ 图形系统(9)SurfaceView实现原理之设置透明区域

SurfaceView概述SurfaceView是一种特殊的View,它可以并且应该在子线程进行UI绘制,它具有独立于应用程序之外的surface,主要用来处理复杂,耗时的UI绘制,如视频播放,camera预览,游戏等,SurfaceView的默认Z-order低于应用程序主窗口,为APPLICATION_MEDIA_SUBLAYER = -2,可以通过setZOrderMediaOverlay或者setZOrderOnTop方法进行修改,SurfaceView采用设置透明区域的方式显示出自己,调用的方法

2020-07-01 18:05:51 2709

原创 AndroidQ 图形系统(8)SurfaceFlinger合成之Vsync处理

AndroidQ 图形系统(4)queueBuffer函数分析我们知道一块buffer被queue到buffer队列之后就会回调onFrameAvailable函数通知SurfaceFlinger进行消费:if (frameAvailableListener != nullptr) { frameAvailableListener->onFrameAvailable(item); } else if (frameReplacedListener != null

2020-06-18 17:35:09 2378 1

原创 AndroidQ 图形系统(7)GraphicBuffer内存分配与Gralloc

在前面dequeueBuffer函数说了,申请buffer时会首先从mFreeBuffers中取已经绑定了GraphicBuffer且状态为FREE的BufferSlot,如果没有则会从mFreeSlots中取还未绑定GraphicBuffer的BufferSlot,并且会设置BUFFER_NEEDS_REALLOCATION这个flag,之后就会给GraphicBuffer分配内存空间:if (returnFlags & BUFFER_NEEDS_REALLOCATION) {

2020-06-16 21:01:09 7746 2

原创 AndroidQ 图形系统(6)使用纯native API画一个窗口

本篇文章根据前面的分析来实际操作画一个窗口,使用纯native API来实现,这里的native API并非ndk,而是native层函数,需要在AOSP编译环境下进行。首先在/frameworks/native/libs/gui/目录下创建drawWindowTest测试目录,drawWindowTest目录中创建Android.bp和DrawWindowTest.cpp:Android.bp:cc_binary { name: "drawWindow", srcs: ["Draw

2020-06-15 13:43:00 4042 7

原创 AndroidQ 图形系统(5)Fence机制简介

前面分析dequeueBuffer和queueBuffer时,看到Fence都是跳过的,只知道这是一种资源同步机制,具体不了解,这两天在网上查阅了相关资料,对Fence机制有了一个大致的了解,本篇总结一下。什么是同步?java中有个synchronized关键字,被synchronized修饰的方法同一时间只允许一个线程访问,其实Fence机制也有点类似synchronized的,它的主要作用也是限制生产者消费者对同一块buffer的访问,我们想想如果没有Fence机制,那么生产者消费者模型应该这样:生

2020-06-12 11:30:17 4877

原创 AndroidQ 图形系统(4)queueBuffer函数分析

上一篇文章分析了dequeueBuffer函数的过程,本篇接着分析queueBuffer函数,当我们需要绘制图像时,调用dequeueBuffer函数获取到可用的GraphicBuffer之后就可以开始绘制了,最常见的绘制操作就是Android上层View的draw方法了,当对GraphicBuffer的绘制操作完成之后就需要调用queueBuffer函数将这块buffer放入BufferQueue队列中并通过回调通知消费者使用这块buffer。...

2020-06-10 22:04:14 6232 6

原创 AndroidQ 图形系统(3)dequeueBuffer函数分析

上一篇文章分析了生产者-消费者模型,构成此模型最重要的三个类就是生产者BufferQueueProducer,消费者BufferQueueConsumer,buffer队列BufferQueue,而buffer队列的核心就是BufferQueueCore。本篇文章来分析一下dequeueBuffer这个函数,这个函数的作用是应用程序一端请求绘制图像时,向BufferQueue中申请一块可用的GraphicBuffer,有了这个buffer就可以绘制图像数据了。在分析这个函数之前先来看看BufferQue

2020-06-05 16:22:39 8130 4

原创 AndroidQ 图形系统(2)生产者-消费者模型

上一篇文章分析了上层Window创建之后,native层会创建对应的Surface,以及SurfaceFlinger进程会创建对应Layer,所以应用层的窗口对应到SurfaceFlinger进程其实就是Layer。AndroidQ上SurfaceFlinger能够创建四种类型的Layer,BufferQueueLayer,BufferStateLayer,ColorLayer,ContainerLayer,最常用的就是BufferQueueLayer在创建BufferQueueLayer同时会创建一套

2020-06-03 12:15:01 4762

原创 AndroidQ 图形系统(1)Surface与SurfaceControl创建分析

本篇文章分析Surface和SurfaceControl的创建流程,在window通过addView添加到WMS时会创建ViewRootImpl,ViewRootImpl创建好之后Surface,SurfaceControl都作为全局变量被new了出来,但是仅仅是调用了它们无参构造函数创建了一个对象,其他什么也没做,那它们具体初始化在什么地方呢?ViewRootImpl的setView()方法中会调用requestLayout()准备进行View的测量,布局和绘制,即在收到下一个Vsync时执行perfo

2020-05-26 19:22:39 8387 2

原创 访问文件的SELinux权限添加

最近做了一个功能:设备首次驻网时,在设备指定目录创建文件,并在此文件中写入当前的时间,然后通过暗码可以读取这个时间这个功能挺简单的,唯一比较麻烦的是添加SELinux权限时的一些问题,在此记录一下。首先通过rc文件创建一个目录init.rcmkdir /data/vendor/time_code 0771 radio radio然后设备首次驻网时在此目录下创建txt文件,"/data/vendor/time_code/time_code.txt",此时SELinux权限问题就来了,如下所示:

2020-05-11 17:46:29 5211 2

原创 AndroidQ 锁屏密码验证流程之GateKeeper解析

本篇文章分析一下GateKeeper这个模块,官网对GateKeeper的描述如下:GatekeeperGatekeeper 子系统会在可信执行环境 (TEE) 中执行设备解锁图案/密码身份验证。Gatekeeper 会使用由硬件支持的密钥通过 HMAC 注册和验证密码。此外,Gatekeeper 会限制连续失败的验证尝试次数,并且必须根据指定的超时和指定的连续失败尝试次数拒绝服务请求。当用...

2020-04-29 16:38:31 5589 17

原创 AndroidQ 打通应用层到HAL层---(应用层实现)

前几篇文章陆陆续续实现了HAL,HIDL,JNI,AIDL服务,现在只差最后一步,应用层的实现我们就可以打通应用层到HAL的整个调用流程了,话不多说,上代码应用层的实现相对比较简单,在Android Studio中进行开发,写完之后拷贝到源码packages/apps下进行编译就行了,在packages/apps下创建HelloDemo目录,将开发好的文件拷贝过来,看看目录结构:很简单的一个...

2020-04-23 11:16:44 5760 21

原创 AndroidQ 打通应用层到HAL层---(JNI服务和AIDL服务实现)

前面两篇文章实现了自定义HAL和HIDL服务,本篇接着往上层实现,这篇文章要写的是JNI服务和framework层AIDL服务实现,由AIDL服务调用JNI层的服务的函数,为了提供给上层APP使用同样我们参照系统其他服务的方式来写,来到frameworks/base/services/core/jni目录下,这下面有许多JNI的服务,创建cpp文件com_android_server_am_He...

2020-04-20 20:53:15 10457 1

原创 AndroidQ 打通应用层到HAL层---(HIDL服务实现)

AndroidQ 打通应用层到HAL层—(HAL模块实现)这篇文章中我们已经实现了自己的HAL,本篇我们实现一个HIDL服务,通过这个服务来调用HAL模块的函数什么是HIDLHIDL 全称为HAL interface definition language(发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL),Android O开始引入了HIDL这个概念...

2020-04-16 20:50:04 17040 24

Android 12 ncm

Android 12 ncm

2024-01-29

atrace抓取脚本工具

atrace抓取脚本工具

2023-10-31

RRO.diff.zip

RRO.diff.zip

2022-01-14

ResourcesArscDemo-master.zip

resources.arsc解析工具Demo,来源https://www.jianshu.com/p/93a38bebeaff

2021-07-22

空空如也

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

TA关注的人

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