7、延长电池续航时间

  尽管应用有时看起来没做多少事,但实际上可能会很耗电,运行不了多久就会把电量榨干,使设备开机不到半天就没电了。那些被归为“电池杀手”的应用,最终的宿命就是被删除、得差评、不挣钱。因此作为开发者要尽量少用电量,合理使用电池。

  在三星GalaxyTab10.1中运行愤怒小鸟作为对比,平板各组件耗电可见一般:

  截图中Screen和Wi-Fi分列一二,远超作为游戏的愤怒小鸟。针对这两个组件,设备提供了相应选项让用户对它们的使用方式进行配置。例如,用户可调节屏幕的亮度(手动或根据所显示的图像自动),设定多长时间没有活动后屏幕关闭,屏幕关闭时Wi-Fi也关闭。例如,Wi-Fi连接如果在屏幕关闭后立即断开,那可能只占电池总使用量的百分之几。

7.2 广播接收器

  将注册放到onStart(),注销放到onStop()中是最显而易见的做法,为节省更多的电量,通常在onResume()和onPause()中也进行注册与注销

  如果需要知道当前电池信息,但不想用通知更新的方式,可调用registerReceiver()并把接收器参数设为null,无须注册任何广播接收器,就能得到包含电池信息的Intent。

  测量电池用量,建议在应用启动时获取电池当前电量,运行一段时间,在退出时再次获取电池电量。两电量之间的差异并不表示应用真实的耗电量,因为有其他应用同时在运行,所以需要有更好的方法测量单个应用的耗电量。如,计算出在电池电量耗光前,应用还可运行多久。

  为节省电量,应用应避免执行做无用功的代码。

  Android定义了应用可使用的5个广播Intent:

  1. ACTION_BATTERY_CHANGED
  2. ACTION_BATTERY_LOW
  3. ACTION_BATTERY_OKAY
  4. ACTION_POWER_CONNECTED
  5. ACTION_POWER_DISCONNECTED

  上述动作只要有一个发生,应用就会启动(如果它尚未启动)。虽然这可能是期望的行为,但很多情况下,你可能希望应用有不同的处理。例如这种情况,应用在前台运行时显示Toast消息是有意义的;若在后台时还出现Toast消息,就会干扰其他应用,损害用户体验

  当应用不在运行或在后台运行时,禁用这些Toast消息,可采用以下两种方法:

  1. 在应用中加入标记变量,在Activity的onResume()中置为true、在onPause()中置为false,并修改接收器的onReceive()方法,检查标记的值
  2. 只有当应用在前台运行时才可以启用广播接收器

  第一种方法虽可行,但只要动作之一被处罚,应用就会启动。最终会导致执行了不必要的指令,相当于执行no-op(无操作)指令,白白耗费电量。此外,如果应用包含多个Activity,修改标记会影响到多个文件

  第二种方法就好多了,因为我们可以确保只有在真正需要时才执行指令,就不会浪费电池电量。为了达到这一目标,我们需要在应用中做两件事:

  1. 广播接收器默认是禁用的;
  2. 广播接收器必在onResume()中启用,在onPause()被禁用

7.9 总结

  用户通常不会注意到应用是否延长了电池寿命。但是,若不做,更有可能会被注意到。因为单个应用可让所有其他人的努力化为泡影,所有应用都需通力配合,最大限度地延长电池的使用时间。用户会卸载耗电的应用,要合理使用电池,但也应当给用户配置选项的自由,因为不同的用户会有不同的需求。给你的用户配置的权利。

8、图形

8.3 OpenGL ES

  纹理压缩

  纹理定义了OpenGL ES应用的外观。虽然未压缩的纹理使用起来很方便,但这种纹理会迅速让应用变得冗赘不堪。如,未压缩的256×256的RGBA8888纹理就会占用256KB的内存

  未压缩的纹理对性能有负面影响,它们不像压缩过的能够缓存(因为比较小),且还要多次访问内存(影响功耗)。使用未压缩过纹理的应用体积也更为庞大,需要更多的时间来下载安装。此外,Android设备的内存通常是有限的,所以应尽可能占用较少内存。

  Mipmap

  通常,三维场景中出现在背景的对象,在屏幕上不会占用多少空间。如,屏幕上显示为10×10的对象使用256×256纹理就是浪费资源(内存、宽带)。Mipmap通过提供多层次细节的纹理来解决这个问题。

  虽然Mipmap包会比原始图像多用掉33%的内存,但它不仅可提升性能,也会提高图像质量。

  纹理如何渲染也取决于选择的那个glTexParameter()方法(比如glTexParamteri())设置的纹理参数。如,可调用glTexParamteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, param)设置缩小功能,param可取以下值:

  • GL_NEAREST
  • GL_LINEAR
  • GL_NEAREST_MIPMAP_NEAREST
  • GL_NEAREST_MIPMAP_LINEAR
  • GL_LINEAR_MIPMAP_NEAREST
  • GL_LINEAR_MIPMAP_LINEAR

  GL_NEAREST一般比GL_LINEAR快,GL_LINEAR又比其他四个更快,越慢的函数得到的视觉质量越好。应用程序会选择什么样的参数可能取决于用户的爱好(加入你提供方法让用户自行配置渲染质量),但许多用户不会有耐心尝试各种配置,找出合适自己设备的组合。因此,应用要自己选出最优的OpenGL配置

  多APK

  由于可能要支持多种纹理压缩格式(尽可能为每个设备都做优化),Mipmap需占用较大的空间,应用可能会超过Android Market(目前为50M字节)定义的大小限制

  若出现这种情况,基本上有三种选择:

  1. 减少应用的大小,如只支持ETC1纹理压缩;
  2. 安装应用后从远程服务器下载纹理;
  3. 生成多个APK,每个对应一套纹理

9、RenderScript

  Honeycomb(API等级11)引入了RenderScript,它是一个针对高性能3D渲染和计算操作的新框架。Android2.1(Eclair)后来也引入了这个框架,但Honeycomb是第一个正式将RenderScript公之于众的版本。

  RenderScript和NDK都是为了提高应用的性能而引入的。虽然它们有共同的目标,但应仔细斟酌它们的区别。

9.1 RenderScript优点:

  1. 平台独立(ARM、MIPS、Intel);
  2. 易于并行执行;
  3. 可使用CPU、GPU或其他处理器。

9.2 RenderScript缺点:

  1. Android独有(脚本不能用在其他平台,如IOS);
  2. 学习难度;
  3. API数量有限

  RenderScript的实际性能测试结果很难得到,它们实在太依赖Android版本和硬件设备了。一些脚本的运行速度可能远超Java或NDK的对应实现,而其他的可能不会。若因为遗留代码的缘故,或这样做更有意义,那么大可在实际中让应用同时使用RenderScript和NDK。

9.3 小结

  虽然它似乎仍是Honeycomb带来的略显稚嫩的技术,RenderScript已在Android4.0中有所改善,在将来会更好地发挥硬件的优势。尽管试下ARM是Android移动设备的主要平台,使用NDK时合理的选择,可RenderScript是独立于平台的,这样可显著降低成本,带来巨大的收益。总的来说,RenderScript挺有前景,且很有可能是未来应用的很重要的组成部分,会用在单靠Java不能满足性能需求的地方。

《Android应用性能优化》3——电量、渲染的更多相关文章

  1. Android应用性能优化(转)

    人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...

  2. Android客户端性能优化(魅族资深工程师毫无保留奉献)

    本文由魅族科技有限公司资深Android开发工程师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的Androi ...

  3. android app性能优化大汇总(google官方Android性能优化典范 - 第2季)

    Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...

  4. Android APP 性能优化的一些思考

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  5. Android app 性能优化的思考--性能卡顿不好的原因在哪?

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  6. android app性能优化大汇总

    这里根据网络上各位大神已经总结的知识内容做一个大汇总,作为记录,方便后续“温故知新”. 性能指标: (1)使用流畅度:  图片处理器每秒刷新的帧数(FPS),可用来指示页面是否平滑的渲染.高的帧率可以 ...

  7. 包建强的培训课程(9):Android App性能优化

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  8. Android开发性能优化总结(一)

    安卓开发应用首先要讲究良好的用户体验,如果一款软件卡顿现象严重,不流畅,经常崩溃,那么将给用户带来极不良好的体验,从而损失用户. 在实际开发和学习中,我总结了一下关于安卓性能的优化,供大家参考交流. ...

  9. Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手

    图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降 ...

  10. android app性能优化大汇总(UI渲染性能优化)

    UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...

随机推荐

  1. 基于SceneControl单击查询功能的实现

    private void HandleIdentify_MouseDown(object sender, ISceneControlEvents_OnMouseDownEvent e) { this. ...

  2. 几个CSS-content的小例子

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Chinese Seals

    Emperors used seals to proclaim their decrees to their people, officials used seals to exercise thei ...

  4. 关于java的volatile关键字与线程栈的内容以及单例的DCL

    用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值.volatile很容易被误用,用来进行原子性操作. package com.guangshan.test; pub ...

  5. inline函数的作用

    (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...

  6. 开源WebGIS实施方案(六):空间数据(PostGIS)与GeoServer服务迁移

    研发环境的变更,或者研发完成进行项目现场实施.运维的时候,经常就会面临数据及服务的迁移,这其中就包含空间数据以及GeoServer服务的迁移工作. 这里需要提醒的是:如果采用的是类似的开源WebGIS ...

  7. 微软研发流程(ALM)管理培训会议(比亚迪汽车)

    主要讨论和演示整体研发流程,包括需求管理.项目计划.开发管理.生成和发布.测试管理等. Figure 1 - 客户现场培训 Figure 2 - 客户现场培训 Figure 3 - 客户现场培训

  8. Checkpoint--实现步骤

    Checkpoint 实现步骤: 1.将CheckPoint标记写入日志(标记中包含当前数据库中活动的事务信息),并将Log Block写入持久化存储 2.将Buffer Pool中所有的脏页写入磁盘 ...

  9. ubuntu Mono+Jexus 部署到 ASP.NET MVC 5

    之前搞了很多次都是卡在了razor那个异常哪里,今天心血来潮就在试一试,一试竟然成功了,激动的我赶紧记录下历程.废话不说,走起... ubuntu 16.04 安装mono(最新版 5.14.0) 官 ...

  10. 使用ABP框架踩过的坑系列1

        企业级(例如ERP)应用, 一遍一遍的在重复:认证.验证.异常处理.日志.国际化和本地化.数据库连接管理.配置管理. 审计记录等,同时.NET有很多最佳实践:分层.模块化.DDD领域驱动.DI ...