- 博客(337)
- 资源 (8)
- 收藏
- 关注
原创 preloaded-classes裁剪
frameworks\base\config\preloaded-classes 默认位置,如果改了不生效,可能有其它模块的mk文件指定了preloaded-classes覆盖了framework模块,例如。系统预加载了哪些class类?preloaded-classes预加载源代码:ZygoteInit.java。
2025-03-08 21:44:01
324
原创 系统时间学习笔记
Linux 硬件时间(RTC time)、系统时间(UTC时间、Universal time)、本地时间(Local time)、时区(Time zone)与夏令时(DST)解析-CSDN博客Unix时间戳(Unix timestamp)转换工具 - 站长工具
2025-01-25 17:30:41
109
原创 SurfaceFlinger Transaction机制原理
然后在surfaceflinger在handleMessageInvalidate()中处理完transaction后调用TransactionCallbackInvoker的sendCallbacks()去回调TransactionCompletedListener的onTransactionCompleted()函数,通知blastbufferqueue release掉buffer。例如把App的TransactionCompletedListener等属性传递给的SurfaceFlinger。
2025-01-10 15:55:04
325
原创 SurfaceFlinger EventThread原理
DispSyncSource::onVsyncCallback回调逻辑:从DisplayEventReceiver接收到vsync callback,EventThread::threadMain(监控到之后,传递给MessageQueue::vsyncCallback->invalidate。其中,threadMain(死循环,如果没有事件就wait,Vsync或其它函数push了事件,唤醒EventThread。(大致流程,详细待研究)
2025-01-09 19:27:10
162
原创 SurfaceFlinger MessageQueue原理
执行,调用公共方法SurfaceFlinger::schedule(mEventQueue->postMessage(std::move(task)));是SurfaceFlinger构造函数创建的1个消息队列(但不是android的。SurfaceFlinger目录下自定义的一个,但是内部也用了是android的。,用于SurfaceFlinger和HWC之间跨进程通讯。SurfaceFlinger是生产者,HWC是消费者。SurfaceFlinger生产message方式。例如:app有图像请求渲染。
2025-01-09 19:11:42
211
原创 ebpf 笔记
(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能。
2025-01-07 20:12:30
260
原创 ANR(车机端anr分析)
主线程卡死:调同步binder卡死,主线程等锁启动4大组件:执行Activity:5s,ContentProvider:10s,BroadcastReceiver:(front 10s、background 60s),Service(前台20s、后台200s),例如:startForegroundService()()资源是否充足?cpu看(大:频发缺页中断,读取文件)kswapd0:0% user + 83%【avg =1 avg60=4 avg300=2 表示IO频繁 】
2025-01-05 19:28:50
813
原创 App 创建window流程(android12 )
从wms.createSurfaceLocked ~ SurfaceFlinger::createLayer如图所示。
2025-01-04 21:48:37
1142
1
原创 Android Thread优先级和调度算法
Android中cpuset包含5个cgroups:foreground,background,system-background,restricted,top-app。其中 RR+FIFO 是实时线程优先级,它们之间的区别是RR在相同优先级的线程之间会公平轮询,FIFO会独占CPU直到阻塞为止。:PR(NI+20):将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39。SCHED_RESET_ON_FORK,Process所有线程会被设置成。不加Process.加上Process.
2024-12-29 22:25:47
558
原创 init启动流程如下
FirstStageMain() | v SetupSelinux() | v SecondStageMain() | v+----------------------+| SetupCgroups || SetKptrRestrict || TestPerfEventSelinux || early-init +--> m
2024-12-29 22:23:33
758
原创 JVMTI 笔记
JVMTI(JVM tool interface)是一套c/c++开发接口,用于对JVM进行性能分析、debug、内存管理、线程分析等各种黑科技操作创建一个native工程,复制一份jdk中的头文件到项目cpp根目录(在jdk/include安装目录下)自定义一个memory.cpp通过jvmtiEnv->SetEventCallbacks方法设定我们想要监听的事件到jvmtiEventCallbacks集合里。
2024-12-28 20:36:02
527
原创 memory泄露分析方法(Binder,Window,View篇)
找大量重复的view,点击查看text文案如果相同则找产品他们确认是否合理。代码或dumpsys window来监测是否有大量同名window。
2024-12-27 22:55:37
374
原创 epoll笔记
select/poll:(轮询驱动)服务端主动遍历监听的所有客户端,查看每个客户端的fd是否有变化的消息(通过pipe管道通讯方式)弊端:每次遍历全部fd消耗更多cpu,fdset 每次都需全部copy到内核态。looper() UI线程走到nativePollOnce -〉epoll_wait(mWakeEventFd)挂起,epoll:(事件驱动)服务端通过管道通讯方式将有变化事件的客户端保存到1个队列。epoll是1个服务端监听n个客户端socket请求的多路复用技术。
2024-12-26 23:43:27
297
原创 memory泄露分析方法(FD(File Descriptor)篇)
进程打开File,Socket,Pipe后生成一个File Descriptor,它是打开这个系统资源的标识符。File Descriptor是Linux下概念,fd 是 int类型非负数!fd标识符和泄漏文件类型关系。
2024-12-26 23:16:15
458
原创 系统卡顿,还是App卡
所有App都卡,大概率是系统稳定性问题导致,出现1个app 特有卡顿,从app侧找原因。打开相册播放视频,如果视频卡,大概率是系统资源不足(cpu,memory,gpu)打开2个不同app列表滑动都卡顿,大概率是系统cpu不足导致卡顿。没现场,只有log就看cpu,memory,gpu有无异常占用。
2024-12-26 14:35:49
210
原创 memory泄露分析方法(显存篇)
2,gpu显存不够关键log:E Fence : waitForever: waiting for GPU completion 15134: fence 73 didn't signal in 3000 ms。用户进程需要操作显存,必须用mmap将内核空间映射到用户进程来可操作。start要求空间起始地址,一般为NULL,表示自动分配.Offset表示返回地址在映射空间的偏移量,一般是0。Prot是映射区域的属性,一般设为可读可写。fd是open("/dev/fb0")Length,映射区域的长度,
2024-12-26 00:26:41
320
原创 sytemmonitor
在init.rc启动一个native守护进程system_monitord,定期读取进程cpu占用率和memory。监控memory /proc/pid/smaps_rollup。从"/proc/pid/cmdline"读取每个进程名称。监控cpu total :/proc/stat。监控cpu:/proc/pid/stat。
2024-12-24 23:38:51
111
原创 判断截图相等方法
判断freeze方法:Main线程每隔2.5s绘制一个像素,每次绘制都是不同颜色,并且对像素截图对比像素是否有变化。对比代码本地有,网上也一堆有需要可联系我。
2024-12-20 15:12:40
205
原创 Binder 大小
SystemServer 32个App 16个搜索binder thread pool:E IPCThreadState: binder thread pool (15 threads) starved for (appbinder线程被用光,
2024-12-19 21:54:50
424
原创 我的科技树
专业方向:App cpu/memory/gpu/流畅度/响应时间的优化,Anr,Framework CarPowerManagementService模块的(STR),从0~1完成性能监控体系搭建,完成3大版本迭代高质量性能交付组件:marqueue,shadowContainer属性动画:修改属性动画帧率自定义动画: VoicePlayerView 定时器计算并请求绘制旋转动画:降帧,降速,降renderthread cpu占用24小时无泄露,App小于700MMemory分析工具监控工具。
2024-12-19 12:07:17
700
原创 FPS帧率统计工具
从trace和录屏能算出大致帧率,更准确的帧率数据还需要从代码中统计为了评估流畅度是否好,要计算1s 实际绘制的帧数,空闲不绘制的帧数,所以最好用2个帧率:一个是满帧fps,一个是实际绘制fps,好处是相比在Surfaceflinger统计消费App 生成的Buffer数量,可以从2个fps知道发现低于60帧,是真的掉帧了,还是没有绘制不是掉帧如:doFrame ran 60 times (Real:34) 表示实际只绘制了34帧,但是可以绘制到60帧实现原理:在Choreographer的doFrame方
2024-12-17 11:48:47
508
原创 SyncBarrier同步屏障Detector
SyncBarrier是一条同步Message,msg.target==null,目的是为了过滤掉同步message,优先让一步message执行。
2024-12-16 19:02:30
919
原创 memory泄露分析方法(Jni篇)
如jString,jObject,jObjectArray,jArray,jObjectMethod,jClass,GetByteArrayElements。注意:局部引用表最多512个,全局引用表最多51200个(jni中除了基本数据类型会自动释放内存(// 创建 jchar。// 释放 jchar。
2024-12-16 10:42:16
174
原创 dumpsys SurfaceFlinger
/alpha: 表示了这张layer的透明度,这个值跟isOpaque是有区别的.isOpaque表示了这个layer可以是透明的,也就是没有显示数据的地方;//tr: 代表屏幕的旋转和缩放程度.大多数的layer实际上是不需要旋转和缩放的,因为他们定义的大小就是跟屏幕一致的。//invalidate: 表示这个layer的数据是失效的,这个值绝大多数情况下都是0.//isOpaque: 代表是否是不透明的,只有完全不透明的layer这个值才是1.//pos: pos的值是layer左上角的位置.
2024-12-15 01:05:30
918
原创 layers合成学习笔记
不支持device合成的layer,SurfaceFlinger会采用GPU来合成,然后与device合成的layer在hwc进行同步再送给屏幕。规则3:如果多个窗口合成layer,z-order序列上下是device,中间是gpu,只能通过gpu合成。规则1:一个pipeline可合成屏幕宽度是6480,全屏6480至少要2个物理pipeline。规则2:gpu合成也是用2个物理pipeline。HWC(Device)合成的源码分析。
2024-12-14 23:33:16
333
原创 进程保活机制
进程优先级(adj:-800)仅次于system_server(adj:-900)和native进程(adj:-1000),基本不存在被杀可能。实际用法如下所示:Entering GarageMode之后开始执行JobScheduler任务。Backgorud Service+闹钟。该方案适用于后台音乐播放的场景。
2024-12-14 00:14:12
468
原创 dex2oat 提升启动速度
build阶段可以将apk中dex生成oat文件(odex),dex2oat 源码目录/system/bin/dex2oat配置方法:PRODUCT_DEXPREOPT_SPEED_APPS。
2024-12-13 19:58:47
1010
原创 Launcher启动流程
startActivityUnchecked()流程如下:todo。RenderFrame.MainActivity声明。流程2:Real Launcher启动流程。流程1:FallbackHome启动流程。FallbackHome声明。
2024-12-13 18:25:49
331
原创 FragmentManager
启动第1个生命周期onAttach打印出日志FragmentManager: moveto ATTACHED: EnergyFragment。FragmentManager出现的bug,可查看FragmentManager: moveto ATTACHED。FragmentManager.beginTransaction().add(id,Fragment)才开始执行。FragmentManager 在ViewPager等多页面控件内部用于管理多个。,也经常用于代码中自定义界面切换逻辑。
2024-12-13 15:52:07
363
原创 onDestroy原因
Activity原因:onconfigchange(横竖屏) activity.finish framework remove-task:"remove-task" wm_finish_activity: [MainActivity,app-request] finish-imm:finishIfPossible clear rencenttask wm_destroy_activity: [MainActivity,finish-imm:recent-task-trimmed] useru
2024-12-13 15:22:23
340
原创 Android Scratch分区
只要super分区有空闲空间,adb remount android会在super分区创建1个临时动态scratch分区,并使用 overlayfs 写入,有了Scratch分区,可以不用修改真正的system、vendor等分区原始数据。
2024-12-12 20:27:49
495
struts2-json-plugin-2.1.8.1.jar
2014-02-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人