- 博客(80)
- 收藏
- 关注
原创 lowmemorykiller分析1
Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller。从lowmemorykiller.c位于drivers/staging/android也可知道,属于Android专有,没有进入Linux kernel的mainline。lmkd,即Low Memory Killer Daemon,基于memory子系统和Kernel lowmemorykiller功能参数,选择一个合适的进程,然后kill进程,以达到释放内存的目的。所以也绕不开Kernel模块lowme
2022-06-05 15:27:13
371
原创 lowmemorykiller分析
lowmemorykiller作为内核一个module,输入参数有如下:/sys/module/lowmemorykiller/parameters/adj 0,100,200,300,900,906/sys/module/lowmemorykiller/parameters/cost 32/sys/module/lowmemorykiller/parameters/debug_level 1/sys/module/lowmemorykiller/parameters/minfree 1843
2022-06-05 15:10:33
407
原创 Video Playback的流程
1.Video Playback的流程在Android上,预设的多媒体框架(multimedia framework)是OpenCORE。OpenCORE的优点是兼顾了跨平台的移植性,而且已经过多方验证,所以相对来说较為稳定;但是其缺点是过於庞大复杂,需要耗费相当多的时间去维护。从Android 2.0开始,Google引进了架构稍為简洁的Stagefright,并且有逐渐取代OpenCORE的趋势 (註1)。[图1] Stagefright在Android多媒体架构中的位置。[图2] Stagefrig
2022-06-03 13:18:37
884
原创 多媒体架构
1 MediaScannerService 多媒体扫描是从MediaScannerService开始的。这是一个单独的package。位于packages/providers/MediaProvider:含以下java文件java代码:} else {…if (Intent.ACTION_MEDIA_MOUNTED.equals(action)){…/收到MOUNT信息后,扫描外部存储scan(context, MediaProvider.EXTERNAL_VOLU
2022-06-03 13:17:16
234
原创 MediaScanner分析
1 MediaScannerService 多媒体扫描是从MediaScannerService开始的。这是一个单独的package。位于packages/providers/MediaProvider:含以下java文件java代码:} else {…if (Intent.ACTION_MEDIA_MOUNTED.equals(action)){…/收到MOUNT信息后,扫描外部存储scan(context, MediaProvider.EXTERNAL_VOLU
2022-06-03 13:15:51
158
原创 视频framework学习总结
1 前言视频学习这里总结两部分,分别为本地视频播放以及基于RTSP的流媒体播放(还有基于HLS的流媒体播放,暂时没有深入了解)。本地视频就是用户下载的视频文件播放,而流媒体就是用户基于网络在线播放的视频,可以分为点播和直播两种。2 本地视频播放要实现播放一个视频文件,只要调用以下三个函数即可:setDataSource、prepareAsync监听到prepareAsync 完成的消息后再调用start的方法。这里以Y5II(MTK6735芯片)代码为基础来分析。当java层代码调用setData
2022-06-03 13:13:59
158
原创 Java GC算法2
以下配置主要针对分代垃圾回收算法而言。堆大小设置年轻代的设置很关键JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bit 还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64位操作系统对内存无限制。在Windows Server 2003系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-Xmx3550m:设
2022-06-03 11:06:01
88
原创 JAVA GC 算法
栈是运行时的单位,而堆是存储的单元。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据,堆解决的是数据存储的问题,即数据怎么放,放在哪儿。在java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关的信息。包括局部变量、程序运行状态、方法返回值等等,而堆只负责存储对象信息。为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?1. 从软件设计的
2022-06-03 11:02:21
66
原创 网站收藏导航
1、armv8/armv9入门中文文档在线看:http://hehezhou.cn/arm_doc/2、arm8/armv9寄存器速查:http://hehezhou.cn/arm/3、arm8/armv9指令集http://hehezhou.cn/isa/4、代码在线阅读(含有Linux Kernel5.14、TF-A2.5、optee3.16、ffa-spmc等)http://hehezhou.cn:8080/optee316/......
2022-05-30 21:43:45
223
原创 FFMpeg SDK 开发手册
FFMpeg 中比较重要的函数以及数据结构如下:数据结构: (1) AVFormatContext (2) AVOutputFormat (3) AVInputFormat (4) AVCodecContext (5) AVCodec (6) AVFrame (7) AVPacket (8) AVPicture (9) AVStream 2. 初始化函数: (1) av_register_all() (2) avcodec_open() (3) avcodec_close() (4) av_open_i
2022-05-29 09:30:46
1190
原创 AudioPolicyService分析
Android Audio System 之 AudioPolicyService 和AudioPolicyManagerAudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有 MediaSever加载。AudioFlinger主要负责管理音频数据处理以及和硬件抽象层相关的工作。本文主要介绍 AudioPolicyService。1 引言AudioPolicyService是Android音频系统的两大服务之一,另一
2022-05-28 21:24:23
430
原创 native 层打印调用栈
#ifndef _CALLBACK_H#define _CALLBACK_H#ifdef __cplusplusextern “C” {#endifvoid dumping_callstack(void);#ifdef __cplusplus}#endif#endif#include “mycallstack.h”#include<utils/CallStack.h>extern “C” {void dumping_callstack(void){android::
2022-05-28 20:19:34
228
原创 kernel memory use after free
“CWE-466 Return of pointer value outside of expected rangeCWE-467 Use of sizeof() on a pointer typeCWE-468 Incorrect pointer scalingCWE-469 Use of pointer subtraction to determine sizeCWE-476 NULL pointer dereferenceCWE-587 Assignment of a fixed addre
2022-05-28 18:12:50
160
原创 Android中的GraphicBuffer同步机制-Fence
博客园Logo首页新闻博问专区闪存班级代码改变世界搜索注册登录brucemengbm博客园首页新随笔联系订阅管理随笔 - 1645 文章 - 0 评论 - 7 阅读 - 117万Android中的GraphicBuffer同步机制-FenceFence是一种同步机制,在Android里主要用于图形系统中GraphicBuffer的同步。那它和已有同步机制相比有什么特点呢?它主要被用来处理跨硬件的情况。尤其是CPU。GPU和HWC之间的同步,另外它还能够用于多个时
2022-05-28 16:48:29
320
原创 Android GPU硬件加速渲染流程(上)
目录收起1、基本概念1.1 Window(窗口):1.2 View(视图):1.3 Window与View之间关系2. 软件绘制2.1 Actvity窗口绘制流程2.2软件绘制流程2.3何时使用软件绘制3硬件绘制3.1 硬件绘制流程3.2 硬件加速渲染的环境初始化过程分析3.2.1 MainThread和RenderThread的分离3.2.1.1 SurfaceView简介3.2.1.2 SurfaceTexture、TextureView、GLSurfaceview的区别与
2022-05-28 16:46:43
748
原创 openGL编程例子
// GLXBasics.c// Use GLX to setup OpenGL windows// Draw eyeballs// OpenGL SuperBible, 5th Edition// Nick Haemel#include <glew.h>#include <glxew.h>#include <math.h>#include <stdio.h>#include <stdlib.h>#define PI 3.141
2022-05-28 16:18:38
777
原创 SF display 网址
https://adtxl.com/index.php/188.htmlhttps://zhuanlan.zhihu.com/p/464492155 gpuhttps://www.cnblogs.com/brucemengbm/p/6881925.html fencehttps://zhuanlan.zhihu.com/p/261914515
2022-05-28 16:07:04
99
原创 看哪个模块在联网
C:\Users\Administrator>adb shell tcpdump -i any -nnXSs 0 -w /data/shared/any.pcapadb shell “ss -neiopan” >> ss.txtNetid State Recv-Q Send-Q Local Address:Port Peer Address:Portp_dgr UNCONN 0 0 [0]😗
2022-05-03 19:37:55
169
转载 Linux kprobe调试技术使用
kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。利用kprobe技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程。kprobe提供三种探测手段:kprobe、jprobe和kretprobe,其中jprobe和kretprobe基于kprobe实现,分别应用于不同探测场景中。可以通过两种方式使用kprobe:第一种是编写内核模块,向内核注册探测点,探测函数根据需要自行定制,但是使用不方便;第二种是使用kprobes in f
2021-08-31 16:09:49
353
原创 Linux内核的文件预读readahead
nux的文件预读readahead,指Linux系统内核将指定文件的某区域预读进页缓存起来,便于接下来对该区域进行读取时,不会因缺页(page fault)而阻塞。因为从内存读取比从磁盘读取要快很多。预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。维基百科上关于readhead的介绍资料:readahead is a system call of the Linux kernel that loads a file's contents into
2021-05-20 20:03:12
338
原创 通过打印DISPLAYLIST调试图形性能
在这调试工具,尤其是动画的性能问题时,我们通常采用traceview或systrace进行分析。这两个工具各自有适合的问题类型:如果是程序逻辑导致图形缓慢,则逐步缓慢的数据库访问,进程间通讯等的,那么traceview + dmtracedump是最有效的。如果是由于绘画本身导致动画缓慢,那么问题就复杂一些了,原因可能是各式各样的:第一种可能就是我们的view-hierachy太复杂,通过hierachy-viewer这个工具,或者打开开发者选项中的“ Show GPU overdraw”可以检查
2021-05-13 20:44:21
127
原创 关于ANDROID GRAPHICS的文章
来自Google的Android工程师Dianne Hackborn写的,原意是反驳一些关于android和ios的对比(主要是关于图形性能),后来也引起了很多的讨论。[第一段]某些Android图形的真实情况如何?(编辑:有很多评论都将其视为Android的借口或对用户等无关紧要。我只是想澄清一下,我之所以写这篇文章只是为了解决我看到的许多错误信息作为真理发布在网络上。这绝不是找任何借口,它仅适用于那些已经对编写和阅读通常事实不正确的技术信息感兴趣的人。我厌倦了看到如此多的错误信息,并且到处重复有
2021-05-13 20:43:05
115
原创 ANDROID中的EGL扩展
Google在Android中对egl做了一些扩展,让整个显示渲染的软件体系运行地更加有效率。在我们分析,修改SurfaceFlinger代码的过程中,经常可以看到这些egl扩展相关的代码,比如android native fence, KHR image等等。虽然跳过这些内容对理解SurfaceFlinger本身影响并不大,但是在阅读代码时,每次看到这些”小石头”,心理总不很舒服。因此,稍微花了一些时间,找了一些KHRONOS的文档,结合SurfaceFlinger源代码,大致对这些EGL扩展做了一点点基
2021-05-13 20:39:03
413
原创 android native 内存泄露检查(libc.debug.malloc )
Android对内存的使用包括内存泄漏和内存越界,内存泄漏会导致系统内存减少,最终分配不到内存,这样大的程序就不能运行,甚至系统没有内存而崩溃。Android中kernel和应用程序都可能会有内存泄漏和越界。对于Java代码,在越界的时候虚拟机会加以检查并抛出异常。而对于C/C++代码,越界的时候就悄无声息地让程序出错或crash内核中的内存泄漏检测内核中已经内嵌了内存泄漏的代码,编译的时候需要打开配置代码及帮助位置:其中kmemcheck是检测内存越界等错误的,目前只支持X86kernel/
2021-05-12 19:44:25
404
原创 内核地址消毒剂(KASAN)
概述KernelAddressSANitizer(KASAN)是动态内存错误检测器。它提供了一种快速而全面的解决方案,用于查找无用后使用和越界错误。KASAN使用编译时工具来检查每个内存访问,因此您将需要GCC 4.9.2或更高版本。需要GCC 5.0或更高版本才能检测对堆栈或全局变量的越界访问。当前,仅x86_64和arm64体系结构支持KASAN。用法要启用KASAN,请使用以下命令配置内核:CONFIG_KASAN = y并在CONFIG_KASAN_OUTLINE和CONFIG_KAS
2021-05-12 19:36:11
1011
原创 Sanitier问题定位记录
操作系统:Ubuntu 16.04;g++ (Ubuntu 4.8.5-4ubuntu2) 4.8.5;clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)。Sanitizer简介Sanitizers是谷歌发起的开源工具集,包括了AddressSanitizer, MemorySanitizer, ThreadSanitizer, LeakSanitizer,Sanitizers项目本是LLVM项目的一部分,但GNU也将该系列工具加入到了自家的GC
2021-05-12 19:34:04
220
原创 UndefinedBehaviorSanitizer
介绍如何建造用法可用支票易挥发的最少的运行时间堆栈跟踪和报告符号记录中使无符号整数溢出静音问题抑制使用禁用仪表 attribute((no_sanitize(“undefined”)))抑制重新编译的代码中的错误(忽略列表)运行时抑制支持平台当前状态附加配置例子更多信息简介UndefinedBehaviorSanitizer(UBSan)是一种快速的未定义行为检测器。UBSan在编译时修改程序,以捕获程序执行期间的各种未定义行为,例如:使用未对齐或空指针有符号整数溢
2021-05-12 19:30:57
2686
原创 ThreadSanitizer
简介ThreadSanitizer是检测数据争用的工具。它由一个编译器检测模块和一个运行时库组成。ThreadSanitizer引入的典型速度降低约为5倍至15倍。ThreadSanitizer引入的典型内存开销约为5x-10x。如何建立使用CMake构建LLVM / Clang 。支持的平台以下操作系统支持ThreadSanitizer:Android aarch64,x86_64达尔文arm64,x86_64FreeBSD的Linux aarch64,x86_64,powerpc64,
2021-05-12 19:29:54
489
原创 LeakSanitizer
简介LeakSanitizer是运行时内存泄漏检测器。它可以与AddressSanitizer结合使用, 以获取内存错误和泄漏检测,或在独立模式下使用。LSan几乎不会增加任何性能开销,直到过程结束时,此时会有一个额外的泄漏检测阶段。用法AddressSanitizer:集成了LeakSanitizer并默认在支持的平台上启用它。$ cat memory-leak.c#include <stdlib.h>void *p;int main() {p = malloc(7);p =
2021-05-12 19:28:26
1556
原创 数据业务AP Log分析
数据业务AP Log分析PS接入技术Radio log中搜索“<DATA_REG” 08-01 17:24:10.879229 2702 2831 D RILJ : [4020]< DATA_REGISTRATION_STATE {.regState = REG_HOME, .rat = 14, .reasonDataDenied = 0, .maxDataCalls = 9, .cellIdentity = {.cell...
2021-01-31 13:32:35
2130
1
原创 Java 上锁机制
问:为什么是 while 而不是 if ?大多数人都知道常见的使用 synchronized 代码:synchronized (obj) {while (check pass) {wait();}// do your business}那么问题是为啥这里是 while 而不是 if 呢?这个问题我最开始也想了很久,按理来说已经在 synchronized 块里面了嘛,就不需要了。这个也是我前面一直是这么认为的,直到最近看了一个 Stackoverflow 上的问题才对这个问题有了比较深入的理
2021-01-10 12:32:23
120
原创 [译]Android UI 性能优化
本文来源于Google IO 2017上的视频 Android Performance: UI,翻译自Android官网 Slow rendering;个人觉得非常有价值,比如指出 对象分配、垃圾回收(GC)、线程调度以及Binder调用 是Android系统中常见的卡顿原因,更重要的是给出了定位和解决这些问题的方案;而非简单地告诉你避免对象分配,减少布局层级,减少过度绘制等苍白无力的内容。另外,Google开发团队在各个不同场合不厌其烦地提到了 Systrace用以解决App中不同维度的问题,这是一个远被
2021-01-09 13:34:26
454
原创 性能问题
应用在生成一个临时的Hardware Layer。这些临时的Layer被不同的 [Canvas.saveLayer()](http://developer.android.com/reference/android/graphics/Canvas.html#saveLayer(float, float, float, float, android.graphics.Paint, int))所创建,这些UI控件在下面的情况下使用Canvas.saveLayer()方法去绘制 alpha < 1 (see
2021-01-09 13:29:22
184
原创 mediacode学习二
void NuPlayer::Decoder::requestCodecNotification() { if (mCodec != NULL) { sp<AMessage> reply = new AMessage(kWhatCodecNotify, this); reply->setInt32("generation", mBufferGeneration); mCodec->requestActivityNotificat...
2020-10-25 12:35:50
293
原创 mediacodec流程学习
void ACodec::LoadedState::onStart() { ALOGV("onStart"); status_t err = mCodec->mOMXNode->sendCommand(OMX_CommandStateSet, OMX_StateIdle); if (err != OK) { mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err));...
2020-10-24 21:38:32
360
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人