当前位置:首页 » 安卓系统 » android性能优化pdf

android性能优化pdf

发布时间: 2023-05-16 04:57:06

1. Android性能优化总结

常用的Android性能优化方法:

一、布局优化:

1)尽量减少布局文件的层级。

层级少了,绘制的工作量也就少了,性能自然提高。

2)布局重用 <include标签>

3)按需加载:使用ViewStub,它继承自View,一种轻量级控件,本身不参与任何的布局和绘制过程。他的layout参数里添加一个替换的布局文件,当它通过setVisibility或者inflate方法加载后,它就会被内部布局替换掉。

二、绘制优化:

基于onDraw会被调用多次,该方法内要避免两类操作:

1)创建新的局部对象,导致大量垃圾对象的产生,从而导致频繁的gc,降低程序的执行效率。

2)不要做耗时操作,抢CPU时间片,造成绘制很卡不流畅。

三、内存泄漏优化:

1)静态变量导致内存泄漏   比较明显

2)单例模式导致的内存泄漏 单例无法被垃圾回收,它持有的任何对象的引用都会导致该对象不会被gc。

3)属性动画导致内存泄漏  无限循环动画,在activity中播放,但是onDestroy时没有停止的话,动画会一直播放下去,view被动画持有,activity又被view持有,导致activity无法被回收。

四、响应速度优化:

1)避免在主线程做耗时操作 包括四大组件,因为四大组件都是运行在主线程的。

2)把一些创建大量对象等的初始化工作放在页面回到前台之后,而不应该放到创建的时候。

五、ListView的优化:

1)使用convertView,走listView子View回收的一套:RecycleBin 机制

主要是维护了两个数组,一个是mActiveViews,当前可见的view,一个是mScrapViews,当前不可见的view。当触摸ListView并向上滑动时,ListView上部的一些OnScreen的View位置上移,并移除了ListView的屏幕范围,此时这些OnScreen的View就变得不可见了,不可见的View叫做OffScreen的View,即这些View已经不在屏幕可见范围内了,也可以叫做ScrapView,Scrap表示废弃的意思,ScrapView的意思是这些OffScreen的View不再处于可以交互的Active状态了。ListView会把那些ScrapView(即OffScreen的View)删除,这样就不用绘制这些本来就不可见的View了,同时,ListView会把这些删除的ScrapView放入到RecycleBin中存起来,就像把暂时无用的资源放到回收站一样。

当ListView的底部需要显示新的View的时候,会从RecycleBin中取出一个ScrapView,将其作为convertView参数传递给Adapter的getView方法,从而达到View复用的目的,这样就不必在Adapter的getView方法中执行LayoutInflater.inflate()方法了。

RecycleBin中有两个重要的View数组,分别是mActiveViews和mScrapViews。这两个数组中所存储的View都是用来复用的,只不过mActiveViews中存储的是OnScreen的View,这些View很有可能被直接复用;而mScrapViews中存储的是OffScreen的View,这些View主要是用来间接复用的。

2)使用ViewHolder避免重复地findViewById

3)快速滑动不适合做大量异步任务,结合滑动监听,等滑动结束之后加载当前显示在屏幕范围的内容。

4)getView中避免做耗时操作,主要针对图片:ImageLoader来处理(原理:三级缓存)

5)对于一个列表,如果刷新数据只是某一个item的数据,可以使用局部刷新,在列表数据量比较大的情况下,节省不少性能开销。

六、Bitmap优化:

1)减少内存开支:图片过大,超过控件需要的大小的情况下,不要直接加载原图,而是对图片进行尺寸压缩,方式是BitmapFactroy.Options 采样,inSampleSize 转成需要的尺寸的图片。

2)减少流量开销:对图片进行质量压缩,再上传服务器。图片有三种存在形式:硬盘上时是file,网络传输时是stream,内存中是stream或bitmap,所谓的质量压缩,它其实只能实现对file的影响,你可以把一个file转成bitmap再转成file,或者直接将一个bitmap转成file时,这个最终的file是被压缩过的,但是中间的bitmap并没有被压缩。bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);

七、线程优化:

使用线程池。为什么要用线程池?

1、从“为每个任务分配一个线程”转换到“在线程池中执行任务”

2、通过重用现有的线程而不是创建新线程,可以处理多个请求在创建销毁过程中产生的巨大开销

3、当使用线程池时,在请求到来时间 ,不用等待系统重新创建新的线程,而是直接复用线程池中的线程,这样可以提高响应性。

4、通过和适当调整线程池的大小 ,可以创建足够多的线程以使处理器能够保持忙碌状态,同时还可以防止过多线程相互竞争资源而使应用程序耗尽内存或者失败。

5、一个App里面所有的任务都放在线程池中执行后,可以统一管理 ,当应用退出时,可以把程序中所有的线程统一关闭,避免了内存和CPU的消耗。

6、如果这个任务是一个循环调度任务,你则必须在这个界面onDetach方法把这个任务给cancel掉,如果是一个普通任务则可cancel,可不cancel,但是最好cancel

7、整个APP的总开关会在应用退出的时间把整个线程池全部关闭。

八、一些性能优化建议:

1)避免创建过多对象,造成频繁的gc

2)不要过多使用枚举,枚举占用的空间比整型大很多

3)字符串的拼接使用StringBuffer、StringBuilder来替代直接使用String,因为使用String会创建多个String对象,参考第一条。

4)适当使用软引用,(弱引用就不太推荐了)

5)使用内存缓存和磁盘缓存。

2. Android流畅度评估及卡顿优化

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与卡顿无任何直接关系)

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

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

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

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

命令 adb shell mpsys 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 等资源都会被占用,这时候很容易出现卡顿问题,这也是系统这边经常会碰到的问题。
mpsys 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系统中常见的卡顿原因,因此卡顿优化主要以下几种方法,更多的要结合具体的应用来进行:

在计算机和通信领域,帧是一个包括“帧同步串行”的数字数据传输单元或数字数据包。
在视频领域,电影、电视、数字视频等可视为随时间连续变换的许多张画面,其中帧是指每一张画面。

3. Android TextView使用及性能优化

TextView 是Android中最常用的控件,在这里记录下TextView 的用法;

在Android中可以使用系统自带的4种字体:

在XML中使用 android:typeface="normal" 进行设置

将字体文件放到main/assets/fonts目录下,使用Asset读取字体后进行设置

使用 android:drawableLeft="@mipmap/ic_launcher" 可以设置一张图片显示在文字的上下左右,减少布局层级

使用Span能够在一段TextView中设置不同颜色的字体,链接,图片等内容

使用ClickableSpan 能够设置一段文字的点击事件

创建自己的MyClickableSpan:

之后使用SpannableStringBuilder来创建字符串,并使用setSpan来为字符串的一部分设置Span对象

其中setSpan()方法的最后一个参数标识有以下常量,这些常量标识着在 对SpannableStringBuilder进行insert时 添加的字符适用的规则:

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE

Spanned.SPAN_EXCLUSIVE_INCLUSIVE

Spanned.SPAN_INCLUSIVE_EXCLUSIVE

Spanned.SPAN_INCLUSIVE_INCLUSIVE

前一个 EXCLUSIVE / INCLUSIVE 标识着在设置了Span的一段字符之前(紧挨着)插入字符时,被不被包含到Span范围中, EXCLUSIVE 表示包含, INCLUSIVE 表示不包含;

第二个 EXCLUSIVE / INCLUSIVE 同理表示插入这段字符之后的效果;

ImageSpan用于在TextView中插入图片,可以用来实现图文混排

使用方法:

这样实现的效果是文字与图片底部进行对齐,如果需要图片中线与文字中线对其,需要自己重写ImageSpan

​ Android 中的TextView中存在着很多EditText中的特性,在setText()方法中会涉及到很多Span相关的操作,比如设置TextWatcher,重新构造Spannable等操作,在我们仅仅显示静态文本的时候这些操作都是没有必要的(通过使用普通的TextView进行Debug来验证普通的TextView的确是Span的);

​ 在大量显示静态文本的时候就可以通过StaticLayout来计算出TextView的布局信息,这项工作可以放到非UI线程来进行,能够减少在setText()的时候UI线程的耗时,达到优化TextView性能的目的;

​ StaticLayout是TextView中用于显示多行静态文本的Layout,也是能够支持SpannableString的,只是不能在Span变化之后重新Layout,所以在大部分场景下已经适用;

通过这个自定义的View来显示Text,在onDraw()的时候直接使用layout来进行绘制,而设置需要显示的文本则直接使用setLayout()来实现

使用下面给出的参考链接中的测试Demo在 ZTE A2017 Android7.1.1 高通820设备上,普通TextView在ListView中连续滚动的帧数是55帧,使用StaticLayout的结果为60帧

可以作为在APP使用CPU资源较多的情况下的优化手段

参考链接: TextView预渲染研究

在Android中,TextView的测量消耗了大量的时间,Android P中提供了PrecomputedText能够将测量这个过程放到后台来执行,减轻对于UI线程的卡顿;

非Android P时,使用AppCompatTextView控件,使用setTextFeature()方法来将文本的measure过程放到其他线程来执行,而不是直接将text应用于TextView;

在调用了这个方法之后如果对TextView进行边距,文字大小等的设置都将会报错;

Prefetch Text Layout in RecyclerView

PrecomputedTextCompat

在ListView中仅替换设置Text的方法时未测试出性能与普通方法有什么优势,猜测是ListView没有在getView和显示之间预留时间,

测试项目地址:

https://github.com/GavynZhang/PrecomuptedTextViewTest

4. 针对Android的性能优化集中哪些方面

一、概要:

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

二、渲染机制的优化:

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

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

*关于JobScheler的更多知识可以参考http://hukai.me/android-training-course-in-chinese/background-jobs/scheling/index.html

七、代码规范

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非常耗时。Cursor.require用于刷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) BaseCredit.clone();
}
上面的思路对于数组处理同样很有用。

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性能优化的浅谈

    5. 《基于Android与iOS平台的实践》pdf下载在线阅读全文,求百度网盘云资源

    《音视频开发进阶指南:基于Android与iOS平台的实践》网络网盘pdf最新全集下载:
    链接: https://pan..com/s/1_XWVI4OhWHxU7WJc0qqicA

    ?pwd=5wmv 提取码: 5wmv
    简介:书中首先通过介绍音视频的物理现象与基础概念,银洞帮助读者建立模拟信号到数字信号转化的过程,然后重点介绍了如何在移动端开发音视频项目,其中包括开发中所需要了解的各种知识,如音视频的解码与渲染,采集与编码,音视频的搭巧处理与性能优化等;在此基础上最后综合当下*流行的直播场景,知搏键介绍如何将书中的已有项目改造、适配成为一个直播产品,进一步帮助读者自由、有效的开发出功能丰富、性能一流的音视频App。

    6. Android-ViewPager源码解析与性能优化

    ViewPager高度设置为wrap_content或者具体的高度值无效,是因为ViewPager的onMeasure方法在度量宽高的时候,在方法体的最开始就直接调用了setMeasuredDimension()方法将自身的宽高度量,但是并没有在其onMeasure()计算完其具体的子View的宽高之后,重新度量一次自身的宽高

    从这里我们可以看到,ViewPager的宽高会受其父容器的宽高的限制,但是并不会因为自身子View的宽高而影响ViewPager的宽高。

    看setMeasuredDimension的源码调用可以看出,当父容器的高度确定时,ViewPager的宽高其实就是父容器的宽高,ViewPager就是在onMeasure方法一进来的时候就直接填充满整个父容器的剩余空间。在计算孩子节点之前,就已经计算好了ViewPager的宽高,在计算完孩子节点之后,并不会再去重新计算ViewPager的宽高。

    自定义一个ViewPager,根据子View的宽高重新度量ViewPager的宽高。其实做法就是在自定义onMeasure的super.onMeasure(widthMeasureSpec, heightMeasureSpec);之前重新计算heightMeasureSpec,将原本ViewPager接收的父容器的限定的heightMeasureSpec替换成我们自定义的heightMeasureSpec。

    但是这样的做法,会有种问题,即在ViewPager的子View是采用LinearLayout作为根布局的时候,并且给LinearLayout设置了固定的高度值,那么会出现ViewPager动态高度无效的问题
    其实具体的做法,就是仿造measureChild的做法,自定义子View的heightMeasureSpec然后度量整个子View,其实子View的宽度也可以这样做。

    这里其实是源码层做了限制,在setOffscreenPageLimit中设置了一个默认值,而这个默认值的大小为1

    所以从这里可以看出,ViewPager的最小缓存的limit是1,而不能小于1,当小于1的时候就会被强制的设置为1。
    而populate()函数就是用来处理ViewPager的缓存的。
    populate()的生命周期是与Adapter的生命周期绑定的。
    其实在setOffscreenPageLimit()的时候,调用的populate(),而populate()内部调用的

    而pupulate(int newCurrentItem)方法在另一处调用的地方就是在setCurrentItem。
    其实ViewPager缓存都是基于ItemInfo这个类来进行的,

    看下ViewPager.addNewItem的源码
    其实ViewPager.addNewItem就是通过调用Adapter.instantiateItem来创建对应的View,并且将View保存到ItemInfo中的object属性,并且判断ViewPager缓存中是否已经有ItemInfo,如果没有,则添加,如果有则做修改替换

    从分析FragmentStatePagerAdapter来看,setUserVisibleHint方法会优先于Fragment的生命周期函数 执行。因为在FragmentStatePagerAdapter中提交事务,是在调用finishUpdate方法中进行的,只有提交事务的时候,才会去执行Fragment的生命周期。
    FragmentStatePagerAdapter中的instantiateItem和destroyItem都实现了对fragment的事务的添加和删除,而finishUpdate实现了事务的提交,所以在实现FragmentStatePagerAdapter的时候,并不需要重写instantiateItem和destroyItem

    7. 安卓系统优化方法


    目前智能手机市场两大系统分别是iOS和Android,并且已经形成了对立的阵营,Android用户并不理会iOS用户所谓的体验好应用好是怎么个好法,而iOS用户则更不理解Android用户刷机重启抠电池的乐趣。在iOS用户眼中,Android的形象几乎可以用一个“卡”字来代替。其实Android经过了这几年的发展,硬件水平已经有了很大的提高,再加上目前的优化,Android卡的情况已经有了很大程度的缓解,目前的双核机型硬件配置十分强大,如带告果还要说卡,也就是因为厂商定制ROM的优化原因。
    其实Android的“卡”,可以得到彻底的解决,这就关系到了Android的优化问题,而今天我们就探讨下如何优化我们手中的Android机型。在这里笔者也要提醒大家,选购Android机型一定要选择热门机型,只有热门机型才有足够丰富的优化资宏行激源供我们选择,切忌为了个性选择偏门机型,Android热门机型再是街机,也不会比iPhone还街吧?
    刷机重启抠电池
    刷机是Android用户的一大乐趣,部分用户刷机是为了得到更好的易用性,比如小米的MIUI ROM,非常符合中国人的使用习惯,也有着足够丰富的个性化设蔽袜定,是图省事的朋友刷机的好选择,不过对于追求高性能的朋友来说,MIUI的优化还有很大提升空间,人们纷纷选择了对于ROM优化更加出色的CyanogenMod作为刷机的第一选择。
    MIUI ROM特色
    CyanogenMod系列目前主打的ROM有CM 7.2和CM 9两个,CM 7.2基于Android 2.3.7,而CM 9则基于Android 4.0.4,其中CM 7.2已经基本成熟,完美支持的机型很多,是大部分机友刷机的第一选择,CM 9官方的ROM支持机型并不多,民间高手也都进行了各个机型的移植,官方支持的机型兼容性相当不错,而移植情况并不乐观。
    CyanogenMod的LOGO
    CM系列ROM忠实于AOSP,在底层驱动方面做了很多努力,刷入之后就会感觉手机流畅了许多,同时也支持了更多的美化和手机自定义能力,比如我们可以对手机的震动回馈做细致的调整,包括按下震动的强度,抬起震动的强度等,让手机虚拟按键给我们更为真实的回馈,在CM ROM中,类似的设定非常多。
    CM9 ROM截图
    目前大部分的ROM都是使用CM进行定制的,还有一部分是对官方原版ROM进行修改,仅有少部分的ROM是修改的AOSP的源码,这些ROM指向都是谷歌Nexus系列的机型,比如GALAXY Nexus和Nexus S上的Codename和AOKP,就针对源码做了很多修改,让手机变得更流畅。
    刷内核效果很好
    仅仅刷手机的ROM是不够的,虽然多了很多自定义的功能,流畅度已经高于官方的ROM,但依旧有很大提升的空间,这时候我们就需要通过刷内核来进一步优化,刷内核所能带来的提升是相当明显的,但是对于刷内核大家还是要谨慎。
    国外着名论坛的内核发布区
    刷内核相比刷ROM,是一个很小的工程,你的手机不必要Wipe,也就是说不用删除手机内部的数据,刷一下也就几分钟的功夫,所以刷内核的时候,大家完全可以多下几个内核,逐个进行测试,看看哪个内核更适合自己,就保留哪个内核。同时刷内核时我们要注意,内核需对应自己的手机版本,对应自己所刷的ROM,否则会造成手机无法启动的现象,如果遇到无法启动的现象,再刷其他可用内核就可以恢复。
    Android机器人
    大家会问了,说了这么半天,刷内核到底都有什么作用呢?首先就是超频,大部分内核会默认提供降压超频,并拥有多种超频策略,来保证超频的情况下更省电。其次,还提供更多调整,比如内存虚拟机的大小,颜色管理等等,甚至一个内核可以包括一些新的Linux的补丁,比如最新的Linux 3.3所集成的CPU频率补丁等等。
    刷内核工具
    事实上,一般的第三方ROM已经修改了手机的内核,达到了更流畅的目的,但ROM的制作速度远远比不上内核的调整速度,有时候一个ROM适用的内核在一天之内可能多次更新,所以我们可以尝试不同的新内核,看看他们的超频是不是能给我们带来性能上质的提升,是不是能更省电,是不是能通过颜色调整让我们看到更棒的画面等等。
    精简内置应用
    我相信Android用户通过不断的更换ROM和刷内核已经在流畅度上有了质的飞跃了,如果这时候你的手机已经比iPhone更流畅、更省电,那么我们就可以收手了,如果你还不满意,我们还有其他的路可选,精简内置应用,就是一个可以大幅度提升流畅度的方法。像Google的服务就是大部分人精简的对象。
    跑分是性能的体现
    Android系统和iOS与Windows Phone不同,这个系统拥有真正的后台运行能力,虽然iOS在推送方面做得很好,弥补了后台方面的不足,但是仍然无法与Android的真后台相比,但是由于Android的程序优先级并不像iOS和Windows Phone那样,为了流畅让当前界面拥有最高优先级,所以我们就要把Android手机后台不必要的进程关掉,以获得最佳的性能。
    RE管理器截图
    那么精简内部应用就是很好的选择,因为在我们使用过程中,有许多Android内部应用程序是不必要的,而这些程序会在我们不用的时候悄悄的后台打开,对我们的使用造成影响。在精简时,我们需要用到root文件管理器,同时需要保证手机已经开启root权限。
    RE管理器截图
    进入system/app就可以进行精简了,我们需要把root管理器的当前权限设置成读写,并且修改需要删除的软件权限,打开软件执行操作的权限,就可以对删除内置软件了,在精简前,大家需要对软件进行备份,或者备份整个ROM,如果你精简掉系统程序,可能会造成无法开机的情况,重刷ROM可以解决,所以大家最好找到该机型、该ROM的精简列表,以避免重复劳动。
    还有其他优化
    经过以上多方面的优化,我相信大家都已经得到了一个较为干净、运行流畅的Android了,不过在很多程序中,我们还是会遇到卡顿的情况,对于一个极端追求流畅度的玩家来说,这样的情况是绝对不允许发生的,因为我们还有进一步优化的空间。
    CM超频选项
    之前我们介绍了CM系列ROM,而CM的ROM中有两个选项的勾选可以进一步的提高流畅度,但是会损失一些画面这些选项是贴图差值抖动和16位透明度,贴图差值抖动这个选项需要关闭,这个选项关闭后可以提高流畅度,但是在滑动菜单时会有不容易被发现的画面损失,而16位透明度这个选项开启会大幅度提高流畅度,但是一些纯色的透明效果画质会下降,比如Android滑动到边缘的越界效果。
    CM性能设置选项
    在Android 4.0的ROM中,也有不少选项可以提高程序的流畅度,比如程序的GPU加速,使用GPU对2D程序的界面进行渲染,有效减轻界面滑动对于CPU的负担,同时还能让界面得到更好地渲染效果,不过这个选项会让有些程序出现兼容性问题,而Android也不能单独为某个程序开关GPU加速,所以GPU加速这个功能让人又爱又恨。
    Android 4.0强制GPU加速
    在提到刷内核时,我们也提到了超频内核,超频内核在刷完后,会在ROM设置中提供给你多种内核超频策略选择,在大部分机型中,超频不会增加CPU的耗电,因为厂商在CPU出厂前,为了保证CPU的稳定,为CPU设置了很安全的电压和频率,这显得过于保守,而在同等的电压下,CPU根据体质不同或多或少还有可以压榨的空间,所以我们在保证稳定运行的情况下,还可以继续对CPU进行超频。
    优化策略总结
    本文我们从刷ROM开始提到了一些Android系统的优化,对于Android系统来说,流畅度是它相比其他系统最大的短板,其实Android的大部分手机有着相当好的硬件,所以流畅度大幅度提升完全不是难事,而各个厂商在Android手机出厂前给手机定制的ROM并没有达到最优的优化效果,或多或少都有可提升的空间。
    三星 GALAXY Nexus
    所以我们也可以根据自己用手机的需要对手机进行彻头彻尾的优化,从ROM开始让手机变得彻底流畅起来,这里要跟大家嘱咐的,也是我们多次重申的一点:一定要选择普及率较高的Android机型,尤其是在国外的高普及度,像谷歌的Nexus系列手机被誉为亲儿子,也是因为它开放了源代码,在其他手机为第三方ROM挠头的时候,Nexus系列已经早早的开始各种优化了。
    ClockworkMod的LOGO
    其次,除了ROM资源,我们也要考虑到其他资源,比如内核,各大手机厂商的热门机型,内核资源也是不一样的,早期摩托罗拉的里程碑很开放,所以有着大量可刷的内核,而到了后来摩托罗拉机型很封闭,可刷的内核资源就相当匮乏,虽然ROM很多,但刷来刷去都大同小异,刷机的乐趣锐减。这里谷歌的Nexus系列再一次做了表率。
    AOSP网页截图
    再加上一些精简和设置操作,你会发现,你的手机流畅度完全可以翻几番,即使是官方有新的升级你可能都懒得去理,因为你知道,官方的升级不可能带来刷机所给你的流畅度。这也是iOS玩家所不理解的刷机重启扣电池的乐趣。他们更不理解的是Android的流畅度怎么能超越iOS呢?如果您按照小编交给你的这些方法,安卓手机不会再出现卡壳的现象了。

    8. 《高性能Android应用开发》pdf下载在线阅读,求百度网盘云资源

    《高性能Android应用开发》([美] Doug Sillars)电子书网盘下载免费在线阅读

    资源链接:

    链接:https://pan..com/s/15apBngXi9wT-iEkLWCLbPA

    提取码:0qkc

    书名:高性能Android应用开发

    作者:[美] Doug Sillars

    译者:王若兰

    豆瓣评分:7.3

    出版社:人民邮电出版社

    出版年份:2016-10

    页数:220

    内容简介:

    性能问题在很大程度上决定了用户是否会使用一款App,本书正是Android性能方面的关键性指南。全书共8章,主要从电池、内存、CPU和网络方面讲解了电池管理、工作效率和速度这几个方面的性能优化问题,并介绍了一些有助于确定和定位性能问题所属类型的工具。同时也会探讨开发人员面临的一些主要问题,进而提出一些可行的补救措施。全书旨在通过提高App性能完善App,以便用户可以获得极致体验。

    作者简介:

    Doug Sillars

    是 AT&T 开发者计划中的性能推广领导者。他帮助了成千上万的移动开发人员将性能的最佳实践应用到 App 上。他开发的工具和总结的最佳实践,帮助开发人员使 App 运行得更快,同时使用了更少的数据和电量。他和妻子生活在华盛顿州的一个小岛上,并在家教育三个孩子。

    9. Android App性能优化之耗电优化

    在移动设备中,电池的重要性不言而喻,没有电什么都干不成。对于操作系统和设备开发商来说,去追求更长的待机时间,耗电优化一直没有停止。而对于一款应用来说,并不能忽略耗电问题,特别是那些被归为“电池杀手”的应用,最终的结果是被卸载。因此,应用开发者在实现需求的同时,需要尽量减少电量的消耗(本文针对Android App进行分析)。

    App耗电的原因其实很多,这里我就讲以下几种优化方案,优化方案的反面就是他的原因了,几种优化方案如下:

    1.合理的使用wake_lock锁,wake_lock锁主要是相对系统的休眠(这里就是为了省电,才做休)而言的,意思就是我的程序给CPU加了这个锁那系统就不会休眠岁脊了,这样做的目的是为了全力配合我们程序的运行。有的情况如果不这么做就会出现一些问题,比如微信乎袭渗等及时通讯的心跳包会在禅世熄屏不久后停止网络访问等问题。所以微信里面是有大量使用到了wake_lock锁。

    2.使用jobScheler2,集中处理一些网络请求,有些不用很及时的处理可以放在充电的时候处理,比如,图片的处理,APP下载更新等等;

    3.计算优化,避开浮点运算等。

    4.数据在网络上传输时,尽量压缩数据后再传输,建议用FlatBuffer序列化技术,这个比json效率高很多倍,不了解FlatBuffer,建议找资料学习一下。

    App耗电分析所用到的工具

    App耗电高说到底无非是因为代码不合理造成的,其中存在的一些问题,我们通过调试也很难定位到。在这里,我给大家分享一款工具,那就是“友盟+u-apm”应用性能监控平台了,是为了帮助开发者监测app应用使用的。它可以实时监测到app性能方面的问题,定位到问题所在处,开发者可以针对问题进行解决并修复。

    友盟还通过轻量级的集成接入即可拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力,及卡顿、启动分析等性能能力,支持多场景、多通道智能告警监控,帮助开发者高效还原异常、卡顿用户的访问路径和业务现场,缩短故障排查时间。

    另外,友盟还提供了云真机测试能力,提供了海量Android、iOS真机,通过资源集中管理,合理调度分配,为开发者提供发版前测试、发现线上问题后复现等场景使用,助力开发者平衡成本与需求,提升研发效率。助力开发者从研发测试质量验收到线上问题复现排查,保障应用品质,提升测试效率。在云真机测试期间自动采集崩溃信息,提供详尽的崩溃报告协助筛查,真正实现监控测试全流程深度打通。为移动开发者提供了灵活地测试操作界面,支持ADB调试、WEB远程调试、扫码、抓包、虚拟定位等测试功能,并提供了测试报告供开发者后续查看。

    友盟作为一款监测工具,可以帮助各位开发者监测app性能问题,还可以减轻开发者的负担和压力,简直就是开发者的“得力小帮手”!

    热点内容
    内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:335
    编译原理课时设置 发布:2025-05-18 04:13:28 浏览:378
    linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:612
    java用什么软件写 发布:2025-05-18 03:56:19 浏览:32
    linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
    砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:943
    安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:739
    为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:803
    网卡访问 发布:2025-05-18 03:35:04 浏览:510
    接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:371