- 博客(247)
- 资源 (1)
- 收藏
- 关注
原创 【置顶】 博文汇总
23年底了,想来也工作十年,也一直在csdn输出。这十年,从业务层做到性能优化,再到音视频,再到播放器稳定性相关的native crash。也积累了不少文章,在此汇总一下;另外还有大量的深度源码分析草稿,之后也整理发出来吧。
2023-12-15 18:50:44 1542
原创 C++ 类与构造函数 三五法则
定义了拷贝操作的类类通常拥有一个资源,而拷贝成员必须拷贝此资源。但是拷贝一个资源会导致一些额外开销。在这种拷贝并非必要的情况下,定义了移动构造函数和移动赋值运算符的类就可以避免此问题。
2024-06-02 09:08:44 1185 1
原创 MediaCodec源码分析 ACodec状态机详解
UninitializedState:未初始化状态。在业务层调用完成后切换到LoadedState。LoadedState:表示解码器已经加载完了;调用,和后,在LoadedState::onStart中调用让omx进入可Idel状态,后切换到LoadedToIdleState状态。LoadedToIdleState:初始化Buffer,解码器可用了;在接收到OMX_StateIdle返回后,并发送让omx切换到执行态,后切换到IdleToExecutingState状态。
2024-03-17 10:55:06 243
原创 MediaCodec源码分析 状态简单介绍
本文分析MediaCodec.h层的状态机,下篇介绍ACodec状态机,基于7.0代码。During its life a codec conceptually exists in one of three states: Stopped, Executing or Released.Stopped 状态具有三个子状态:Uninitialized、Configured 和 Error。有三种方式可以使 MediaCodec 进入 Uninitialized 子状态:使用工厂方法创建 MediaCodec
2024-03-17 10:43:17 133
原创 MediaCodec源码分析 Codec消息轮转
本文梳理MediaCodec的消息轮转流程,基于7.0代码。MediaCodec底层实现为JMediaCodec、MediaCodec.cpp、ACodec,他们之间是通过media包下的ALooper、AHandler、AMeesage这一套机制进行线程间通信的。本文就是分析这里的流程,先分析ALooper这一套,然后再分析MediaCodec.java是怎么调用操作下去的,ACodec又是如何跟MediaCodec.cpp通信的。
2024-03-13 11:38:59 314 2
原创 Android Native Hook 深入理解PLT hook
本文介绍NativeHook技术里的PLT hook,参考开源的xhook和bhook进行理解,本文不涉及该hook技术源码的分析,只分析大体原理,用于在进行修复稳定性问题时候寻找hook点使用。
2023-12-22 20:28:28 1517
原创 Android 深入理解SurfaceView
更改layoutParams、surfaceView.setVisibility、滑动等基本任何一个对view的操作都会引起updateWindow,所以我们在对SurfaceView操作的时候要加倍小心,避免引起多次updateWindow,从回调上看,就是避免多次触发sufaceChange。通过调整surfaceViewContainer大小、surfaceHolder.setFixedSize,这三种方式均能触发surfaceChange。
2023-09-24 21:18:17 577
原创 MediaCodec源码分析 configure流程
本文梳理MediaCodec configure流程,基于7.0代码,这里只分析AVC和HEVC的视频硬解,流程图如下。
2023-09-12 08:00:00 398
原创 MediaCodec源码分析 createByCodecName流程
本文梳理MediaCodec初始化流程,即create流程,基于7.0代码。流程图如下,创建流程还是比较清晰简单的。
2023-09-07 08:00:00 359
原创 arm体系结构:汇编指令
ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。
2023-08-26 16:11:51 516
原创 Android 设置线程优先级源码分析
Android中设置线程优先级有thread.setPriority()方式和Process. setThreadPriority()两个方法。使用Process. setThreadPriority()进行更精准的设置,thread.setPriority可能会将线程优先级设置的比background还低,导致线程运行获取不到足够的时间片,出现不可知问题。本篇文章对这两种设置线程优先级的API的进行源码分析。
2023-05-27 17:26:26 549
原创 Android 创建线程源码分析 JavaThread&NativeThread
本文分析在Android中创建线程时候的源码分析,即JavaThread和NativeThread。
2023-05-20 17:59:32 797
原创 Android 性能优化 命令行查看CPU使用率
本文介绍cpu使用率概念,和使用ps命令、top命令和dumpsys cpuinfo命令来查看cpu使用率,帮助我们了解应用程序在运行过程中的整体状态和各个线程状态。
2023-05-06 23:28:21 4233
原创 C语言 非本地跳转 实现native层TryCatch
C语言的本地跳转是指goto、break、continue等语句,但是这个语句最大局限就是只能实现函数内部的跳转。C 语言提供了一种用户级异常控制流形式,称为非本地跳转(non local jump),它将控制直接从一个函数转移到另一个当前正在执行的函数,而不需要经过正常的调用—返回序列。
2023-04-19 23:05:20 521
原创 Android ART&Dalvik虚拟机 追踪对象分配
本文介绍Dalvik虚拟机中的Allocation Tracker,用于追踪dalvik内存分配,能直观的看到分配了什么对象,和分配对象的堆栈。
2023-04-09 15:20:53 160
原创 Android ART虚拟机 GC流程分析
本文分析ART虚拟机的GC流程,主要函数从CollectGarbageInternal开始。当配置CMS为默认回收器时:- collector_type_为kCollectorTypeCMS。- foreground_collector_type_取值为kCollectorTypeCMS。它代表程序位于前台时使用的回收器类型。- background_collector_type_的取值为kCollectorTypeHomogeneousSpaceCompact。它代表程序位于后台时使用的回收器类型。
2023-04-05 14:01:14 721
原创 Android ART虚拟机 GC的各种类型
本文介绍ART虚拟机的GC类型,为下篇介绍ART的GC做准备。每个Space都有自己的gc回收策略,如下图所示:- kGcRetentionPolicyNeverCollect:不需要回收某个Space所包含的垃圾对象(因为该Space可能不存在垃圾对象)。- kGcRetentionPolicyAlwaysCollect:每次垃圾回收都需要处理某个Space空间。- kGcRetentionPolicyFullCollect:直到最后时刻才回收某个Space空间中的垃圾对象。
2023-04-04 23:23:13 586
原创 Android ART虚拟机 对象创建内存分配流程
本篇文章介绍我们在日常开发使用Java时new对象的时,ART在堆上的内存分配是如何分配的。内存又和gc相关,下篇文章会分析ART的gc流程。本文可以参考之前写的Dalivk虚拟机下的对象创建时内存分配流程一起看,会对ART虚拟机理解的更深刻些。
2023-04-03 23:38:55 576
原创 Android ART虚拟机 Space类体系
在ART虚拟机实现中,内存分配和释放的算法是封装在不同的Space中来完成的。而外部使用者只能借助Space及派生类的接口来完成内存的分配与释放。通过阅读这些Space的实现,可以看出ART虚拟机的一个重要的特点就是大量使用映射内存,相较于Dalvik虚拟机来说在内存分配上管理的更细致。
2023-04-02 18:41:38 1337
原创 Android ART虚拟机 堆Heap类构造函数
本文主要介绍Heap的构造函数,从构造函数里大量使用各种Space,可以看出ART虚拟机的一个重要的特点就是大量使用映射内存。主要代码在art/runtime/gc/heap.cc里。
2023-04-01 23:04:10 972
原创 Android ART虚拟机 关键类
本文介绍ART虚拟机中的关键类,方便之后对ART更方便的理解。此处几个类和dalvik一脉相承,也可以更好的理解dalvik里面的GC模块。
2023-03-31 22:56:40 561
原创 Andriod ART虚拟机 启动和初始化
之前整理了一系列Dalvik虚拟机的关于堆内存和GC的文章,轮到对ART内存进行分析优化了,继续整理输出一波,本篇为ART虚拟机系列的第一篇,介绍ART虚拟机的启动和初始化。本ART系列基于7.0代码分析。
2023-03-29 20:30:07 626
原创 Android Dalvik虚拟机 堆内存管理 增长&释放
本篇继续介绍安卓dalvik虚拟机系列,介绍Dalvik虚拟机的堆内存管理,即堆是如何增长和释放的。
2023-03-04 14:46:36 925
原创 Android Dalvik虚拟机 对象创建内存分配流程
本篇文章介绍我们在日常开发使用Java时new对象的时,Dalvik在堆上的内存分配是如何分配的。内存又和gc相关,下篇文章会分析Dalvik的gc流程。
2023-02-12 16:55:59 650
原创 Android Dalvik虚拟机 堆初始化流程
Dalvik虚拟机中,堆是由heap[0] Active堆和heap[1] Zygote堆两部分组成的。其中,Zygote堆用来管理Zygote进程在启动过程中预加载和创建的各种对象,而Active堆是在Zygote进程fork第一个子进程之前创建的。之后无论是Zygote进程还是其子进程,都在Active堆上进行对象分配和释放。这样做的目的是使得Zygote进程和其子进程最大限度地共享Zygote堆所占用的内存。
2023-02-11 18:48:38 873 1
原创 Android Dalvik虚拟机 启动和初始化
本文整理Dalvik虚拟机在启动流程和初始化流程,为下篇分析Dalvik的内存分配流程和gc流程打一个基础。本系列代码均基于4.4.2分析。Dalvik虚拟机启动流程、Dalvik虚拟机初始化流程、Dalvik虚拟机核心变量gDvm含义
2023-02-05 17:07:28 550
原创 Android 虚拟机 内存优化 分析GC日志
Android虚拟机在发生垃圾回收 (GC) 事件时,会把相应消息会输出到 Logcat 中,可以看出来虚拟机的内存情况,这为我们做内存优化提供了另外一个可参考的依据,要尽量减少stop the world类型的GC。本文介绍如何查看GC日志,先做到看懂GC日志。
2023-01-07 17:04:20 2741
原创 操作系统 内存管理单元MMU TLB
本文详细介绍Linux操作系统下的内存管理单元MMU和TLB。内存管理子系统的架构如图所示,分为用户空间、内核空间和硬件3个层面。硬件层面处理器包含一个称为内存管理单元(Memory Management Unit, MMU)的部件,负责把虚拟地址转换成物理地址。内存管理单元包含一个称为页表缓存(Translation Lookaside Buffer, TLB)的部件,保存最近使用过的页表映射,避免每次把虚拟地址转换成物理地址都需要查询内存中的页表。MMU地址转换流程主要分为几个阶段:1. 用户进程访
2022-10-15 23:54:37 934
深入理解Android内核设计思想第一版高清完整带目录
2018-05-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人