1 测CPU:方法耗时 traceView
使用
TraceView
查看耗时,主要关注
Calls+Recur Calls/Total
和
Cpu Time/Call
这两个值,
也就是关注调用次数多和耗时久的方法,然后优化这些方法的逻辑和调用次数,减少耗时
2 UI卡顿情况 Systrace
(
1
)
Alerts
Alerts
一栏标记了性能有问题的点,
(
2
)
Frame
每个应用都有一行专门显示
frame
,每一帧就显示为一个绿色的圆圈。当显示为黄色或
者红色时,它的渲染时间超过了
16.6ms
(即达不到
60fps
的水准)。
如果想知道
UI
线程怎么会花费这么多时间的话,
讲到的
TraceView
,
来分析具体是哪些函数在消耗时间。
3 Ui层级 Lint查层级数目+ Hierarchy View具体分析一个层级耗时
lint
TooDeepLayout
:表示布局太深,默认
层级超过
10
层会提示该问题,可以自定义环境
变量
ANDROID_LINT_MAX_DEPTH
来修改。布局深度增加会导致内存消耗也随之增加,因此
布局尽可能浅而宽。
·
TooManyViews
:表示控件太多,默认
超过
80
个控件
会提示该问题。
1 view
表示这个控件是这个树下的最后一个控件,即表示是
它本身,下面的时间表示
Measure
、
Layout
以及
Draw
三个阶段的耗时。最后一个框有不同
色的三个指示灯,分别对应当前控件在测量、布局以及画视图三个阶段,颜色表示这个控件
占用的时间百分比,如果是绿色的,表示该控件在该阶段比其他
50%
的控件的速度要快,黄
色表示比其他
50%
的控件的速度要慢,红色表示该控件在该阶段的处理速度是最慢的,就需
要注意了。
代码编写减少层级规则:
1 按需RelativeLayout
尽量使用 RelativeLayout
和
LinearLayout
。
·在布局层级相同的情况下,使用
LinearLayout
。
·用
LinearLayout
有时会使嵌套层级变多,应该使用
RelativeLayout
,使界面尽
量扁平化。
2 在根元素上的Merge使用
如果
Merge
代替的布局元素为
LinearLayout
,在自定义布局代码中将
LinearLayout
的属性添加到引用上,如垂直或水平布局、背景色等
但
Merge
不是所有地方都可以任意使用,有以下几点要求:
·
Merge
只能用在布局
XML
文件的根元素。
·使用
merge
来加载一个布局时,必须指定一个
ViewGroup 作为其父元素,并且
要设置加载的
attachToRoot
参数为
true
(参照
inflate
(
int
,
ViewGroup
,
boolean
))。
·不能在
ViewStub
中使用
Merge
标签。原因就是
ViewStub
的
inflate
方法中根本没
有
attachToRoot
的设置。
3 提高显示速度 ViewStub
https://blog.csdn.net/mulanlong/article/details/88669172
ViewStub
是一个轻量级的
View
,它是一个看不见的,并且不占布局位置,占用资源非
常小的视图对象。可以为
ViewStub
指定一个布局,加载布局时,只有
ViewStub
会被初始化,
然后当
ViewStub
被设置为可见时,或是调用了
ViewStub.inflate
()时,
ViewStub
所指向的
布局会被加载和实例化,然后
ViewStub
的布局属性都会传给它指向的布局。这样,就可以
使用
ViewStub
来设置是否显示某个布局。
ViewStub
显示有两种方式,上面代码使用的是
inflate
方法,也可以直接使用
ViewStub.setVisibiltity
(
View.Visible
)方法。
使用
ViewStub
时需要注意以下几点:
·
ViewStub
只能加载一次,之后
ViewStub
对象会被置为空。换句话说,某个被
ViewStub
指定的布局被加载后,就不能再通过
ViewStub
来控制它了。所以它不适用于需要按需显示
隐藏的情况。
·
ViewStub
只能用来加载一个布局文件,而不是某个具体的
View
,当然也可以把
View
写在某个布局文件中。如果想操作一个具体的
View
,还是使用
visibility
属性。
·
VIewStub
中不能嵌套
Merge
标签。
不过这些限制都无伤大雅,我们还是能够用
ViewStub
来做很多事情,
ViewStub
的主要
使用场景如下:
·在程序运行期间,某个布局在加载后,就不会有变化,除非销毁该页面再重新加
载。
·想要控制显示与隐藏的是一个布局文件,而非某个
View
4 布局复用 include
titlebar
·布局的层级越少,加载速度越快。
·减少同一层级控件的数量,加载速度会变快。
·一个控件的属性越少,解析越快。
根据本节的分析,对优化的总结如下:
·尽量多使用
RelativeLayout
或
LinearLayout
,不要使用绝对布局
AbsoluteLayout
。
·将可复用的组件抽取出来并通过
<include/>
标签使用。
·使用
<ViewStub/>
标签加载一些不常用的布局。
·使用
<merge/>
标签减少布局的嵌套层次。
·尽可能少用
wrap_content
,
wrap_content
会增加布局
measure
时的计算成本,已
知宽高为固定值时,不用
wrap_content
。
·删除控件中的无用属性。
4 内存 memory monitor
内存分配与释放
大内存与抖动
5 heap viewer 整体堆内存看大小
6 内存泄漏具体场景allocation tracker 跟踪
https://blog.csdn.net/hpc19950723/article/details/53542490
7内存分析工具MTA
https://www.cnblogs.com/linghu-java/articles/10565730.html
8代码编写
1.
资源性对象未关闭
2.
注册对象未注销
3.
类的静态变量持有大数据对象
4.
非静态内部类的静态实例
5.Handler
临时性内存泄漏
6.
容器中的对象没清理造成的内存泄漏
9 内存泄漏LeakCanary
https://www.jianshu.com/p/a5e69a2e093f
10 优化空间
对象引用:
强软弱
11减少内存使用
AutoBoxing自动装箱
内存复用
有效利用系统自带的资源
视图复用
对象池
Bitmap
对象的复用
数据类型优化
1 hashmap-arrayMap
https://www.cnblogs.com/clwydjgs/p/9185574.html
2 枚举类型
intDef SrtingDef
3 LruCache
图片内存优化
设置位图格式RGB_565
inSampleSize
inScaled,inDensity 和 inTargetDensity
inBitmap
bitmap复用
图片缓存