性能检测和分析工具 一

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