除了疯狂堆料,安卓手机加性能、降功耗还有哪些路可以走?

除了疯狂堆料,安卓手机加性能、降功耗还有哪些路可以走?,第1张

1改善硬件设备,采用最新的高性能处理器,更大的内存和存储,以及更高端的显卡,以改善性能,同时降低功耗。 2改进操作系统,更新更快、更及时的操作系统,以有效提升手机性能,同时降低功耗。 3优化软件设计,尽可能地减少软件的内存使用,减少软件占用的CPU时间,以提升手机性能,同时降低功耗。 4采用更少的背景应用程序,减少不必要的应用程序的运行,以提升手机性能,同时降低功耗。 5安装更合理的系统优化软件,定期清理手机垃圾和无用文件,以提升手机性能,同时降低功耗。 6安装更有效率的应用程序,以提升手机性能,同时降低功耗。 7采用更高效的充电技术,有效提升手机电池的充电效率,以提升手机性能,同时降低功耗。 8采用更高效的电池技术,更大的电池容量,以提升手机性能,同时降低功耗。 9采用更高效的散热技术,尽可能减少手机在高性能运行时的发热量,以提升手机性能,同时降低功耗。 10采用省电模式,及时关闭不需要的设备,减少手机电池的放电,以提升手机性能,同时降低功耗。 11采用更新的无线通信技术,如Wi-Fi、蓝牙和4G等,以提升手机性能,同时降低功耗。 12采用更高效的电源管理技术,更好地分配电源,以提升手机性能,同时降低功耗。 13采用低功耗IC芯片,如ARM处理器,以提升手机性能,同时降低功耗。 14采用更高效的图形处理技术,如OpenGL ES,以提升手机性能,同时降低功耗。 15采用更高效的屏幕显示技术,如OLED和AMOLED,以提升手机性能,同时降低功耗。 16采用新型的芯片封装技术,如TSMC的3D IC封装技术,以提升手机性能,同时降低功耗。 17采用更高效的无线通信技术,如Wi-Fi Direct和NFC,以提升手机性能,同时降低功耗。 18采用更新的摄像头技术,如CMOS和CCD,以提升手机性能,同时降低功耗。 19采用更新的多任务处理技术,以提升手机性能,同时降低功耗。 20采用多核处理技术,更多核心处理器,以提升手机性能,同时降低功耗。 21采用更新的触摸屏技术,如N-trig,以提升手机性能,同时降低功耗。 22采用更新的芯片制作技术,如14nm FinFET,以提升手机性能,同时降低功耗。 23采用更新的显示屏技术,如Retina Display,以提升手机性能,同时降低功耗。 24采用更新的电池技术,如智能电池技术,以提升手机性能,同时降低功耗。 25采用更新的指纹识别技术,如苹果Touch ID,以提升手机性能,同时降低功耗。 26采用更新的声音处理技术,如Dolby Digital Plus,以提升手机性能,同时降低功耗。 27采用更新的输入设备技术,如苹果的Force Touch,以提升手机性能,同时降低功耗。 28采用更新的拍照技术,如双摄像头技术,以提升手机性能,同时降低功耗。 29采用更新的下载技术,如4G LTE,以提升手机性能,同时降低功耗。 30采用更新的存储技术,如UFS,以提升手机性能,同时降低功耗。 31采用更新的网络技术,如5G,以提升手机性能,同时降低功耗。 32采用更新的传感器技术,如苹果的3D Touch,以提升手机性能,同时降低功耗。 33采用更新的语音识别技术,如谷歌语音,以提升手机性能,同时降低功耗。 34采用更新的地图技术,如谷歌地图,以提升手机性能,同时降低功耗。 35采用更新的虚拟现实技术,如Oculus Rift,以提升手机性能,同时降低功耗。 36采用更新的电子书技术,如Kindle,以提升手机性能,同时降低功耗。 37采用更新的照片编辑技术,如Photoshop,以提升手机性能,同时降低功耗。 38采用更新的视频编辑技术,如iMovie,以提升手机性能,同时降低功耗。 39采用更新的加密技术,如AES,以提升手机性能,同时降低功耗。 40采用更新的视频传输技术,如Skype,以提升手机性能,同时降低功耗。 41采用更新的安全技术

性能优化的常用方法

主要内容包括布局优化,绘制优化,内存泄露优化,相应速度优化,ListView优化,Bitmap优化,线程优化等,下面主要给你举了其中的几个例子:

(1)布局优化

布局优化的思想很简单,就是尽量减少布局文件的层级。

如何进行优化呢?首先删除布局中无用的控件和层级,其次有选择地使用性能较低的ViewGroup,比如LinearLayout。如果布局中有的布局既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,这是因为RelativeLayout比较复杂,他的布局过程花费更多的CPU时间。FrameLayout和LinearLayout一样都是一种简单高效的ViewGroup,因此可以考虑使用他们,但是很多时候,单纯的通过一个LinearLayout或者FrameLayout无法实现产品的效果,需要通过嵌套的方式来完成,这种情况建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局的层级,同样会降低程序的性能。

布局优化的另一种手段是采用<include>标枪,<merge>标签和ViewStub。<include>标签主要用于布局重用,<merge>标签一般和<include>配合使用,它可以减少布局的层级。而ViewStub则提供了按需加载功能,当需要时才将ViewStub中的布局加载到内存,这提高了程序的初始化效率。

(2)绘制方法

绘制优化是指View的onDraw方法避免执行大量的操作,这主要有两方面。

首先,onDraw中不要创建新的布局对象,这是因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁的gc,降低了程序的执行效率。

另一方面,onDraw方法中不要做耗时的任务,也不能执行成千上万次循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。

(3)内存泄露优化

内存泄露在开发过程中是一个需要重视的问题,但是由于内存泄露问题对开发人员的经验和开发意识要求比较高,因此这是开发人员最容易犯的错误之一。内存泄露的优化分为两个方面,一方面是在开发过程中避免写出内存泄露的代码,另一方面通过一些分析工具比如MAT来找出潜在的内存泄露继而解决。

关于性能优化的建议

1避免黄健过多对象;

2不要过多使用枚举,枚举占用的内存空间比整型大一些。

3常量使用static final 来修饰。

4使用一些Android特有的数据结构,比如SpareArray和Pair等,他们都具有更好的性能。

5适当使用软引用和弱引用。

6采用内存缓存和磁盘缓存

7尽量采用静态内部类,这样可以避免潜在的内部类而导致的内存泄漏。

Google定义:界面呈现是指从应用生成帧并将其显示在屏幕上的动作。要确保用户能够流畅地与应用互动,应用呈现每帧的时间不应超过16ms,以达到每秒60帧的呈现速度(为什么是60fps?)。

如果应用存在界面呈现缓慢的问题,系统会不得不跳过一些帧,这会导致用户感觉应用不流畅,我们将这种情况称为卡顿。

来源于: Google Android的为什么是60fps?

16ms意味着1000/60hz,相当于60fps。这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。12fps大概类似手动快速翻动书籍的帧率, 这明显是可以感知到不够顺滑的。24fps使得人眼感知的是连续线性的运动,这其实是归功于运动模糊的效果。 24fps是**胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分**画面需要表达的内容,同时能够最大的减少费用支出。 但是低于30fps是 无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,超过60fps就没有必要了。如果我们的应用没有在16ms内完成屏幕刷新的全部逻辑操作,就会发生卡顿。

首先要了解Android显示1帧图像,所经历的完整过程。

如图所示,屏幕显示1帧图像需要经历5个步骤:

常见的丢帧情况: 渲染期间可能出现的情况,渲染大于16ms和小于16ms的情况:

上图中应该绘制 4 帧数据 , 但是实际上只绘制了 3 帧 , 实际帧率少了一帧

判断APP是否出现卡顿,我们从通用应用和游戏两个纬度的代表公司标准来看,即Google的Android vitals性能指标和地球第一游戏大厂腾讯的PrefDog性能指标。

以Google Vitals的卡顿描述为准,即呈现速度缓慢和帧冻结两个维度判断:

PerfDog Jank计算方法:

帧率FPS高并不能反映流畅或不卡顿。比如:FPS为50帧,前200ms渲染一帧,后800ms渲染49帧,虽然帧率50,但依然觉得非常卡顿。同时帧率FPS低,并不代表卡顿,比如无卡顿时均匀FPS为15帧。所以平均帧率FPS与卡顿无任何直接关系)

当了解卡顿的标准以及渲染原理之后,可以得出结论,只有丢帧情况才能准确判断是否卡顿。

dumpsys 是一种在设备上运行并转储需要关注的系统服务状态信息的 Android 工具。通过向 dumpsys 传递 gfxinfo 命令,可以提供 logcat 格式的输出,其中包含与录制阶段发生的动画帧相关的性能信息。

借助 Android 60(API 级别 23),该命令可将在整个进程生命周期中收集的帧数据的聚合分析输出到 logcat。例如:

这些总体统计信息可以得到期间的FPS、Jank比例、各类渲染异常数量统计。

命令 adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats 可提供最近120个帧中,渲染各阶段带有纳秒时间戳的帧时间信息。

关键参数说明:

通过gfxinfo输出的帧信息,通过定时reset和打印帧信息,可以得到FPS(帧数/打印间隔时间)、丢帧比例((janky_frames / total_frames_rendered)100 %)、是否有帧冻结(帧耗时>700ms)。

根据第2部分的通用应用卡顿标准,可以通过丢帧比例和帧冻结数量,准确判断当前场景是否卡顿。并且通过定时截图,还可以根据截图定位卡顿的具体场景。

如上图所示,利用gfxinfo开发的检查卡顿的小工具,图中参数和卡顿说明如下:

根据上面对gfxinfo的帧信息解析,可以准确计算出每一帧的耗时。从而可以开发出满足腾讯PerfDog中关于普通卡顿和严重卡顿的判断。

依赖定时截图,即可准确定位卡顿场景。如下图所示(此处以PerfDog截图示例):

通过第3部分的卡顿评估方法,我们可以定位到卡顿场景,但是如何定位到具体卡顿原因呢。

首先了解卡顿问题定位工具,然后再了解常见的卡顿原因,即可通过复现卡顿场景的同时,用工具去定位具体卡顿问题。

重点就是,充分利用gfxinfo输出的帧信息,对卡顿问题进行分类。

了解了高效定位卡顿的方法和卡顿问题定位工具,再熟悉一下常见的卡顿原因,可以更熟练的定位和优化卡顿。

SurfaceFlinger 负责 Surface 的合成,一旦 SurfaceFlinger 主线程调用超时,就会产生掉帧。

SurfaceFlinger 主线程耗时会也会导致 hwc service 和 crtc 不能及时完成,也会阻塞应用的 binder 调用,如 dequeueBuffer、queueBuffer 等。

后台进程活动太多,会导致系统非常繁忙,cpu \ io \ memory 等资源都会被占用,这时候很容易出现卡顿问题,这也是系统这边经常会碰到的问题。

dumpsys cpuinfo 可以查看一段时间内 cpu 的使用情况:

当线程为 Runnable 状态的时候,调度器如果迟迟不能对齐进行调度,那么就会产生长时间的 Runnable 线程状态,导致错过 Vsync 而产生流畅性问题。

system_server 的 AMS 锁和 WMS 锁 , 在系统异常的情况下 , 会变得非常严重 , 如下图所示 , 许多系统的关键任务都被阻塞 , 等待锁的释放 , 这时候如果有 App 发来的 Binder 请求带锁 , 那么也会进入等待状态 , 这时候 App 就会产生性能问题 ; 如果此时做 Window 动画 , 那么 system_server 的这些锁也会导致窗口动画卡顿。

Android P 修改了 Layer 的计算方法 , 把这部分放到了 SurfaceFlinger 主线程去执行, 如果后台 Layer 过多,就会导致 SurfaceFlinger 在执行 rebuildLayerStacks 的时候耗时 , 导致 SurfaceFlinger 主线程执行时间过长。

主线程执行 Input \ Animation \ Measure \ Layout \ Draw \ decodeBitmap 等操作超时都会导致卡顿 。

Activity resume 的时候, 与 AMS 通信要持有 AMS 锁, 这时候如果碰到后台比较繁忙的时候, 等锁操作就会比较耗时, 导致部分场景因为这个卡顿, 比如多任务手势操作。

应用里面涉及到 WebView 的时候, 如果页面比较复杂, WebView 的性能就会比较差, 从而造成卡顿。

如果屏幕帧率和系统的 fps 不相符 , 那么有可能会导致画面不是那么顺畅 比如使用 90 Hz 的屏幕搭配 60 fps 的动画。

由上面的分析可知对象分配、垃圾回收(GC)、线程调度以及Binder调用 是Android系统中常见的卡顿原因,因此卡顿优化主要以下几种方法,更多的要结合具体的应用来进行:

在计算机和通信领域,帧是一个包括“帧同步串行”的数字数据传输单元或数字数据包。

在视频领域,**、电视、数字视频等可视为随时间连续变换的许多张画面,其中帧是指每一张画面。

1、A跳转到B,需要经历A的onPause,B的onCreate,onStart,onResume,所以在这几个方法中不能做耗时的操作。

2、一进入页面不可见的视图可以用ViewStub做延迟加载。

3、网络请求可以在加载完页面控件后再进行。

4、慎用多进程。

5、初始化AnimationDrawable、TypedArray数组和Typeface会很耗时,并且AnimationDrawable特别耗内存,一定要注意他们的初始化时机;

如何对Android手机进行加速优化?

现在的Android手机功能越来越强大,但是,对于很多Android手机用户而言,使用一段时间后,手机会出现卡顿、运行缓慢的情况,影响了用户的使用体验。为了解决这种问题,在这里向大家介绍一些简单而有效的方法,帮助Android手机用户进行加速优化。

1清理手机内存:清理手机内存可以有效地释放手机内部的存储空间,并释放一些被占用的资源。这可以通过打开手机设置菜单,选择“存储”选项,然后点击“内部存储”来完成。一旦进入这个页面,用户可以选择清理应用程序缓存,卸载不需要的应用程序,或者将一些文件转移到外部存储设备中。这些步骤可以减少应用程序的大小,并增加可用存储空间,进而加快手机的运行速度。

2关闭应用程序:随着手机使用时间的增长,手机上运行的应用程序数量也会增加,而当应用程序过多时可能会导致手机运行缓慢。与之相比,停止或者关闭这些应用程序可以节约手机内存资源并让手机运行更快。为了实现这个目标,可以在手机后台打开多任务管理器,浏览正在运行的应用,然后选择不再需要的应用程序进行关闭操作即可。

3安装清理软件:与其他的优化方法相比,安装清理软件可以有效地加速Android手机,并通过清理不必要的缓存和废弃的文件占用同样的内存空间来释放存储空间。一些优秀的清理软件可以帮助用户清理不需要的文件,增加存储空间,并关闭不需要的进程。这些功能都可以通过软件的主界面来实现,大多数清理软件还可以提供帮助和优化用户系统的建议。

4更新和升级操作系统:定期更新和升级操作系统可以改善Android手机的运行速度,同时也保持手机上的应用程序最新和最稳定。这些操作可以通过在手机的设置菜单中选择“系统更新”来实现,如果出现新的操作系统可用,手机将会自动进行更新安装。

总之,采取这些提高手机运行速度的措施可以有效地优化Android手机的性能。不仅可以让手机运行更加稳定,也可以使用户的体验更加流畅。虽然这些方法有些麻烦,但是,如果遵循这些方法,您的手机将会时刻保持最佳的状态。

们也可以根据自己用手机的需要对手机进行彻头彻尾的优化,从ROM开始让手机变得彻底流畅起来,这里要跟大家嘱咐的,也是我们多次重申的一点:一定要选择普及率较高的Android机型,尤其是在国外的高普及度,像谷歌的Nexus系列手机被誉为亲儿子,也是因为它开放了源代码,在其他手机为第三方ROM挠头的时候,Nexus系列已经早早的开始各种优化了。

  其次,除了ROM资源,我们也要考虑到其他资源,比如内核,各大手机厂商的热门机型,内核资源也是不一样的,早期摩托罗拉的里程碑很开放,所以有着大量可刷的内核,而到了后来摩托罗拉机型很封闭,可刷的内核资源就相当匮乏,虽然ROM很多,但刷来刷去都大同小异,刷机的乐趣锐减。这里谷歌的Nexus系列再一次做了表率。

一、概要:

本文主要以Android的渲染机制、UI优化、多线程的处理、缓存处理、电量优化以及代码规范等几方面来简述Android的性能优化

二、渲染机制的优化:

大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染, 如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。

如果你的某个操作花费时间是24ms,系统在得到VSYNC信号的时候就无法进行正常渲染,这样就发生了丢帧现象。那么用户在32ms内看到的会是同一帧画面。

Probably:也许是因为你的layout太过复杂,无法在16ms内完成渲染,有可能是因为你的UI上有层叠太多的绘制单元,还有可能是因为动画执行 的次数过多。这些都会导致CPU或者GPU负载过重。

Resolved:我们可以通过一些工具来定位问题,比如可以使用HierarchyViewer来查找Activity中的布局是否过于复杂,也可以使用手机设置里 面的开发者选项,打开Show GPU Overdraw等选项进行观察。

你还可以使用TraceView来观察CPU的执行情况,更加快捷的找到性能瓶颈。

浅谈Overdraw(过度绘制):

Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。 

Tips:我们可以通过手机设置里面的开发者选项,打开Show GPU Overdraw的选项,可以观察UI上的Overdraw情况

图解:蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。

Tips:Overdraw有时候是因为你的UI布局存在大量重叠的部分,还有的时候是因为非必须的重叠背景。例如某个Activity有一个背景,然后里面 的Layout又有自己的背景,同时子View又分别有自己的背景。

仅仅是通过移除非必须的背景,这就能够减少大量的红色Overdraw区域,增加 蓝色区域的占比。这一措施能够显著提升程序性能。

注意:如需获取更多渲染机制的内容,请移步 https://wwwoschinanet/news/60157/android-performance-patterns

三、UI方面的优化:

1)首先简单谈谈view的绘制流程:measure - layout - draw

ps:具体的流程网上一搜一大把+_+

2)子控件越多,绘制的时间也就越长。

对于Listview或者GridView这种多item的组件来说,复用item可以减少inflate次数,通过setTag,getTag的ViewHolder方式实现复用,这里要注意的是,holder中的控件最好reset后再赋值,避免,文字错乱。

以下简单的例子:(尽量使用注解,有很多注解的开源框架可以使用:butterKnife, AndroidAnnotation, Dragger2)

static class ViewHolder{

    @InjectView(RidimageView1)

    ImageView imageView1;

    @InjectView (Ridtext1)

    TextView textView1;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;

             

    if(convertView == null){

       holder = new ViewHolder();

       convertView = LayoutInflaterfrom(mContext)inflate(Rlayoutlistview_item, null);

       convertViewsetTag(holder);

     }else{

         holder = (ViewHolder)convertViewgetTag();

     }

             

         holderimageView1setImageResource(Rdrawableic_launcher);

         holdertextView1setText(mDataget(position));  

             

         return convertView;

}

3)UI ReView(视图的检查) 

1 减少视图层级可以有效的减少内存消耗,因为视图是一个树形结构,每次刷新和渲染都会遍历一次。

2 想要减少视图层级首先就需要知道视图层级,所以下面介绍一个SDK中自带的一个非常好用的工具hierarchyviewer。你可以在下面的地址找到它:your sdk path\sdk\tools

3 如上图大家可以看到,hierarchyviewer可以非常清楚的看到当前视图的层级结构,并且可以查看视图的执行效率(视图上的小圆点,绿色表示流畅,**和红色次之),所以我们可以很方便的查看哪些view可能会影响我们的性能从而去进一步优化它。

hierarchyviewer还提供另外一种列表式的查看方式,可以查看详细的屏幕画面,具体到像素级别的问题都可以通过它发现。

4)一些标签的使用

<merge> :它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个Android Layout的结构,优化布局层数。

<include > :可以通过这个标签直接加载外部的xml到当前结构中,是复用UI资源的常用标签,来共享布局。

<ViewStub> : 动态加载view,此标签可以使UI在特殊情况下,直观效果类似于设置View的不可见性,但是其更大的意义在于被这个标签所包裹的Views在默认状态下不会占用任何内存空间。

四、多线程的处理:

1 Android 提供的多种多线程工具类 (AsyncTask, HandlerThread, IntentService, ThreadPool),许多操作都需要由 主线程(UI 线程)来执行,比如:

2 Android 系统的屏幕刷新频率为 60 fps, 也就是每隔 16 ms 刷新一次。如果在某次绘制过程中,我们的操作不能在 16 ms 内完成,那它则不能赶上这次的绘制公交车,只能等下一轮。

这种现象叫做 “掉帧”,用户看到的就是界面绘制不连续、卡顿。

3 HandlerThread 就是MessageQueue,Looper和 Handler 的组合。每个应用启动时,系统会创建一个该应用的进程以及主线程,这里的主线程就是一个 HandlerThread。

4 注意问题:

1)多线程并发访问资源要遵循重要的原则就是 原子性、可见性、有序性。没有同步机制的情况下,多个线程同时读写内存可能会导致意料之外的问题:

①线程安全的问题; ② UI 组件的生命周期并不确定;③线程引用导致的内存泄漏问题

2)不要在任何子线程持有 UI 组件或者 Activity 的引用

3)保持响应不发生ANR: 

①从UI线程中移除费时操作这个方式还可以防止用户操作出现系统不响应(ANR)对话框。需要做的就是继承AsyncTask来创建一个后台工作线程,并实现doInBackground()方法。

②还有一种方式就是自己创建一个Thread类或者HandlerThread类,明确设定线程的优先级。

4)使用StrictMode来检查UI线程中可能潜在的费时操作,使用一些特殊的工具如Safeijiami、Systrace或者Traceview来寻找在你的应用中的瓶颈;用进度条向用户展示操作进度。

五、缓存处理:

简单的说说缓存优化的几个方面:

缓存机制:网络+数据库。为了避免从网络获取重复的数据,可以在activity或者fragment或者每个组件设置一个最大请求间隔。

比如一个listview,第一次请求数据时,保存一份到数据库,并记下时间戳,当下次重新初始化时,判断是否超过最大时间间隔(如5分钟),如果没有,只加载数据库数据,不需要再做网络请求。

(当然,还有一些隐式的http请求框架会缓存服务器数据,在一定时间内不再请求网络,或者当服务器返回304时将之前缓存的数据直接返回)

网络方面:1)需要服务端配合的:json数据格式,WebP代替jpg,支持断点续传,多个请求合并成一个,尽量不做重定向,服务器缓存以及负载均衡等。

2)对客户端本身,除了上述的实现,我们还需要合理的缓存,控制最大请求并发量,及时取消已失效的请求,过滤重复请求,timeout时间设置,请求优先级设置等。

 WebP:WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的体积,而且拥有肉眼识别无差异的图像质量;

同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都相当优秀、稳定和统一。

转换后的 WebP 支持 Alpha 透明和 24-bit 颜色数,不存在 PNG8 色彩不够丰富和在浏览器中可能会出现毛边的问题。

 更多了解请看:http://isuxtencentcom/introduction-of-webphtml

六、电量优化:

有下面一些措施能够显著减少电量的消耗:

我们应该尽量减少唤醒屏幕的次数与持续的时间,使用WakeLock来处理唤醒的问题,能够正确执行唤醒操作并根据设定及时关闭操作进入睡眠状态。

某些非必须马上执行的操作,例如上传歌曲,处理等,可以等到设备处于充电状态或者电量充足的时候才进行。

触发网络请求的操作,每次都会保持无线信号持续一段时间,我们可以把零散的网络请求打包进行一次操作,避免过多的无线信号引起的电量消耗。

关于网络请求引起无线信号的电量消耗,还可以参考这里http://hukaime/android-training-course-in-chinese/connectivity/efficient-downloads/efficient-network-accesshtml

Ask:假设你的手机里面装了大量的社交类应用,即使手机处于待机状态,也会经常被这些应用唤醒用来检查同步新的数据信息。

Android会不断关闭各种硬 件来延长手机的待机时间,首先屏幕会逐渐变暗直至关闭,然后CPU进入睡眠,这一切操作都是为了节约宝贵的电量资源。但是即使在这种睡眠状态下,大多数应 用还是会尝试进行工作,他们将不断的唤醒手机。

一个最简单的唤醒手机的方法是使用PowerManagerWakeLock的API来保持CPU工作并 防止屏幕变暗关闭。这使得手机可以被唤醒,执行工作,然后回到睡眠状态。知道如何获取WakeLock是简单的,可是及时释放WakeLock也是非常重 要的。

不恰当的使用WakeLock会导致严重错误。例如网络请求的数据返回时间不确定,导致本来只需要10s的事情一直等待了1个小时,这样会使得电量 白白浪费了。这也是为何使用带超时参数的wakelockacquice()方法是很关键的。

但是仅仅设置超时并不足够解决问题,例如设置多长的超时比 较合适?什么时候进行重试等等?

Resolved:解决上面的问题,正确的方式可能是使用非精准定时器。通常情况下,我们会设定一个时间进行某个操作,但是动态修改这个时间也许会更好。

例如,如果有 另外一个程序需要比你设定的时间晚5分钟唤醒,最好能够等到那个时候,两个任务捆绑一起同时进行,这就是非精确定时器的核心工作原理。我们可以定制计划的 任务,可是系统如果检测到一个更好的时间,它可以推迟你的任务,以节省电量消耗。

 关于JobScheduler的更多知识可以参考 http://hukaime/android-training-course-in-chinese/background-jobs/scheduling/indexhtml

七、代码规范

1)for loop中不要声明临时变量,不到万不得已不要在里面写try catch。

2)明白垃圾回收机制,避免频繁GC,内存泄漏,OOM(有机会专门说)

3)合理使用数据类型,StringBuilder代替String,少用枚举enum,少用父类声明(List,Map)

4)如果你有频繁的new线程,那最好通过线程池去execute它们,减少线程创建开销。

5)你要知道单例的好处,并正确的使用它。

6)多用常量,少用显式的"action_key",并维护一个常量类,别重复声明这些常量。

7)如果可以,至少要弄懂设计模式中的策略模式,组合模式,装饰模式,工厂模式,观察者模式,这些能帮助你合理的解耦,即使需求频繁变更,你也不用害怕牵一发而动全身。需求变更不可怕,可怕的是没有在写代码之前做合理的设计。

8)View中设置缓存属性setDrawingCache为true

9)cursor 的使用。不过要注意管理好cursor,不要每次打开关闭cursor因为打开关闭Cursor非常耗时。Cursorrequire用于刷cursor

10)采用SurfaceView在子线程刷新UI, 避免手势的处理和绘制在同一UI线程(普通View都这样做)

11)采用JNI,将耗时间的处理放到c/c++层来处理

12)有些能用文件操作的,尽量采用文件操作,文件操作的速度比数据库的操作要快10倍左右

13)懒加载和缓存机制。访问网络的耗时操作启动一个新线程来做,而不要再UI线程来做

14)如果方法用不到成员变量,可以把方法申明为static,性能会提高到15%到20%

15)避免使用getter/setter存取field,可以把field申明为public,直接访问

16)私有内部类要访问外部类的field或方法时,其成员变量不要用private,因为在编译时会生成setter/getter,影响性能。可以把外部类的field或方法声明为包访问权限

17)合理利用浮点数,浮点数比整型慢两倍

18)针对ListView的性能优化,ListView的背景色与cacheColorHint设置相同颜色,可以提高滑动时的渲染性能。ListView中getView是性能是关键,这里要尽可能的优化。

getView方法中要重用view;getView方法中不能做复杂的逻辑计算,特别是数据库操作,否则会严重影响滑动时的性能

19)不用new关键词创建类的实例,用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。

clone()方法不会调用任何类构造函数。在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:

20)public static Credit getNewCredit() {

return new Credit();

}

改进后的代码使用clone()方法,如下所示:

private static Credit BaseCredit = new Credit();

public static Credit getNewCredit() {

return (Credit) BaseCreditclone();

}

上面的思路对于数组处理同样很有用。

21)乘法和除法

考虑下面的代码:

for (val = 0; val < 100000; val +=5) { alterX = val 8; myResult = val 2; }

用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:

for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }

22)ViewPager同时缓存page数最好为最小值3,如果过多,那么第一次显示时,ViewPager所初始化的pager就会很多,这样pager累积渲染耗时就会增多,看起来就卡。

23)每个pager应该只在显示时才加载网络或数据库(UserVisibleHint=true),最好不要预加载数据,以免造成浪费

24)提高下载速度:要控制好同时下载的最大任务数,同时给InputStream再包一层缓冲流会更快(如BufferedInputStream)

25)提供加载速度:让服务端提供不同分辨率的才是最好的解决方案。还有合理使用内存缓存,使用开源的框架

引用:Android性能优化的浅谈

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/shuma/1322193.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-09-14
下一篇2023-09-14

随机推荐

  • 夏天涂防晒霜的正确步骤

    夏天涂防晒霜的正确步骤你知道夏天涂防晒霜的正确步骤是什么样的吗?很多女生刚开始学化妆,还不知道防晒霜应该在什么时候涂。我精心为大家整理了夏天涂防晒霜的正确步骤相关的知识和信息,希望对你有所帮助。

    2024-04-15
    44600
  • 女性精华液十大排行榜

    女性精华液十大排行榜:娇韵诗双萃精华露、兰蔻小黑瓶精华液、西秋焕采精华液、SK-II小灯泡精华、薇诺娜保湿修护精华液、YSL夜皇后精华液、倩碧302美白镭射瓶、自然堂小紫瓶精华液、fresh红茶精华露、上水和肌屏障修护肌底液等。1、娇韵诗双

    2024-04-15
    45400
  • 娇韵诗双萃赋活精华

    娇韵诗双萃赋活修护精华露好用吗?评价怎么样啊?娇韵诗娇韵诗双萃赋活修护精华露获得过很多的护肤奖项,大部分人用这款精华都会给好评,使用感也是很不错的,以下是个人使用感受: 精华露刚开始用会感觉有点油,但真的不会闷痘,也不怕油光满面,皮

    2024-04-15
    36800
  • 妮维雅男士洗面奶好吗?

    每日正常的洁肤次数最好为3次,除早晚之外,中间应增加1次。此外,户外活动或长时间购物等活动之后,还应该适当增加洁肤的次数。洗面的次数究竟该多少次还要考虑肤质、年龄和季节等因素。干性、敏感性肤质和年龄偏大者,应适当减少洗面的次数,并应慎重使用

    2024-04-15
    28400
  • 防晒喷雾喷灼伤皮肤?3 类产品大不同,当心买错更要避免使用不当

    最近我的一个朋友可悲剧了。 用防晒喷雾,谁想到喷伤了皮肤?这就让我很意外了,因为她用的防晒喷雾我也在用。 我的使用感非常好,很安全,也没有任何不适。 我很好奇她到底是怎么把皮肤给喷伤了? 讨论了一下才发

    2024-04-15
    26900
  • 妮维雅防晒霜好用吗

    根据小编自己亲测之后的感觉来看还是很不错的,旗下的防晒霜有多种不同类型,有的是以黄盖呈现的喷雾,有的是以挤压头呈现的,也有一些是针对儿童而生的。不管是哪一种,其实都具有着很容易晕开、安全系数比较高的特色,特别是旗下的防晒喷雾非常好用,小小一

    2024-04-15
    34300
  • 神仙水和清莹露区别

    神仙水和清莹露区别:1、外观不同。神仙水颜色比较黄,而清莹露是一种化妆水或清洁水,颜色比较清透,呈透明色。2、使用不同。清莹露需要在洗脸之后使用,用化妆棉浸透后轻轻擦拭脸部,是护肤的第一步。神仙水在之后使用,能够保湿滋润,维稳皮肤。3、成分

    2024-04-15
    27700

发表评论

登录后才能评论
保存