自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 资源 (6)
  • 收藏
  • 关注

原创 Android Binder 详解(6) Binder 客户端的创建

本文详细解析了Android系统中SurfaceComposerClient创建mComposerService的完整流程。从获取ServiceManager开始,通过waitForService获取SurfaceFlinger的Binder句柄,创建底层通信管道BpBinder,最后通过interface_cast和宏机制转换为业务层客户端BpSurfaceComposer。整个过程展现了Binder通信的分层架构:BpBinder负责底层驱动交互,BpSurfaceComposer封装业务逻辑。关键点包

2026-01-07 17:21:33 679

原创 Android Binder详解【5】 ServiceManager

本文深入解析了Android系统中ServiceManager(SM)的核心机制。作为Binder通信的枢纽,SM采用极简设计:单线程+Looper模式处理请求,摒弃Binder线程池,通过双FD监听机制(Binder驱动FD和定时器FD)实现高效服务管理。文章详细剖析了SM的启动流程、驱动事件处理、客户端状态检测等核心功能,并以SurfaceFlinger注册为例,完整展示了从客户端请求到服务注册的Binder通信链路。SM作为Binder上下文管理器(固定句柄0)和系统服务注册表,其轻量高效的设计保障了

2026-01-07 11:44:01 1143

原创 Android Binder 详解(4) Binder 线程池

摘要:Binder线程池是Android跨进程通信(IPC)的核心调度组件,采用"主线程常驻+普通线程动态扩容"的设计模式。主线程(BC_ENTER_LOOPER)作为通信兜底保障永不退出,普通线程(BC_REGISTER_LOOPER)按需创建并在空闲时自动回收。线程池通过ProcessState统一管理,IPCThreadState处理驱动事件(如BR_TRANSACTION),PoolThread作为线程载体执行通信循环。Binder驱动通过BR_SPAWN_LOOPER命令触发线

2026-01-06 11:49:05 946

原创 Android 12 BLASTBufferQueue 深度分析

Android 12推出的BLASTBufferQueue重构了传统图形渲染架构,将BufferQueue管理权从SurfaceFlinger(SF)下移到应用进程。这一改进解决了多窗口和高刷新率场景下的三大痛点:减少90%以上的IPC通信开销,降低SF负载,提升应用对缓冲区的自主管理能力。核心设计是应用进程直接管理BufferQueue,SF仅作为轻量级消费者处理合成,同时保持Gralloc模块的实际内存分配机制。该架构使120Hz场景下渲染延迟降低1-3ms,SF负载减少30%,并支持应用根据需求灵活配

2025-12-26 17:08:54 870

原创 Android DMA-BUF HEAP

Android DMA-BUFHEAP 是替代ION MemoryManager的现代内存分配机制,基于Linux标准DMA-BUF框架扩展而来。它通过/dev/dma_heap/目录下的多个设备节点提供标准化内存分配,相比ION具有更高安全性(支持SELinux细粒度控制)、更简洁接口和更好内核兼容性(符合GKI规范)。在Android14+中已成为首选,被图形合成器、相机服务等核心组件采用,同时保留ION作为兼容层。DMA-BUFHEAP通过分类型内存池设计,实现了更透明、更安全的内存管理架构。

2025-12-26 15:53:04 930

原创 Android ION Memory Manager 深度分析

ION是Android内核驱动框架,用于实现不同硬件单元(CPU/GPU/DSP等)之间的零拷贝数据共享。其核心架构包括Heap内存池、Client客户端和Handle/FD句柄机制,通过物理内存直接映射实现跨进程共享。ION支持Cache一致性和引用计数管理,解决了多媒体场景下的内存共享瓶颈。虽然正逐步被Linux标准DMA-BUFHEAP取代,但ION仍是理解Android图形系统和性能优化的关键基础技术。

2025-12-26 15:40:06 1105

原创 Android KGI (Generic Kernel Image)

GKI(通用内核映像)就是 Google 为了集权而推出的标准。它把内核分为“Google 管的通用部分”和“厂商管的硬件驱动部分”。通过这种解耦,Google 成功将 Android 内核从“碎片化”的泥潭中拉了出来,实现了类似 iOS 的统一内核维护模式,让 Android 系统更安全、更新更及时。

2025-12-26 15:19:17 1173

原创 Android 12 中 App 与 SurfaceFlinger(SF)的 Vsync 通信机制

本文解析了Android 12中App与SurfaceFlinger(SF)之间的Vsync通信机制。核心采用双通道设计:Binder通道用于App向SF发起Vsync请求,BitTube本地套接字实现SF向App推送Vsync事件。App侧通过Choreographer(绑定主线程Looper)初始化连接,Native层建立Binder和BitTube通道;SF侧由EventThread管理所有连接,通过EventThreadConnection维护单个App的通信。这种设计实现了高效的跨进程Vsync同

2025-12-10 17:56:59 785

原创 Android12 Vsync深度解析VSyncPredictor

本文深入解析Android 12中VSync预测机制的核心原理。VSync作为屏幕刷新的硬件时钟信号,其精准预测对渲染调度至关重要。系统通过获取PresentFence(帧显示完成的硬件信号)时间戳作为VSync时间样本,基于"一帧显示完成即下一帧VSync开始"的时序逻辑,构建VSyncPredictor预测模型。该模型采用线性回归算法,通过历史时间戳拟合实际VSync周期,克服硬件时钟漂移问题,实现未来VSync时间的精准预测。这一设计实现了理论周期到硬件实际时序的关键转变,为And

2025-12-10 11:41:44 838

原创 Android 12 Choreographer 深度解析

App触发帧需求 → Choreographer.postCallback → FrameDisplayEventReceiver.scheduleVsync()→ SF EventThread注册VSync请求 → HWC生成VSync → SF EventThread分发VSync→ App侧DisplayEventReceiver接收VSync → FrameHandler发送MSG_DO_FRAME。

2025-12-09 16:28:29 806

原创 Andoird Display (systrace)

2025-12-04 11:37:06 145

原创 Anroid Perfetto

是 Android 系统中调用Perfetto追踪工具的核心方式,Perfetto 是 Google 推出的高性能系统追踪工具(替代旧版 Systrace),支持追踪 CPU、内存、GPU、进程 / 线程调度、网络、系统调用、UI 渲染等全维度系统行为,适配 Android 10+(低版本需手动部署二进制文件)。

2025-12-01 11:30:11 512

原创 Android SF postComposition()

同步与时序:跟踪合成 / 呈现栅栏,更新帧时间线;资源管理:释放图层缓冲区、清理渲染资源、复用纹理;统计与上报:收集帧率、耗时、HDR 状态等数据;回调与同步:分发事务回调、同步调度器 VSync。该函数的实现直接决定了 Android 系统的显示稳定性、性能统计的准确性,是理解 SurfaceFlinger 合成流程的关键入口。

2025-11-28 16:41:08 931

原创 Android Vulkan 开启VK_GOOGLE_DISPLAY_TIMING 后,一个vsync 会释放两个imageBuffer现象分析

android vulkan 程序,当开启VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME 功能, 跑在android12 上, swapchain 用的是三缓冲,所有当sufaceflinger 一个vsync 来的时候, 图像缓冲中有两个app已经渲染好的的图像, 同一个vsync 中会释放两个buffer(如上图)所有在后面提交buffer的时候,释放了第一个buffer(在第二个setBuffer 中,释放了前一个buffer)

2025-11-28 16:26:22 389

原创 Android 中的UID和 PID

PID 是进程的 “临时运行编号”,用于系统调度和进程管理;UID 是应用的 “身份身份证”,是 Android 沙箱和权限控制的核心;理解两者的区别,是掌握 Android 多进程、权限、进程间通信的基础。

2025-11-27 09:34:14 699

原创 Android Binder 详解(3)

ProcessState 和 IPCThreadState 是 Binder 通信的 “底层支撑框架”—— 它们隐藏了驱动交互的复杂细节(如 open、mmap、ioctl),让 BBinder 和 BpBinder 只需专注于 “业务逻辑实现” 和 “请求转发”,无需关心底层资源管理和线程调度。理解这两个类的核心作用,就能明白 Binder 通信是如何 “跨进程”“跨线程” 高效协作的,也能更好地排查 Binder 相关的问题(如线程池阻塞、驱动 fd 泄露、死亡通知未触发等)。

2025-11-26 15:47:57 708

原创 Android Binder 详解(2)

客户端通过 BpBinder(代理) 向驱动发请求,驱动通过 handle 定位 到服务端的 BBinder(真实实现),BBinder 处理后通过驱动返回结果 —— 整个过程由 IBinder 接口 统一规范,驱动是打通进程隔离的核心桥梁。

2025-11-26 15:20:56 910

原创 Android Binder 详解

Binder 是 Android 系统中核心的跨进程通信(IPC)机制,同时也是一套完整的 “通信框架”—— 它不仅解决了进程间隔离的通信问题,还提供了安全校验、服务管理、易用性封装等能力,是 Android 组件(如 Activity、Service、ContentProvider)跨进程协作的基础。

2025-11-26 11:43:20 1524

原创 Vulkan 顶点数据流程与核心概念解析

Vulkan 顶点数据处理的核心是「数据上传 + 格式解析」:CPU 负责准备原始数据并拷贝到 GPU 顶点缓冲区;管线通过「绑定描述 + 属性描述」告诉 GPU 数据格式;命令缓冲通过「绑定缓冲区 + 绘制命令」触发 GPU 执行。

2025-11-14 10:04:40 797

原创 vulkan shader 中的layout binding 和 location

location用于指定顶点着色器(VS)输入变量或片段着色器(FS)输出变量的 “位置索引”,本质是给变量分配一个唯一的整数 ID,让 Vulkan 能找到对应的 CPU 端数据。Vulkan 是 “显式布局” API,不允许隐式推导变量位置,因此顶点输入、片段输出必须用location显式指定。binding用于指定资源(UBO/SSBO、纹理、采样器等)在Descriptor Set(描述符集)中的 “绑定点索引”。

2025-11-11 10:51:37 802

原创 Vulkan VkAttachmentDescription 与 VkAttachmentReference 详解

/ 固定为 VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION// 扩展指针(通常为 NULL)// 附件标志(极少使用,默认 0)// 附件像素格式(核心!必须与帧缓冲图像格式一致)// 多重采样样本数(与管线、帧缓冲一致)// 渲染前的加载操作(如何处理旧数据)// 渲染后的存储操作(如何处理新数据)// 模板缓冲加载操作(仅深度模板附件有效)// 模板缓冲存储操作(仅深度模板附件有效)// RenderPass 开始前的附件布局。

2025-11-10 13:53:04 859

原创 理解 Vulkan 的核心优势

维度传统 API(OpenGL/DirectX 11)Vulkan(DirectX 12 类似)CPU 开销高(隐式状态验证、单线程限制)低(显式控制、多线程录制)CPU 多核利用率低(单线程串行)高(多线程并行录制命令缓冲)GPU 调度单队列串行,硬件利用率低多队列并行,充分利用渲染 / 计算 / 传输单元GPU 同步驱动隐式同步,过度等待显式同步,仅必要时阻塞CPU-GPU 协同串行阻塞,频繁等待并行流水线,无阻塞内存管理驱动隐式分配,拷贝开销高。

2025-11-07 09:03:58 991

原创 Vulkan Descriptor(描述符) 和 DescriptorPool(描述符池)

Descriptor:Shader 访问资源的 “中介”,存储资源的引用和访问规则;DescriptorPool:描述符的 “预分配容器”,优化资源管理性能;

2025-11-06 08:45:12 1178

原创 Vulkan 中 VkSwapchainKHR、VkImage、VkImageView、VkFramebuffer 的关系

「交换链(VkSwapchainKHR)管理显示用的画布(VkImage)→ 图像视图(VkImageView)解读画布 → 帧缓冲(VkFramebuffer)组合画布和辅助工具 → 渲染管线将像素画到帧缓冲 → 交换链切换画布显示」。

2025-11-06 08:25:34 803

原创 vulkan 中的Semaphore(信号量) 和Fence(围栏)

Semaphore:GPU 内部的 “交通灯”,管 GPU 自己的命令顺序,CPU 插不上手。Fence:CPU 与 GPU 之间的 “对讲机”,管两者的节奏对齐,CPU 可主动呼叫等待。若需要GPU 队列间 / 命令间依赖→ 用 Semaphore;若需要CPU 等待 GPU 完成或GPU 等待 CPU 信号→ 用 Fence。这两个原语是 Vulkan 同步的基石,正确使用才能避免画面撕裂、资源泄漏、程序崩溃等问题。

2025-11-05 14:22:40 932

原创 Vulkan 中「缓冲区、GPU 内存、绑定」的核心逻辑「电影院放映电影」

用「电影院放映电影」的场景来类比,能完美对应三者的关系 —— 这个场景里的每个角色、每个步骤,都能精准映射 Vulkan 中「缓冲区、GPU 内存、绑定」的核心逻辑

2025-11-05 09:40:17 618

原创 Vulkan 颜色缓冲和深度缓冲的理解

颜色缓冲:管 “每个像素最终显示什么颜色”,是 “结果记录本”;深度缓冲:管 “哪个物体的颜色该被保留”,是 “优先级裁判”;两者配合,才能让画面正确呈现 “近的物体挡住远的物体” 的真实效果,避免出现 “后面的东西跑到前面来” 的穿帮画面。

2025-10-31 16:04:09 362

原创 vulkan 概念的理解(厨房做菜的场景)

你先走进厨房(实例),选一个燃气灶(物理设备),通过旋钮(逻辑设备)控制它的炒菜区(图形队列族),提前写好番茄炒蛋的步骤清单(命令缓冲)和准备清单(渲染通道),按标准流程(图形管线)一步步做,做好后通过传菜窗口(交换链)给客人 —— 这就是 Vulkan 渲染一帧画面的全过程。每个概念分工明确,就像厨房的每个环节都有专人负责,最终高效做出一道好菜(渲染出一帧画面)。

2025-10-31 15:59:12 731

原创 射线与圆柱的交点

几何法和迭代法求射线与圆柱的交点

2022-11-04 14:02:50 1403 2

原创 求射线与平面的交点,向量点乘和叉乘

opengl

2022-09-21 18:17:25 1132

原创 Android FTP server 用org.apache.ftpserver实现

FtpService.javapublic class FtpService extends Service { private FtpServer server; private static String rootPath; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public vo...

2020-06-24 15:21:08 1553 1

原创 Android C 语言可执行文件 测试

创建一个Native c++ 工程:在cpp 目录下添加编写自己的.c#include <stdio.h>int main() { printf("c executable project\n"); printf("hello world ! run form C\n"); return 1;}在CmakeLists.txt ...

2020-05-07 16:04:21 343

原创 Android jpeglib 和 pnglib

Androidstudio 编译jpeglib 和 pnglig的 so的简单记录编译多个SO: 用ADD_SUBDIRECTORY 添加多个目录, 生产多个SOmylibrary/CMakeLists.txt png 和 jpeg 目录下有源码和CMakeLists.txt 生产SO,cmake_minimum_required(VERSION 3.4.1)...

2020-03-17 16:45:00 716

原创 Android OpenGL 文本显示 LabelMaker

AndroidApiDemos 里有个LabelMaker, 封装了OpenGl 的text lables的生产和显示,用起来非常方便:LabelMaker:OpenGL text labels通过创建Bitmap、将所有text labels绘制到Bitmap、将Bitmap转换为alpha texture 以及使用gldrawtexios绘制部分texture来实现。Ex...

2019-04-18 10:59:27 1913

原创 Android 自带的libjpeg 实现jpeg编码 buffer to buffer

extern "C"{#include <jpeglib.h>}static void init_buffer(struct jpeg_compress_struct * c) {}static boolean empty_buffer(struct jpeg_compress_struct * compress_struct) { return TRUE...

2019-04-02 16:47:49 590

原创 Android 解魔方apk 和源码

App 截图左边是opengl的3D魔方, 可以拖动旋转显示,右边是魔方6面展开图显示上,下, 左,右,前,后可以点击操作魔方点击“搜索” 会开始搜索当前魔方解法然后点击“执行”, 会开始解魔方, 点击“下一步”, 一步步显示解魔方的过程。点击“输入魔方” 可以编辑魔方, 可以手动输入魔方, 后点击“USE CAMERA” 用camera 拍摄输入...

2019-03-12 16:08:08 1238 2

原创 android AndroidStudio 生成aar包, 和aar 包的导入

生成aar 包:1 File-&gt; New-&gt; New Module2 New Module 选择 Android Library、、如我建得slamecontrolaar 包的导入:1 把aar包copy 到 app\libs\ 下:2 build.gradle 加入:repositories{ flatDir ...

2019-03-11 16:48:02 359

原创 Andorid 简单的socket 模板

Server端:1 通过handler 与activity 通信。2 启动一个thread, 等待client 连接和接收数据。public class SocketServer implements Runnable{ private static final String TAG = "SocketServer"; private Context mConte...

2019-03-08 19:03:50 233

原创 android SurfaceView 获取surface native object 传给C++ 调用 (java 反射)

SurfaceView 获取SurfacemSurface = mSurfaceView.getHolder().getSurface();try {Field field = Surface.class.getDeclaredField("mNativeObject");field.setAccessible(true);long nativeSurfaceOb...

2019-03-08 14:19:05 2784 1

原创 android 用沉浸式隐藏status bar

沉浸式, 隐藏status bar:adb shell settings put global policy_control immersive.status=*隐藏navigation bar:adb shell settings put global policy_control immersive.navigation=* 禁止statusbar 下拉:disable...

2019-01-04 11:11:28 1033

android 解魔方apk 源码

android 自动解魔方apk, 魔方可以通过camera 扫描进去, 可以自动搜索魔方的解法。(里面有 open gl的3d魔方显示解魔方的步骤)

2019-03-08

Android FTP server 用org.apache.ftpserver实现

Android FTP server 用org.apache.ftpserver实现, 可以设置端口号, 匿名或用户名密码 https://blog.csdn.net/weixin_42065195/article/details/106944004

2020-06-24

AppInstall.rar

把其它app 放在assets/ 下面打包, 通过系统调用安装这个app //申请安装未知应用权限 Uri packageURI = Uri.parse("package:" + mContext.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI); startActivityForResult(intent, 401); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //调用系统api安装app Uri uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", apkFile); intent.setDataAndType(uri, "application/vnd.android.package-archive"); Log.i(TAG,"btnAppInstallClick uri="+uri);

2020-01-08

NotificationListener.rar

通过NotificationListenerService 监听notification public void onNotificationPosted(StatusBarNotification sbn) 权限判断,申请: if(!NotificationManagerCompat.getEnabledListenerPackages(this).contains(getPackageName())) { startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")); }

2019-09-19

JepgAndPngDemo.rar

https://blog.csdn.net/weixin_42065195/article/details/104922538 android libjpeb.so he libpng.so 简单测试

2020-03-17

CProject.rar

通过studio CmakeLists.txt add_executable(hello hello.c) 编译hello.c build 完后, 在CProject\app\build\intermediates\cmake\debug\obj\arm64-v8a 可以找到hello的可执行文件 通过adb push 到手机里, 修改权限后可以运行: adb push hello /data/local/tmp/ adb shell cd /data/local/tmp chmod 777 hello ./hello

2020-05-07

空空如也

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

TA关注的人

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