Android知识架构 · 电话面试 · 性能优化和兼容性
2016-10-31 17:34
453 查看
这篇文章介绍两个问题:性能优化和兼容性。
有4种普遍尺寸:小(small),普通(normal),大(large),超大(xlarge)
有4种普遍分辨率:低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi)
为了解决屏幕大小不统一的问题,我们需要为不同屏幕尺寸的手机建立不同的
在Android3.2之后,可以使用最小宽度限定词,例如600dp之上的屏幕才能使用的文件夹可以命名为
ps:可以自定义布局文件,然后在标准的布局文件中引用,如下
针对不同的屏幕分辨率
有几个方面:
①:使用密度独立像素;
②:对不同的屏幕密度设备,提供不同的bitmap资源;
③:使用.9图片;
ldpi资源不是必须的,如果提供了hdpi资源,系统会自动适应ldpi屏幕。
通过运行时检查系统版本,使高版本的代码在当前版本达到要求时才起作用。
参考:http://hukai.me/android-training-course-in-chinese/basics/supporting-devices/platforms.html
渲染操作通常依赖于两个核心组件:CPU与GPU。CPU负责包括Measure,Layout,Record,Execute的计算操作,GPU负责Rasterization(栅格化)操作。CPU通常存在的问题的原因是存在非必需的视图组件,它不仅仅会带来重复的计算操作,而且还会占用额外的GPU资源。
Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的UI结构里面,如果不可见的UI也在做绘制的操作,会导致某些像素区域被绘制了多次。这样就会浪费大量的CPU以及GPU资源。我们可以通过手机设置里面的开发者选项,打开Show GPU Overdraw的选项,观察UI上的Overdraw情况。
对于那些过于复杂的自定义的View(通常重写了onDraw方法),Android系统无法检测在onDraw里面具体会执行什么操作,系统无法监控并自动优化,也就无法避免Overdraw了。但是我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。我们还可以使用canvas.quickreject()来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的绘制操作。
参考:
https://www.kancloud.cn/kancloud/android-performance/53234
http://www.trinea.cn/android/layout-performance/
参考:https://www.kancloud.cn/kancloud/android-performance/53233
参考:https://www.kancloud.cn/kancloud/android-performance/53235
Batching是在真正执行运算操作之前对数据进行批量预处理,例如你需要有这样一个方法,它的作用是查找某个值是否存在与于一堆数据中。假设一个前提,我们会先对数据做排序,然后使用二分查找法来判断值是否存在。我们先看第一种情况,下图中存在着多次重复的排序操作。
Caching的理念很容易理解,在很多方面都有体现,下面举一个for循环的例子:
参考:https://www.kancloud.cn/kancloud/android-performance/53236
http://www.trinea.cn/android/java-android-performance/
内存溢出、内存泄漏
内存泄漏 (memory leak):表示的是不再用到的对象因为被错误引用而无法进行回收。
内存溢出 (out of memory):指程序在申请内存时,没有足够的内存空间供其使用.
String、StringBuilder、StringBuffer
String:字符串常量
StringBuffer:字符串变量,线程安全的。多线程操作字符串缓冲区 下操作大量数据
StringBuilder:字符串变量,线程非安全的。单线程操作字符串缓冲区 下操作大量数据。
FPS、TPS
FPS:每秒传输帧数(Frames Per Second),是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。
TPS:每秒事物处理量(Transaction Per Second) ,用于表示事件处理速率。
兼容性
兼容性,另一种说法叫做“适配性”。下面分三部分进行介绍:屏幕适配、语言适配、系统版本适配。屏幕适配
针对不同的屏幕尺寸有4种普遍尺寸:小(small),普通(normal),大(large),超大(xlarge)
有4种普遍分辨率:低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi)
为了解决屏幕大小不统一的问题,我们需要为不同屏幕尺寸的手机建立不同的
layout文件夹,例如,在
res文件夹下建立
layout、
layout-large、
layout-land、
layout-large-land,在这些layout文件夹下,可以根据屏幕大小和横竖屏,进行不同的界面布局。
在Android3.2之后,可以使用最小宽度限定词,例如600dp之上的屏幕才能使用的文件夹可以命名为
layout-sw600dp。
ps:可以自定义布局文件,然后在标准的布局文件中引用,如下
<resources> <item name="main" type="layout">@layout/my_layout</item> </resources>
针对不同的屏幕分辨率
有几个方面:
①:使用密度独立像素;
②:对不同的屏幕密度设备,提供不同的bitmap资源;
③:使用.9图片;
res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
ldpi资源不是必须的,如果提供了hdpi资源,系统会自动适应ldpi屏幕。
语言适配
为了支持多国语言,可以新建不同的values文件,如values-fr代表法语。后边的两位字母为国家代码号,根据 ISO 639-1 语言代码定义。
系统版本适配
比同版本,比较宽泛了。通过AndroidManifest.xml配置好app支持的最低版本,慎重使用低版本不支持的语法。通过运行时检查系统版本,使高版本的代码在当前版本达到要求时才起作用。
private void setUpActionBar() { // Make sure we're running on Honeycomb or higher to use ActionBar APIs if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); } }
参考:http://hukai.me/android-training-course-in-chinese/basics/supporting-devices/platforms.html
性能优化
渲染优化(布局优化)
大多数手机的屏幕刷新频率是60hz,如果在1000/60=16.67ms内没有办法把这一帧的任务执行完毕,就会发生丢帧的现象。丢帧越多,用户感受到的卡顿情况就越严重。渲染操作通常依赖于两个核心组件:CPU与GPU。CPU负责包括Measure,Layout,Record,Execute的计算操作,GPU负责Rasterization(栅格化)操作。CPU通常存在的问题的原因是存在非必需的视图组件,它不仅仅会带来重复的计算操作,而且还会占用额外的GPU资源。
Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的UI结构里面,如果不可见的UI也在做绘制的操作,会导致某些像素区域被绘制了多次。这样就会浪费大量的CPU以及GPU资源。我们可以通过手机设置里面的开发者选项,打开Show GPU Overdraw的选项,观察UI上的Overdraw情况。
对于那些过于复杂的自定义的View(通常重写了onDraw方法),Android系统无法检测在onDraw里面具体会执行什么操作,系统无法监控并自动优化,也就无法避免Overdraw了。但是我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。我们还可以使用canvas.quickreject()来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的绘制操作。
参考:
https://www.kancloud.cn/kancloud/android-performance/53234
http://www.trinea.cn/android/layout-performance/
内存优化
Memory Churn内存抖动,内存抖动是因为在短时间内大量的对象被创建又马上被释放。瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,会触发GC从而导致刚产生的对象又很快被回收。参考:https://www.kancloud.cn/kancloud/android-performance/53233
电量优化
为了减少电量的消耗,在蜂窝移动网络下,最好做到批量执行网络请求,尽量避免频繁的间隔网络请求。参考:https://www.kancloud.cn/kancloud/android-performance/53235
运算优化(代码优化)
为了提升运算性能,这里介绍2个非常重要的技术,Batching与Caching。Batching是在真正执行运算操作之前对数据进行批量预处理,例如你需要有这样一个方法,它的作用是查找某个值是否存在与于一堆数据中。假设一个前提,我们会先对数据做排序,然后使用二分查找法来判断值是否存在。我们先看第一种情况,下图中存在着多次重复的排序操作。
Caching的理念很容易理解,在很多方面都有体现,下面举一个for循环的例子:
参考:https://www.kancloud.cn/kancloud/android-performance/53236
http://www.trinea.cn/android/java-android-performance/
数据库优化
http://www.trinea.cn/android/database-performance/网络优化
http://www.trinea.cn/android/mobile-performance-optimization/内存溢出、内存泄漏
内存泄漏 (memory leak):表示的是不再用到的对象因为被错误引用而无法进行回收。
内存溢出 (out of memory):指程序在申请内存时,没有足够的内存空间供其使用.
String、StringBuilder、StringBuffer
String:字符串常量
StringBuffer:字符串变量,线程安全的。多线程操作字符串缓冲区 下操作大量数据
StringBuilder:字符串变量,线程非安全的。单线程操作字符串缓冲区 下操作大量数据。
FPS、TPS
FPS:每秒传输帧数(Frames Per Second),是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。
TPS:每秒事物处理量(Transaction Per Second) ,用于表示事件处理速率。
相关文章推荐
- Android知识架构 · 电话面试 · 组件
- Android知识架构 · 电话面试 · View的绘制流程
- Android知识架构 · 电话面试 · Android事件分发机制
- Android知识架构 · 电话面试 · Java的编程思想
- Android知识架构 · 电话面试 · Android线程和进程以及安全问题
- Android 性能优化的一些知识
- 求 架构设计 的视屏和 设计模式的视频 性能优化 的视频 系统源码分析 的视频 android
- 动脑学院android java VIP 性能优化 高级ui ndk 移动架构 面试专题
- Android面试——APP性能优化
- Android Mvp架构设计与性能优化
- "Android"性能优化措施之面试必问点-<include>,<merge>,<ViewStub>
- android知识回顾---UI和性能优化
- 面试MCS PFE电话面试 sqlserver性能优化想到的
- "Android 性能优化"-Android面试必问"精华技能点"汇总
- 动脑学院安卓VIP 性能优化 高级ui ndk 移动架构 面试专题
- Android性能优化(面试必备)
- Android性能优化(面试必备)
- Android面试——APP性能优化
- Android小知识——关于Android内存、性能优化的一些细节
- 面试中该怎样回答Android性能优化的问题