- 博客(85)
- 资源 (1)
- 收藏
- 关注

原创 彻底搞明白 Activity 与 Window 与 View 之间的关系
view的绘制是在Android系统的Vsync信号发出来之后才开始真正的绘制,如果没有在,也就是说绘制一帧图像需要的时间是16.67ms,因为Vsync信号是底层软件/硬件发出来的,间隔16.67ms发出一次Vsync信号,如果在这个时间之内么有绘制完成就会在用户视产生卡顿/掉帧。只有当view测量—布局完成以后才可以,在activity的onResume中首次是获取不到的,还没有测量完成。其中PhoneWindow是在activity的attach中创建的,持有decorView。
2025-02-28 19:17:53
320

原创 Android系统service_manage如果添加服务
binder驱动binder_thread_write收到cmd=BC_TRANSACTION_SG然后调用接下来在binder_translate_binder做了最重要的三个事情1)创建binder_node2)创建binder_ref3)binder_node的desc+1赋值给binder_ref的handle。
2025-02-27 12:33:04
327
原创 Android运行时ART加载类和方法的过程分析
既然ART运行时执行的都是翻译DEX字节码后得到的本地机器指令了,为什么还需要在OAT文件中包含DEX文件,并且将它加载到内存去呢?这是因为ART运行时提供了Java虚拟机接口,而要实现Java虚拟机接口不得不依赖于DEX文件ART运行时查找类方法的本地机器指令的过程为了方便描述,我们将DEX文件中描述的类和方法称为DEX类(Dex Class)和DEX方法(Dex Method),而将在OAT文件中描述的类和方法称为OAT类(Oat Class)和OAT方法(Oat Method)。
2025-05-04 22:04:32
1204
原创 Android运行时ART加载OAT文件的过程
OAT文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容。这使得我们无需重新编译原有的APK就可以让它正常地在ART里面运行,也就是我们不需要改变原来的APK编程接口为了更好了弄明白oat文件的格式,目前还需要看下elf 文件格式oat文件格式。
2025-05-04 20:52:13
824
原创 Android ART运行时无缝替换Dalvik虚拟机的过程分析
Android 4.4发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题。老罗不打算分析ART的实现原理,只是很有兴趣知道ART是如何无缝替换掉原来的Dalvik虚拟机的。毕竟在原来的系统中,大量的代码都是运行在Dalvik虚拟机里面的。开始觉得这个替换工作是挺复杂的,但是分析了相关代码之后,发现思路是很清晰的。本文就详细分析这个无缝的替换过程。我们知道,Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。
2025-05-04 15:34:34
644
原创 Dalvik虚拟机和ART虚拟机
Dalvik虚拟机与Java虚拟机共享有差不多的特性,例如,它们都是解释执行,并且支持即时编译(JIT)、垃圾收集(GC)、Java本地方法调用(JNI)和Java远程调试协议(JDWP)等,差别在于两者执行的指令集是不一样的,并且前者的指令集是基本寄存器的,而后者的指令集是基于堆栈的。Dalvik虚拟机起源于Apache Harmony项目,后者是由Apache软件基金会主导的,目标是实现一个独立的、兼容JDK 5的虚拟机,并根据Apache License v2发布。
2025-05-04 14:36:35
805
原创 Android如何通过aspectj打造一个无侵入式动态权限申请框架
它的作用就是劫持被注释的方法的执行。如果没有了解过Aspect的话,AOP面向切面编程,大家应该听说过,它可以用来配置事务、做日志、权限验证、在用户请求时做一些处理等等。这样@Permission就被切点劫持了,然后方法就会跑到切面aProceedingJoinPoint。然后获取上下文Context,把权限请求交给一个透明的Activity来做。做完之后判断结果,用户是同意了还是拒绝了还是曲线了。在Activity或者fragment中,写在几个方法写一些注释,用来表示权限。
2025-04-22 18:56:10
544
原创 android系统使用FFmpeng集成OpenSL音频录制和播放
Android 环境下音频播放通常有两种方式—— AudioTrack 和 OpenSLES。AudioTrack 本身是Java实现,另外一种实现方式就是OpenSL ES 播放音频。FFmpeg不能够操作Android的硬件设备,所以要在Android系统上面播放音频的话需要另找办法。
2025-04-17 16:16:46
531
1
原创 Android利用MediaCodec和GLSurfaceView录制视频
配置egl版本和设置自定义渲染器,以及渲染模式/*** 设置egl版本*//*** 设置渲染器*//*** 设置按需渲染,当我们调用requestRender()的时候就会调用GlThread回调一次onDrawFrame()*///准备好摄像头绘制的画布//通过open gl创建一个纹理id//设置有一帧新的数据到来的时候,回调监听//必须要在GlThread里面创建着色器程序/*** 画布发生改变*/@Override/*** 画画。
2025-04-17 15:24:18
827
原创 Android使用OpenGL和MediaCodec录制
针对手机、PDA和游戏主机等嵌入式设备而设计的OpenGL API 子集。继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。管理Surface与EGL 允许自定义渲染器(render)。让渲染器在独立的线程里运作,和UI线程分离。支持按需渲染(on-demand)和连续渲染(continuous)。
2025-04-05 23:30:58
1001
原创 android Kotlin原理
1,内部线程池管理线程使用到了自旋和挂起2,传统的线程之所以重,是因为线程的执行,等待唤醒需要操作系统来完成3,协程之所以相对于传统的线程轻量级,是因为协程是通过协程调度器来完成线程的唤醒,调度,执行的,区别就在哪里4,协程是基于线程的,没有线程就没有协程,协程最终是通过开启线程,thread,调用thread的start方法完成协程的调度的协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码。协程。
2025-03-24 12:37:41
1001
原创 彻底搞明白ViewModel
ViewModel是JetPack生命周期管理库中的一个组件。它可以提供并且管理数据,可感知生命周期,同时不会随着配置(eg:屏幕旋转导致的Activity重新创建)变更而改变。使用它可以方便的将UI界面和数据逻辑剥离开来,从而达到 UI只负责显示数据和处理用户操作,ViewModel负责提供、管理数据以及通讯。作为数据持有和管理者(eg:处理网络请求);Fragment之间的通信;ViewModel代替加载器(eg:CursorLoader)。
2025-03-05 00:47:23
479
原创 彻底搞明白PMS原理
在 Android 系统中,有着四大组件ActivityServiceBroadcast,然而,在我们和这四大组件进行交互的时候,一定有着一个系统服务在后台默默的运行。这个服务就是 PackageManagerService(后续简称 PMS)。当我们在应用中启动一个 Activity 或者 Service 时,需要 PMS 进行查找,当我们安装新的应用时,PMS 会进行安装,解析,优化等等。可以说,PMS 是我们 Android 中最重要的几个服务之一。
2025-03-04 14:15:30
869
原创 Android系统渲染原理
Layer内容更新由Layer的成员变量mSurfaceFlingerCounsumer->updateTexImage完成(GLCounsumer的默认updateTexImage是需要绑定纹理的),SurfaceFlingerCounsumer覆盖了该函数,其只是通过acquireBuffer更新一下buffer,具体绑定纹理是在OnDraw完成的,对于非GPU合成的Layer来说OnDraw不会调用也就不会绑定纹理,其在SurfaceFlinger中的工作量相对是很少的。
2025-03-04 01:08:05
341
原创 Android系统_SurfaceFlinger的启动流程
在Android渲染中扮演着非常重要的作用。它既要为应用层提供可绘制的GraphicBuffer缓冲区,也要对生成的 Layer进行排序、合成,最终通过本地化窗口调用内核缓冲区的post()接口显示到屏幕上。init 进程fork出来SurfaceFlinger进程后,会执行 main_surfaceflinger.cpp 的 main()方法= 0) {return 0;continue;continue;
2025-03-03 13:39:08
752
原创 Android系统_ SurfaceComposerClient解析
1)根据SurfaceComposerClient对象拿到surface。客户端app拿到SurfaceComposerClient对象。3)初始化elg环境,然后交给eglGetDisplay显示。2)给surface设置setLayer。
2025-03-03 11:34:59
158
原创 Android系统Native如果找对应的代理和服务对象
替换方法,把所有的INTERFACE替换成ISurfaceComposer,遇到有##替换成SurfaceComposer。比如BnInterface<ISurfaceComposer>,然后找到合心的定义接口的地方。Android系统Native如果找对应的代理BP_xxxx和Bn_xxx服务对象。IInterface.h是一个c++的模版类,在使用的时候都会传进来一个范性对象。举例:把INTERFACE替换成ISurfaceComposer,
2025-03-03 10:16:00
262
原创 彻底搞明白Android WMS窗口相关流程
2)一个activity对应一个PhoneWindow,一个PhoneWindow对应一个ViewRootImpl,一个PhoneWindow唯一对应一个WindowState,一个activity里面有多个view,一个activity对应一个surface,1)一个进程只有一个wms,一个session,但是会多个activity,其中Choreographer是线程单实例的,对于app 绘制面来说就是就是单实例的。3)一个surface对应一个layer。创建SF在WMS进程中代理对象。
2025-03-01 23:53:54
954
原创 让你彻底搞明白AIDL里面的IN,OUT,INOUT,ONEWAY
1)in 表示数据只能由客户端流向服务端,服务端会获取到客户端完整的数据,但客户端不会同步服务端你对该对象的修改,不写的话,默认的 tag 就是 in,如果你强行在服务端修改数据,那么客户端也是拿不到的,是半双工的,这么对比的学习你就会明白很多,具体看后面的代码2)out 表示数据只能由服务端流向客户端,从服务端端接受该对象不为空,但字段内容为空,服务端修改对象后,binder 远程调用返回后,客户端会收到修改后的对象。
2025-02-26 22:24:03
476
原创 android系统常用的抓取系统日志命令
adb shell logcat -b events | grep -ie "关键log1" -ie "关键log2"> log.txt。# 抓取普通的andorid log。# 仅抓取events log。# 抓取所有类型log。
2025-02-26 16:41:19
160
原创 Android系统使用ftrace查看Binder驱动日志
这一步很重要,不然在使用cat /sys/kernel/debug/tracing/trace命令的时候看不到具体的调用过程。
2025-02-26 14:07:10
583
原创 android系统_Binder驱动原理
其实和网络协议tcp/ip模型一样,这里需要重点注意的是C/S模型中的Client和Server是两个动态的概念,也就是说在发起请求的一侧是Client端,响应请求的一侧是Server端,可以这么判断,也可以通过另一种方式。//这里是最核心最核心最核心最核心最核心的地方,get_vm_area是一个Linux的系统函数,用来获取内核的虚拟地址空间。//这里是最核心最核心最核心最核心最核心的地方,新进程的虚拟地址空间和内核的虚拟地址空间在物理内存建立映射。
2025-02-25 00:21:04
460
原创 android系统_Binder系列教程
目录一,Binder驱动二,Binder通信协议三,Framework层Native侧Binder四,Framework层Java侧Binder五,Framework层JNI侧Binder六,Binder整体架构图
2025-02-24 11:03:44
198
原创 android8.1.0系统_ActivityRecord/TaskRecord/ActivityStack/ActivityStackSupervisor原理
文章深入介绍了 Android 系统中 ActivityManagerService 里的 ActivityRecord、TaskRecord、ActivityStack 三者的作用及关系。ActivityRecord 是 Activity 在 AMS 中的代表,伴随 Activity 启动与终止。TaskRecord 即任务栈,是一组 Activity 的集合,有多种启动模式和切换方式。ActivityStack 用于管理 TaskRecord,系统中有 Launcher 和非 Launcher 的 Ac
2025-02-24 00:24:10
1110
原创 android系统fork原理
这个就涉及到fork本身的功能了,它的作用是克隆进程,也就是将原先的一个进程再克隆出一个来,克隆出的这个进程就是原进程的子进程,这个子进程和其他的进程没有什么区别,同样拥有自己的独立的地址空间。不同的是子进程是在fork返回之后才开始执行的,就像一把叉子一样,执行fork之后,父子进程就分道扬镳了,所以fork这个名字就很形象,叉子的意思。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
2025-02-22 11:11:53
363
原创 android系统_模拟ZygoteServer写一个socket通信
Received from ZygoteServer: ZygoteServer received: 测试代码。Received from ZygoteServer: ZygoteServer received: 你好。Enter message to send to ZygoteServer: 测试代码。Enter message to send to ZygoteServer: 你好。
2025-02-21 20:41:52
367
原创 android系统SystemServer进程启动流程分析
管理的是普通的服务,只能在同一个进程之间使用的服务,不具备进程之间通信能力的服务,各个系统service在启动的过程中都会调用LocalServices.addService()把自己的local service注册到LocalServices中,比如AMS,WMS,PMS。所以通过这里可以看到binder之前通信的时候最大的传递数据大小是1M-8K(同步),异步场景下是减半,binder驱动最多可以创建的线程数是15个,不包含主线程,包含的话是16个,上面这部分牵扯到binder驱动源码的分析,
2025-02-21 17:23:09
1134
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人