您的位置:首页 > 职场人生

Android知识架构 · 电话面试 · 性能优化和兼容性

2016-10-31 17:34 453 查看
这篇文章介绍两个问题:性能优化和兼容性。

兼容性

兼容性,另一种说法叫做“适配性”。下面分三部分进行介绍:屏幕适配、语言适配、系统版本适配。

屏幕适配

针对不同的屏幕尺寸

有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