自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

博客

研究明白

  • 博客(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系统增加服务流程

需要结合这篇文章看起来会更好。

2025-02-27 01:22:10 176

原创 Binder通信协议

目录一,整体架构二,Binder通信协议

2025-02-27 00:06:38 226

原创 Framework层JNI侧Binder

Framework层JNI侧Binder

2025-02-25 00:26:02 138

原创 Framework层Java侧Binder

Framework层Java侧Binder

2025-02-25 00:24:51 114

原创 Binder通信协议

Binder通信协议

2025-02-25 00:24:09 109

原创 Framework层Native侧Binder

Framework层Native侧Binder

2025-02-25 00:23:22 124

原创 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渲染视频

【代码】Android使用OpenGL和MediaCodec渲染视频。

2025-04-05 23:39:31 496

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

原创 android如何实现OOM治理

可以看到通过JVMTI技术可以快速的定位到OOM位置。二,开启JVMTI监控呢能力。

2025-03-08 12:05:28 418

原创 彻底搞明白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系统_Surface绘制流程

【代码】Android系统_Surface绘制流程。

2025-03-03 23:03:24 289

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

原创 进程之间通信框架对比

binder通信一次内存copy安全,高效,灵活。

2025-02-24 11:35:04 297

原创 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系统_app冷启动流程分析

从上帝视角来看APP冷启动过程

2025-02-23 18:01:52 1056

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

原创 android系统启动流程分析

android 系统启动流程,android init启动流程

2025-02-21 10:15:08 706

原创 android_binder源码分析之_binder驱动使用服务

一,binder驱动源码分析,使用服务过程。

2024-05-26 23:19:34 285

IDEA详细配置教程,

很好的IEDA使用教程,欢迎大家使用,很好的IEDA使用教程,欢迎大家使用

2014-08-01

空空如也

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

TA关注的人

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