性能检测和分析工具 一
- 16ms 黄金准则
设备的屏幕刷新率为60帧每秒 , 1/60fps=16.6每帧,超过16,会有掉帧的现象 - 绘图优化的过程
软解时代: android2.3,之前,通过CPU绘图
硬解时代: android2.3之后,通过GPU绘图
黄油时代: android4.1之后,通过垂直同步和多缓冲机制提高绘图效率
异步绘制:android5.0之后,Render Thread,异步绘制绘制.某帧延迟,不影响下一帧 - 布局核心准则
View绘制三步:measure layout draw
不宜超过8层 - RelativeLayout and LinearLayout
RL应尽量避免嵌套,LL要保证层级不能太深 - HierarchyViewer
查看View层级,减少不必要的View
可以把View的树形结构图保存为png或者psd - Merge和ViewStub 另外一本
- Trace for OpenGL ADM中进不去??
- Profile GPU Rendering 开发者选项中,前有
可以使用adb到处数据,需要开发者选项中选中
adb shell dumpsys gfsinfo >***.txt
adb shell dumpsys gfsinfo <包名> framestats //详细的信息
- Logcat
主线程卡顿会有log输出(废话)
Skipped 50 frames!………… - trace.txt
保存ANR Log的位置
adb pull /data/anr/traces.txt /电脑位置/
- android studio GPU monitor 已经不存在了 现在是androidProfile
- Systrace
ADM中,选中启动Systrace,收集保存为html
W S 对网页内容缩放
AD 对网页内容左右移动
主要分为CPU区域,SurfaceFlinger ,应用区域(绿色:流畅 黄色:小幅延迟 红色:验证延迟),Alert - Traceview ????高端
- adb计算应用启动时间
adb shell am start -W com.acmp/com.acmp.MainAcitity
实验报错 class not exist
ThisTime 最后一个启动的activity的启动耗时
TotalTime 自己启动的所有activity的时间
WaitTime 总时间 - 内存的管理和优化的方式
在不需要对象的时候,销毁对象
如果对象没有被销毁,则该对象一定作为可以复用的对象而不是存在多个 - 内存区分
寄存器(Registers): 用于存储指令,地址,数据
栈 Stack 存放基本类型的数据 对象的引用和函数地址(生命周期结束后,由GC系统回收,速度慢)
堆 Heap 存放对象的本身和数组,开发者控制(生命周期结束后,由虚拟机回收,速度快)
静态域 static field 存储静态变量
常量池 constant pool 存储常量
----------------
常见内存类型
VSS 虚拟耗用内存
RSS 实际使用的物理内存
PSS 实际使用的物理内存
USS 进程独占的物理内存 - 系统内存分析工具
process stats 开发者选项中
apps-Running 正在运行的应用 设置中
Dumpsys Meminfo 内存快照(adb shell dumpsys meminfo <包名>)
Dumpsys Procestats 指定时间段内的内存分配状况 (adb shell dumpsys procstats -h ) - 内存信息概念
share内存 每个app进程所获取到的share的内存的值
private内存 每个应用独享的那部分已分配的内存
-----
Dirty 内存 存储的RAM中的内存数据,当RAM中清楚之后,需要重新获取原内存中的数据
Clean 内存 缓存在文件中,当RAM中清除之后,可以重新从文件中读取 - GC系统 Gabage Collection 垃圾回收
android2.3:一次完整的Heap遍历,内存越大,GC时间越长
android4.4:遍历一部分的Heap,但是会产生比较多的内存碎片
android5.0:加快了清理速度,减少了打断进程的次数,整理内存碎片
常见的GCRoot对象:
class,JNI,Thread,Stack,静态,常量 - ActivityManager.MemoryInfo
ActivityManager am = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
am.getMemoryInfo(memoryInfo);
// memoryInfo.totalMem 系统可用内存
// memoryInfo.availMem 系统当前剩余内存
// memoryInfo.lowMemory 是否处于低内存状态
// memoryInfo.threshold 内存阀值
am.getMemoryClass();//单个app的最大值
am.getLargeMemoryClass();//单个app的最大值(申请large heap)
// Formatter.formatFileSize()//格式化数据
- Debug,MemoryInfo
Debug.MemoryInfo memoryInfo1 = new Debug.MemoryInfo();
Debug.getMemoryInfo(memoryInfo1);
// memoryInfo1.dalvikPrivateDirty
// memoryInfo1.dalvikPss
// memoryInfo1.dalvikSharedDirty
memoryInfo1.getTotalPss();
memoryInfo1.getTotalSharedDirty();
//获取的值和adb memoryinfo 类似
- Runtime
Runtime.getRuntime().totalMemory();//总计内存
Runtime.getRuntime().freeMemory();//剩余的内存 总计内存-剩余内存=已经使用的内存
Runtime.getRuntime().maxMemory();//最大的内存限制
- 获取更多内存的方法
通过子线程(webView难以回收,放到子线程中,通过kill Process来完成回收)
通过使用native Heap
使用OpenGL
LargeHeap - 系统内存警告
LMK:低内存管理系统
onlowmermory 是lmk低内存管理系统发出的系统警告,当此方法被调用时,所有进程级别为background的进程已经被kill
ComponentCallbacks,可以使用上下文菜单
context.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration configuration) {
}
@Override
public void onLowMemory() {
}
});
onTrimMemory
此时app处于奇台运行的状态
TRIM_MEMORY_RUNNING_MODERATE 一级警告 系统即将执行LMK
TRIM_MEMORY_RUNNING_LOW 二级警告 内存已经接近LMK阀值
TRIM_MEMORY_RUNNING_CRITICAL 三级警告 LMK已经杀掉优先级为Background的进程
------------------------
此时app处于后台运行的状态
TRIM_MEMORY_BACKGROUND 一级警告 LMK准备将app列为准备杀掉的对象
TRIM_MEMORY_MODERATE 二级警告 列为准备杀掉的对象
TRIM_MEMORY_COMPLETE 三级警告 即将杀掉此app
------------------------
TRIM_MEMORY_UI_HIDDEN ui元素被全部隐藏
------------------------
模拟信号
adb shell dempsys gfxinfo 包名-cmd trim level