
正文
android分析,android分析工具app
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Android 分析OOM工具介绍
如图1所示, 步骤
** 1, 2, 3** 为打开Android Monitor并切换标签到monitor的过程
4, 5, 6 对应的图标和文字含义分别是
MAT 工具识别,并解析hprof文件,
有两种方式可以获得hprof文件
MAT并不能直接打开这两个hprof, 必须通过hprof-conv来转换一次
如图3所示,选中(过滤出MainActivity), 然后通过Objects可以看出它有8个实例
接着选中 com.example.wowo.MainActivity 然后右键选择
Merge shortest paths to GC Roots - exclude week references
因为弱引用是会被回收的,所以排除掉更加容易发现OOM.
什么是OOM out-of-memory?
Android下的APP运行在VM中(Dalvik or ART), 一个APP需要的内存是有限,这个值在不同的平台, 不同的手机上是不同的,当APP需要的内存超过了内存上限,就会引起OOM.
下面给出一个最基本的Android APP显示HelloWorld的例子.
这时如果不停的旋转屏幕, 这时通过观察Android Monitor里的Free和allocated的memory会发现 allocated 的memory会不断增加,而Free的memory会不断减小
这时通过图1中步聚5 dump java heap, 然后filter到MainActivity, 会发现MainActivity有多个实例
接着再通过MAT来分析, 图4所示
发现有很多FinalizerReference, 应该是与GC有关,由于旋转屏幕会导致MainActivity销毁并重新创建实例,而JVM在创建MainActivity实例时还有free的memory, 所以并没有触发GC,即原来的MainActivity的实例并没有被回收,所以多次旋转后,在free memory还有的情况下就会保存多个MainActivity的实例造成内存泄露的假象。当free memory 不够时,这时会触发GC, 会回收之前销毁的MainActivity的实例。
所以在查看OOM问题时,当allocated内存不断增大时,应该人为先触发GC(点击图1的4)。
如果allocated的内存没有下降,说明当前并没有可回收的实例占据内存了。
而在该例中,如果点击了initiate GC后,allocated的内存立即减少了。
Android Monitor看到MainActivity也就只有一个实例了。
相关问答
Q1: Android 系统概览
本篇内容主要目的在从整体上了解Android 庞大的系统架构,根据系统架构中的不同模块和分层找到和梳理一条学习路径,这样能更好的切入到不同的模块学习,直到最后全部打通。
接下来我们从两个角度来分析
下面这张图是Android官方提供的一张Android系统的预览图。
从上面这个图中我们可以知道,Android系统一共有5部分组成,他们分别是
从纵向层级架构的角度来看,我们了解了android系统经典5层结构,他们如垒砖一般纵向堆叠在一起。但是其实每一层都包含了大量的子模块子系统,并不能体现出Android整个系统的内部架构、运行机理,以及各个模块之间是如何衔接与配合工作的。接下来借鉴了gityuan总结的一张系统进程图,从系统进程的角度来看Android系统的工作原理。
Loader层: 引导kernel启动
Kernel层: Android内核空间
Native层: 进入用户空间
Framework层: 给app层提供api以及系统服务,
App层: 各种各样的应用程序apk
参考文献:
Q2: Android UI 布局分析三大工具
一: HierarchyView
老牌分析工具,在早期的SDK中是有快捷方式的,新版的找不到快捷方式了,后来找了很久才找到入口
首先找到Android Device Monitor
可以进入到sdk的安装目录下 从tools目录下点击monitor.bat 启动 Android Device Monitor
然后找到下图红框位置 点击 HierarchyView 按钮就可以打开 如果没有HierarchyView 按钮就点击DDMS按钮左边的更多按钮,里面会列出来HierarchyView 按钮
HierarchyView 最大的好处是以这种结构树图的方式展示ViewTree 能够一目了然的看清结构,并且可以评估绘制时间
但是在新的android版本里面 HierarchyView会提示找不到Service 遇到这种情况 参照如下文章解决
二:UI Automator
比较常见的工具,在很长一段时间内,找不到HierarchyView用的就是他,但是这个工具不是很好用,有时候显示的层级也不准,可能是我不太会用
入口如下图
点击红框处进入
三:Layout Inspector
入口
打开之后是这个样子
三种工具各有各的特点,大家可以根据自己的需求进行选择
Q3: android 内存分析
命令格式:dumpsys [options]
options的内容有以下几种:
watch用来周期性的检测指定命令的输出结果。
命令格式:watch [options][cmd]
options的内容有以下几种:
watch -n 1 -d dumpsys meminfo PID
结果参数含义:
android会将内存占用过大的进程杀死,按照Pss的统计原则决定杀死哪个进程。
Q4: Android 内核分析 bindler
上一次说了android的启动原理,这次说下android的进程间的通信。
linux 本身是提供了通信机制的。大概有7种左右。然后但是为什么android不用。反而要自己搞一套。主要分析到2个方面: 安全性 和性能。因为前期的移动手机性能不高。还有就是绕开Linux内核的开源限制。
总结就是----避免内核空间到数据接受端的直接的数据拷贝;数据接受端接收数据的时候,由于数据大小不确定,要么分配一个很大的空间装数据,要么动态扩容;两种方式都有问题;Binder使用mmap直接把接受端的内存映射到内存空间,避免了数据的直接拷贝;另外通过data_buffer等方式让数据仅包含定长的消息头,解决了接受端内存分配的问题.
android内部的进程间的通信都是通过binlder 来实现的。这个是很重要的一点。
我们面试问道的 aild Content Provider 调用拨打电话 Intent跳转 其底层都是调用的bindler机制.
关于binlder的运行原理 我只写一个大概。
在其底层的Linux中 /etc/bindler/ 有这个c 文件 就是binlder 的程序文件了。其内部是采用的引用计数器来为何对象。要知道 我们的bindler是支持多进程。如何一个service端要对应多个客户端 也就是说要实现多对多。在看内部源码的时候我发现其内部是用2个红黑树来维持 一个service 对专门提供一个客户端调用。如果还有其他的客户端调用就在生成一个servicebindler 对象来提供调用 然后根据内存管理的引用计数器来回收掉不需要的servicebindler对象。
如果你想深究 我推荐这个






