资源
RES资源里最应该优化的就是图片了,可以减少安装包大小,可以降低app内存消耗等,一般的优化如下:
- png压缩
如果是png,且图片过大,建议使用Tinypng进行压缩。
TinyPng使用智能的有损压缩算法,通过减少图片的颜色,从而在几乎不影响视觉的情况下,显著的减少图片的体积。
例如:一个2M的图片可以压缩到200K,甚至更小,且不影响视觉效果。
具体可参考:
http://blog.csdn.net/fuchaosz/article/details/51829662
- 不同drawable目录适配方案1
为了支持多种屏幕尺寸和密度,Android 为多种屏幕提供不同的资源目录进行适配。
为不同屏幕密度提供不同的位图可绘制对象,可用于密度特定资源的配置限定符,
包括 ldpi(低)、mdpi(中)、 hdpi(高)、xhdpi(超高)、xxhdpi (超
超高)和 xxxhdpi(超超超高)。
根据当前的设备屏幕尺寸和密度,将会寻找最匹配的资源,如果将高分辨率图片放
入低密度目录,将会造成低端机加载过大图片资源,又可能造成 OOM,同时也是资
源浪费,没有必要在低端机使用大图。
3.不同drawable目录适配方案2
如果资源图片体积不大,目标手机最低版本设置较高,如大于4.4等,也可以选择只放置一种drawable图片,如xxxhdpi,
这样可以带来的好处就是:减少安装包大小,同时美术人员工作也轻松一些;
带来的问题:低端手机在对应的drawable目录下找不到对应的图片,会使用其他drawable中的图片,
加载到内存并压缩使用,也就是在低端手机上增加了额外的内存开销,要小心OOM。
4.大图处理
对于一些特大的图,如果不是启动APP必须使用的图片,也可以放在服务器端,
根据需要下载并缓存使用,可减少压缩包大小。
- 颜色
与图片相比,我们更应该考虑使用纯色、渐变色、shape等来实现想要的效果。
布局
1.布局嵌套
布局中不得不使用 ViewGroup 多重嵌套时,不要使用 LinearLayout 嵌套,
改用 RelativeLayout,通过其相对属性进行合理控制,可以有效降低嵌套数。
Android 应用页面上任何一个 View 都需要经过 measure、layout、draw 三个步骤
才能被正确的渲染。
从 xml layout 的顶部节点开始进行 measure,每个子节点都需
要向自己的父节点提供自己的尺寸来决定展示的位置,在此过程中可能还会重新
measure(由此可能导致 measure 的时间消耗为原来的 2-3 倍)。
节点所处位置越深,套嵌带来的 measure 越多,计算就会越费时。
这就是为什么扁平的 View 结构会性能更好。
理想情况下,总共的 measure,layout,draw 时间应该被很好的控制在 16ms以内,以保证滑动屏幕时 UI 的流畅。
要找到那些多余的 View(增加渲染延迟的 view),可以用 Android Studio Monitor
里的 Hierarachy Viewer 工具,可视化的查看所有的 view。
2.过渡绘制
禁止在设计布局时多次设置子 view 和父 view 中为同样的背景造成页面过
度绘制,推荐将不需要显示的布局进行及时隐藏。
例如:父View加载背景色,子View与其色一致,不需要再为子View设置背景色;
- 灵活使用
灵活使用布局,推荐 Merge、ViewStub 来优化布局,尽可能多的减少 UI
布局层级,推荐使用 FrameLayout,LinearLayout、RelativeLayout 次之
- 防止父View频繁刷新
在需要时刻刷新某一区域的组件时,建议通过以下方式避免引发全局 layout
刷新:
1) 设置固定的 view 大小的高宽,如倒计时组件等;
2) 调用 view 的 layout 方式修改位置,如弹幕组件等;
3) 通过修改 canvas 位置并且调用 invalidate(int l, int t, int r, int b)等方式限定刷新
区域;
4) 通过设置一个是否允许 requestLayout 的变量,然后重写控件的 requestlayout、
onSizeChanged 方法 , 判 断 控 件 的大小 没 有 改 变 的 情况下 , 当 进 入
requestLayout 的时候,直接返回而不调用 super 的 requestLayout 方法。
请参考自定义控件相关的文章;
- ScrollView 嵌套禁忌
不能使用 ScrollView 包裹 ListView/GridView/ExpandableListVIew;因为这
样会把 ListView 的所有 Item 都加载到内存中,要消耗巨大的内存和 cpu 去绘制图
面。
说明:
ScrollView 中嵌套 List 或 RecyclerView 的做法官方明确禁止。除了开发过程中遇到
的各种视觉和交互问题,这种做法对性能也有较大损耗。ListView 等 UI 组件自身有
垂直滚动功能,也没有必要在嵌套一层 ScrollView。目前为了较好的 UI 体验,更贴
近 Material Design 的设计,推荐使用 NestedScrollView。
- 编码格式
源文件统一采用 UTF-8 的形式进行编码。
例如:
第一篇: 安卓编程技巧总结(1) 资源与UI布局处理
https://www.jianshu.com/p/ff97b15d5c9d
第二篇: 安卓编程技巧总结(2) 基础组件开发
https://www.jianshu.com/p/b05752377887
第三篇:安卓编程技巧总结(3) 进程与线程处理
https://www.jianshu.com/p/7d05c8a368bd
第四篇:安卓编程技巧总结(4) 数据文件处理
https://www.jianshu.com/p/0515df3b697d
第五篇:安卓编程技巧总结(5) 图片处理
https://www.jianshu.com/p/76690b2ba310
第六篇:安卓编程技巧总结(6) APP安全分析
https://www.jianshu.com/p/4347ff392122
第七篇:安卓编程技巧总结(7) 性能检测代码分析
https://www.jianshu.com/p/687f3c641408