- 博客(60)
- 收藏
- 关注
原创 Android WindowManagerService
WindowManagerService(WMS)作为Android系统的核心服务之一,是GUI子系统的中枢神经。窗口生命周期管理:管理Activity/Dialog/Toast等窗口的创建、销毁流程窗口层级计算:基于窗口类型、Flag等属性计算Z-order输入事件分发:协调触摸事件的分发优先级动画调度:管理窗口过渡动画的执行时序多屏协同:支持多显示器环境下的窗口布局| ^v || |v |
2025-04-26 15:33:50
701
原创 android framework开发的技能要求
作为Android Framework开发工程师,需要具备深入的系统底层理解能力和对Android架构的全面认知。
2025-04-20 22:10:21
1264
原创 标准的JNI (Java Native Interface) 加载函数 JNI_OnLoad
在 Android Native 开发中,JNI_OnLoad是动态注册本地方法的标准入口点。通过获取JNIEnv指针,需指定 JNI 版本(通常为将JavaVM实例保存到全局变量中,以便在其他线程中通过获取JNIEnv。使用FindClass找到需要注册本地方法的 Java 类(需全限定类名,如调用将数组中的方法动态注册到目标类。每个native需返回与GetEnv中指定的版本一致的 JNI 版本号(如必须与 Java 方法的参数和返回值类型完全匹配。
2025-04-20 22:07:22
1098
原创 Android音视频开发
Android音视频框架是一个深度集成的系统工程,从应用层的API调用到底层HAL的硬件加速,每个层级都需要精确的时序控制和资源管理。理解这个生态系统的运作机制,是开发高质量多媒体应用的关键。
2025-04-20 22:04:09
1772
原创 Android 图形缓冲区变换的技术演进
在 Android 图形系统中,缓冲区变换是确保显示内容正确适配设备方向、摄像头预览和外部显示的关键技术。本文将从传统实现到现代最佳实践,全面解析 Android 图形缓冲区变换的技术演进。发展到现代的 SurfaceControl 事务体系,体现了 Android 图形系统的成熟和进化。随着 Android 图形系统的持续发展,缓冲区变换技术将继续演进,为开发者提供更强大、更高效的图形控制能力。Android 图形缓冲区变换技术从简单的。
2026-01-16 09:00:00
558
原创 Android KeyEvent按键深入解析
是Android系统中处理物理按键输入的核心类,它继承自InputEvent类,负责封装来自键盘、遥控器、游戏手柄等输入设备的按键信息。在移动设备交互中,虽然触摸屏已成为主流输入方式,但物理按键仍然在特定场景下发挥着不可替代的作用。Android的KeyEvent系统提供了强大而灵活的按键处理能力,从基本的单键检测到复杂的组合键处理,从简单的点击事件到高级的游戏控制器支持,几乎涵盖了所有物理按键交互场景。
2025-11-20 21:00:00
376
原创 Android音视频框架
从 Framework 视角看,Android 音视频是一个典型的 C/S 架构,应用作为客户端,通过 Binder 向系统核心服务(MediaServer, AudioFlinger)发起请求。的角色,是解决复杂音视频问题(如卡顿、不同步、黑屏)的关键。Java 对象通过 JNI 调用 Native 的。)就可以通过这个 Binder 接口,直接向。这是理解 Framework 交互的关键。的调用同样会通过 Binder 进入。会创建一个真正的播放器实例(如。的 Binder 对象。
2025-11-19 07:00:00
537
原创 Android 注解全面讲解
注解(Annotation)是 Java 和 Kotlin 中一种强大的元数据工具,它能够为代码提供额外的信息,而这些信息可以被编译器、开发工具或运行时环境所使用。:运行时反射会影响性能,生产环境更推荐使用注解处理器(Annotation Processing Tool, APT)在编译时生成代码(如 Butter Knife 的做法),但这更复杂。参数是正确类型的资源 ID,在编译时提供类型安全检查,避免传入错误的资源类型导致运行时崩溃。你可以创建自己的注解来解决特定于你项目的问题。
2025-11-17 20:17:34
661
1
原创 Android AIDL 的详细讲解和实践指南
服务端承诺会实现合同里规定的方法,客户端则按照合同规定的方式去调用这些方法。AIDL 是 Android 中功能最强大的 IPC 机制,它通过定义清晰的接口,允许进行同步的、并发的跨进程方法调用。在 Android 开发中,每个应用都运行在自己的进程中,形成一个安全的沙盒。它返回一个代理对象,无论服务是否在同一进程,客户端都可以用相同的方式调用接口方法。的抽象类,它是 Binder 的本地对象,我们需要继承它。这是最关键的一步,确保双方的“合同”完全一致。接口并单独创建该对象的 AIDL 文件。
2025-11-13 21:30:00
1492
原创 Android WindowManagerService 学习路线推荐
fill:#333;fill:#333;stroke:red;important;important;important;important;important;fill:red;important;important;fill:#333;2025-04-272025-04-292025-05-012025-05-032025-05-052025-05-072025-05-092025-05-112025-05-132025-05-152025-05-17Android系统架构。
2025-04-30 08:30:00
1011
原创 系统架构层面深入解析ViewRootImpl与WMS的协作
作为Android系统开发从业者,我将从系统架构层面深入解析与WMS的协作机制。这是Android窗口系统的核心链路,涉及跨进程通信、图形渲染、输入事件传递等关键技术点。
2025-04-29 09:00:00
1020
原创 运算符重载(一)(C++)
一、运算符重载C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。 运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操...
2023-01-06 16:01:11
340
1
原创 哈希表
//哈希表的代码实现#include<iostream>#include<assert.h>#define M 13using namespace std;//哈希表typedef int KeyType;typedef struct {}Record;typedef struct{ KeyType key; Record* recptr;}ElemType;struct HashNode{ ElemType data; HashNode* ne.
2020-10-20 16:28:23
170
原创 Git常用命令总结
前言git和github:git是目前世界上最先进的分布式版本控制系统(对比集中式版本控制系统SVN)。github是一个免费的代码远程托管仓库。几个概念:(1)工作区:当前存放项目代码的目录;(2)暂存区:git add把工作区修改的内容添加到暂存区当中;(3)本地仓库:git commit把本地暂存区的修改提交到本地代码仓库分支中(不同分支代表不同的代码版本);(4)远程仓库:通过git push把本地仓库的某一个分支上的代码推送到远程仓库的某个分支上;(5)HEAD指针:本地仓库每
2020-10-12 21:36:59
183
原创 C++STL 库容器总结版
1.vector 源码剖析2.C++ STL 专栏,很多用 STL 解决的实际问题案例3.C++ map 用法详解4.让你彻底理解红黑树 5.deque 源码完整分析(带图例)6.C++ list 源码剖析 7.红黑树的讲解8.STL 函数对象(1)9.STL 函数对象(2)10.C++总结 unordered_map,unordered_set,map 和 set 的用法和区别 11.STL 中 set 12.STL 中map...
2020-09-26 15:52:48
203
原创 虚析构函数和智能指针(技术栈总结)
1.C++虚析构函数2.析构函数为什么要定义成虚析构函数? 3.C++智能指针的理解与实现 4.C++智能指针5.C++11 智能指针解析——揭开底层面纱,完整理解智能指针 6.C++智能指针剖析7.智能指针的交叉引用问题及解决方法 8.当析构函数遇到多线程 ── C++中线程安全的对象回调 ...
2020-09-26 14:51:18
370
原创 继承与多态之虚函数
1.什么是纯虚函数、为什么要有纯虚函数?2.虚函数表放在哪里?虚函数表是在编译过程中生成的,一个类只要有虚函数,或者是从基类继承来了虚函数, 那么它就会有一个虚函数表生成,虚函数表运行时放在.rodata 段,只能读,不能写,和常量 字符串是放在同一段的,它的生命期是整个应用程序的生命周期。扩展博客:C++纯虚函数C++虚函数、vfptr、vbptr...
2020-09-26 14:41:49
441
原创 基本排序算法实现(面试复习必备)
一、直接插入排序//直接插入排序(从后往前找),越有序越快 时间复杂度(最好情况)--》o(n),时间复杂度(一般情况)o(n^2)void InsertSort(int* arr, int len){ int tmp; int i, j; for (i = 1; i < len; ++i) { tmp = arr[i]; for (j = i - 1; j >= 0; --j)// { if (arr[j] <= tmp) { break;
2020-08-12 19:38:33
202
原创 linux复习----文件命令
1.more命令more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)。语法:more(语法)(参数)例子://显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。more -dc file//显示文件file的内容,每10行显示一次,而且在显示之前先清屏。more -c -
2020-07-28 19:47:30
266
原创 利用GCV方法选择回归函数的局部线性估计的带宽
#######利用GCV方法选择回归函数的局部线性估计的带宽#####K<-function(x){0.75*(1-x^2)*(abs(x)<=1)}gcvhLL<-function(h,x,y){n<-length(x)S<-matrix(0,nrow=n,ncol=n)GCVh<-0for(i in 1:n){u<- x-x[i...
2020-05-31 17:08:41
1010
原创 利用CV方法选择回归函数核估计的带宽
########利用CV方法选择回归函数核估计的带宽######K<-function(x){0.75*(1-x^2)*(abs(x)<=1) ####Epanechnikov核}cvhNW<-function(h,x,y){n<-length(x)CVh<-0for(i in 1:n){u<-x[-i]-x[i]Kh<-K(u/h...
2020-05-31 17:06:31
1762
原创 消费者生产者模式的介绍与代码实现
生产者消费者模型1.生产者/消费者问题可以描述为:两个或者更多的进程(线程)共享同一个缓冲区,其中一个或多个进程(线程)作为“生产者”会不断地向缓冲区中添加数据,另一个或者多个进程(线程)作为“消费者”从缓冲区中取走数据。生产者/消费者模型关注的是以下几点:(1)生产者和消费者必须互斥的使用缓冲区;(2)缓冲区空时,消费者不能读取数据;(3)缓冲区满时,生产者不能添加数据。2.生产者/消费...
2020-05-31 17:02:59
416
原创 VsCode远程连接Linux服务器
1.vscode连接服务器方法:方法1:安装Remote-SSH方法2:参考拍拍小站大神2.遇到的问题(1)如果Linux的服务器是桥接模式,换网络用vscode连接时注意修改配置信息(2)远程成功连接服务器之后的文件无法保存问题下图表示远程连接成功问题:修改文件后无法保存解决办法:修改要操作文件的权限即可,如修改test.cpp文件权限使其具有写权限:sudo chmo...
2020-04-23 13:59:12
4833
原创 STL中 auto和迭代器iterator的区别
1.auto基本用法:(1)auto的原理就是根据后面的值,来自己推测前面的类型是什么;(2)auto的作用就是为了简化变量初始化,如果这个变量有一个很长很长的初始化类型,就可以用auto代替;注意点:a、用auto声明的变量必须初始化(auto是根据后面的值来推测这个变量的类型,如果后面没有值,自然会报错);b、函数和模板参数不能被声明为auto;c、因为auto是一个占位符,并不是...
2020-04-18 13:29:11
6864
原创 顺序容器和空间配置器(C++)
1.容器的基本概念(1)容器是一种容纳特定类型对象的集合。C++的容器可以分为两类:顺序容器和关联容器。顺序容器的元素排列和元素值大小无关,而是由元素添加到容器中的次序决定的。(2)顺序容器中,元素的排放顺序是与其加入容器时的位置相对应的,这种顺序不依赖于元素的值。(3)关联容器中,元素的位置由相关联的关键字值决定的。也就是所关联容器中元素的位置与关键字关联。(4)标准库定义了三种顺序容器...
2020-03-25 11:49:42
241
原创 迭代器iterator(C++)
1.迭代器的基本概念(1)迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式, 可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。(2)迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像...
2020-03-17 23:33:54
952
原创 linux网络编程|I/O复用:epoll系统调用(代码部分:待补充)
epoll———————————————————————————————————内核事件表epoll是Linux特有的I/O复用函数。它在实现和使用上与select、 poll有很大差异。首先,epoll使用一组函数(函数簇)来完成任务,而不是单个函数;epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而不用像select和poll那样每次调用都要重复传入文件描述符集或事件...
2020-03-15 19:17:43
471
原创 模板(C++)
1.概述问题:怎么理解C++里边的多态?静态的多态(编译时期的多态):函数重载,模板 。动态的多态(运行时期的多态):继承中的虚函数。(1)模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。(2)模板是一种对类型进行参数化的工具;模板通常有两种形式:函数模板和类模板;函数模板针对仅参数类型不...
2020-03-14 15:30:27
212
原创 项目:Linux中su命令的实现
一、笔记二、实现命令(可能不全)//File Name: su.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<assert.h>#include <pwd.h>#include <sy...
2020-03-13 15:17:52
355
原创 运算符重载(二)(C++)------实例
程序实例复数类复数类型的加法运算:实部加实部,虚部加虚部1.重载 " + ":CComplex CComplex:: operator+(const CComplex &src){ return CComplex(src.mreal + mreal, src.mimage + mimage);}我们发现了一个问题,类似 com4 = com1 + 10; 是可以成功的,因...
2020-03-13 13:22:38
238
原创 TCP和UDP的比较(包含“三次握手,四次挥手”)
接TCP和UDP编程流程一节(2019/11/6)写在前面:这里关于TCP的“三次握手和四次挥手“”描述的不是非常清楚,详细的见后文哦~TCP和UDP的区别TCP是面向连接的,可靠的,字节流服务UDP是无连接,不可靠的,数据报服务如图(3-1)所示:1.发送方的send的次数和recv接收方的次数是不对等的;2.发送方send的次数与底层封装的TCP报文段的个数不对等;3.接...
2020-03-12 21:52:34
249
原创 Linux:进程间通信----》消息队列、信号量
参考书籍:《UNIX环境高级编程_第二版中文》知道相关概念:临界资源、临界区、原子操作、P V操作、进程同步/异步、进程阻塞/非阻塞一、消息队列1.概念2.相关操作函数二、信号量1.概念2.相关操作函数...
2020-03-11 18:11:58
155
原创 学习:线程同步&线程安全
线程部分一、线程同步1.互斥量(互斥锁):只有两种状态,一种是解锁状态,一种是加锁状态,如果程序尝试对一把加锁状态的互斥锁进行加锁操作,则程序会被阻塞。注意:使用时要加头文件 #include<pthread.h>练习题:主线程负责接收用户数据,函数线程将用户输入的数据全部转化为大写,存储到a.txt文件中。题目分析:(1)主线程如何将接收的数据交付给函数线程---...
2020-03-10 12:08:33
174
原创 学习:信号发送和内核实现
1.信号发送(1)信号:第一次接收到信号,调用信号处理函数hello world,并且修改信号的响应方式:默认。(2)进程如何发送:(3)在程序中如何发送一个信号?(4)实现kill命令:(5)进程给自己发送信号:2.信号的内核实现机制:...
2020-03-09 18:31:42
179
原创 学习:线程基础
一、协程、进程和线程1.协程:英文名是 Coroutine, 又称为微线程,是一种用户态的轻量级线程。协程不像线程和进程那样,需要进行系统内核上的上下文切换,协程的上下文切换是由程序员决定的。(详见博客收藏—Linux分类)2.进程:一组有序指令+数据+资源的集合。3.线程: 线程是进程内部的一条执行序列(执行流),一个进程至少包含一条线程-------main函数所代表的执行序列,称之为主...
2020-03-08 09:43:56
180
原创 const关键字总结(C / C++)
1.const 含义在 C/C++ 语言中,const关键字是一种修饰符。所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有只读的特点。在编译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。2.const作用,const修饰符的作用主要是利...
2020-03-08 09:41:48
260
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅