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

安卓开发应用首先要讲究良好的用户体验,如果一款软件卡顿现象严重,不流畅,经常崩溃,那么将给用户带来极不良好的体验,从而损失用户。

在实际开发和学习中,我总结了一下关于安卓性能的优化,供大家参考交流。

应用程序的性能问题体现在很多方面, 比如第一次启动速度慢,或者进入某一界面速度慢;动画执行过程不流畅,或者动画执行卡顿时间长;ListView列表滑动过程中卡顿,不流畅;应用程序自定义的某特定界面执行速度慢;响应某一用户事件时长时间无响应(ANR);操作数据库时,执行大量数据的增删改查操作,执行速度慢;文件读写频繁,缓存文件过大导致卡顿;应用长时间运行后,随机出现卡顿现象。

以上的问题的原因可能不只一个,并且很多情况下并不是应用本身的问题,也有可能是系统其他层次有问题,只不过体现在应用层。所以开发人员在处理性能问题时,需要做的第一件事情就是判断是否是应用自身引起的性能问题,然后再对症下药;但有些时候应用本身逻辑正常,但由于系统的硬件配置不足引起了异常,此时就要根据产品或项目需求,采取一些更加精准的方式优化性能,以弥补硬件配置的不足。

以下从几个不同的角度总结一下应用程序性能优化的一些方法。

一、编程思想

应用层的性能优化通常可以从以下几个方面考虑:

1. 了解编程语言的编译原理,使用高效编码方式从语法上提高程序性能;

2. 采用合理的数据结构和算法提高程序性能,这往往是决定程序性能的关键;

3. 重视界面布局优化;

4. 采用多线程、缓存数据、延迟加载、提前加载等手段,解决严重的性能瓶颈;

5. 合理配置虚拟机堆内存使用上限和使用率,减少垃圾回收频率;

6. 合理使用native代码;

7. 合理配置数据库缓存类型和优化SQL语句加快读取速度,使用事务加快写入速度;

7. 使用工具分析性能问题,找出性能瓶颈;

当然肯定还有很多其他的性能优化方法,此处仅列出一些经常会用到的方法。

二、编程技巧

(一)Performance Tips (For Java)

Google官网上有一些关于应用程序性能提升的技巧,之前公司内也有很多总结提到过,在此简单罗列一下,详细内容可以从官网获取。

http://developer.android.com/training/articles/perf-tips.html

需要说明的是,文章列出的优化技巧主要是一些微小的性能提升,决定程序整体性能的仍然取决于程序的业务逻辑设计、代码的数据结构和算法。研发人员需要将这些优化技巧应用到平时的编码过程中,积少成多,也会对性能有很大的影响。

写出高效的代码需要遵循两条原则:

不执行不必要的操作;

不分配不必要的内存;

两条原则分别针对CPU和内存,完成必要操作的前提下尽可能的节省CPU和内存资源,自然执行效率要高。单纯这样说听起来很虚,毕竟没有一个统一的标准判断什么是必要和不必要的,需要结合具体情况具体分析了。

1. 避免创建不必要的对象

创建太多的对象会造成性能低下,这谁都知道,可是为什么呢?首先分配内存本身需要时间,其次虚拟机运行时堆内存使用量是有上限的,当使用量到达一定程度时会触发垃圾回收,垃圾回收会使得线程甚至是整个进程暂停运行。可想而知,如果有对象频繁的创建和销毁,或者内存使用率很高,就会造成应用程序严重卡顿。

2.合理使用static成员

主要有三点需要掌握:

如果一个方法不需要操作运行时的动态变量和方法,那么可以将方法设置为static的。

常量字段要声明为“static final”,因为这样常量会被存放在dex文件的静态字段初始化器中被直接访问,否则在运行时需要通过编译时自动生成的一些函数来初始化。此规则只对基本类型和String类型有效。

不要将视图控件声明为static,因为View对象会引用Activity对象,当Activity退出时其对象本身无法被销毁,会造成内存溢出。

**重点内容**3. 避免内部的Getters/Setters

面向对象设计中,字段访问使用Getters/Setters通常是一个好的原则,但是在Android开发中限于硬件条件,除非字段需要被公开访问,否则如果只是有限范围内的内部访问(例如包内访问)则不建议使用Getters/Setters。在开启JIT时,直接访问的速度比间接访问要快7倍。

4. 使用增强for循环

优先使用增强for循环通常情况下会获得更高的效率;除了一种情况,即对ArrayList进行遍历时,使用普通的for循环效率要更高。

5. 使用package代替private以便私有内部类高效访问外部类成员

私有内部类的方法访问外部类的私有成员变量和方法,在语法上是正确的,但是虚拟机在运行时并不是直接访问的,而是在编译时会在外部类中自动生成一些包级别的静态方法,执行时内部类会调用这些静态方法来访问外部类的私有成员。这样的话就多了一层方法调用,性能有所损耗。

一种解决这个问题的方法就是将外部类的私有成员改为包级别的,这样内部类就可以直接访问,当然前提是设计上可接受。

6.合理使用浮点类型

在Android设备中浮点型大概比整型数据处理速度慢两倍,所以如果整型可以解决的问题就不要用浮点型。

另外,一些处理器有硬件乘法但是没有除法,这种情况下除法和取模运算是用软件实现的。为了提高效率,在写运算式时可以考虑将一些除法操作直接改写为乘法实现,例如将“x / 2”改写为“x * 0.5”。

7.采用<merge>优化布局层数。 采用<include>来共享布局。

8.延时加载View. 采用ViewStub 避免一些不经常的视图长期被引用,占用内存.

9.移除Activity默认背景,提升activity加载速度。

如果确信在Activity中使用不透明的背景,那么可以移除Activity的默认背景。

在代码中:getWindow().setBackgroundDrawable(null);

也可以在styles样式文件中设置并在Manifest文件中配置

 <style name="MyStyle" parent="AppTheme">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@null</item>
 </style>

10.cursor 的使用

要注意管理好cursor,不要每次打开关闭cursor.因为打开关闭Cursor非常耗时。

不再使用的cursor要记得关闭(一般在finally语句块执行)。

有一种情况下,我们不能直接将Cursor关闭掉,这就是在CursorAdapter中应用的情况,但是注意,CursorAdapter在Acivity结束时并没有自动的将Cursor关闭掉,因此,你需要在onDestroy函数中,手动关闭。

protected void onDestroy() {
      if (mAdapter != null && mAdapter.getCurosr() != null) {
          mAdapter.getCursor().close();
      }
      super.onDestroy();
    }

11.广播BroadCast动态注册时,记得要在调用者生命周期结束时unregisterReceiver,防止内存泄漏。

12.针对ListView的性能优化

item尽可能的减少使用的控件和布局的层次;背景色与cacheColorHint设置相同颜色;ListView中item的布局至关重要,必须尽可能的减少使用的控件,布局。RelativeLayout是绝对的利器,通过它可以减少布局的层次。同时要尽可能的复用控件,这样可以减少ListView的内存使用,减少滑动时GC次数。ListView的背景色与cacheColorHint设置相同颜色,可以提高滑动时的渲染性能。ListView中getView是性能是关键,这里要尽可能的优化。getView方法中要重用view;getView方法中不能做复杂的逻辑计算,特别是数据库操作,否则会严重影响滑动时的性能;ListView数据项较多时考虑分页加载。

13.注意使用线程的同步机制(synchronized),防止多个线程同时访问一个对象时发生异常。

14.合理使用StringBuffer,StringBuilder,String

在简单的字符串拼接中,String的效率是最高的,例如String s = “hello” + “world”;

但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,例如:

    String str2 = “This is”;

    String str3 = “ a ”;

    String str4 = “ test”;

    String str1 = str2 +str3 + str4;

这里就要求使用StringBuilder了

在单线程中,StringBuilder的性能要比StringBuffer高。多线程为了线程安全需要采用StringBuffer,因为它是同步的。常规下一般用StringBuilder。

15. 尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。

16.I/O流操作记得及时关闭流对象。

17.使用IntentService代替Service

IntentService和Service都是一个服务,区别在于IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent(在onHandleIntent方法中),对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。

18.使用Application Context代替Activity中的Context

不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的

对于生命周期长的对象,可以使用Application Context

不要把Context对象设置为静态。

19.集合中的对象要及时清理

 我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。

20.Bitmap的使用

较大的Bitmap注意压缩后再使用,加载高清大图可以考虑BitmapRegionDecoder的使用,

不再使用的Bitmap注意及时recycle().

21.巧妙的运用软引用(SoftRefrence)

 有些时候,我们使用Bitmap后没有保留对它的引用,因此就无法调用Recycle函数。这时候巧妙的运用软引用,可以使Bitmap在内存快不足时得到有效的释放。有关Java引用机制的介绍可以看我的另一篇博客:http://blog.csdn.net/gs12software/article/details/51051813

22.尽量不要使用整张的大图作为资源文件,尽量使用9path图片

普通的资源图优先放在mipmap目录下(AndroidStudio环境),当然.9图还不支持放在这个目录,应该放在drawable

23.了解并使用库函数

Java标准库和Android Framework中包含了大量高效且健壮的库函数,很多函数还采用了native实现,通常情况下比我们用Java实现同样功能的代码的效率要高很多。所以善于使用系统库函数可以节省开发时间,并且也不容易出错。

三、使用工具分析应用程序性能

(这部分内容较多,以后会在《Android开发性能优化总结(二)》中描述,待续。

时间: 2024-08-05 07:02:43

Android开发性能优化总结(一)的相关文章

Android开发性能优化总结(二)

接上一篇<Android开发性能优化总结(一)> 一.安卓UI性能检测与优化 UI是安卓应用程序与用户打交道的最直接途径,UI设计的好不好,直接影响到用户的体验,如果没有达到他们心目中的自然流畅细节,用户要是能够感觉出来,少则影响心情,多则卸载应用:所以一个应用的UI显示性能问题就不得不被开发人员重视. 1.UI卡顿常见原因: 在UI线程中做了耗时操作,导致UI线程卡顿: 布局Layout过于复杂,无法在16ms内完成渲染: 同一时间动画执行的次数过多,导致CPU或GPU负载过重: View过

(转) Android开发性能优化简介

作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以需要开发人员更加专心去实现和优化你的代码了.选择合适的算法和数据结构永远是开发人员最先应该考虑的事情.同时,我们应该时刻牢记,写出高效代码的两条基本的原则:(1)不要做不必要的事:(2)不要分配不必要的内存. 我从去年开始接触Android开发,以下结合自己的一点项目经验,同时参考了Google的优

Android开发性能优化大总结

一.Android相关 1.  采用硬件加速,在androidmanifest.xml中application添加android:hardwareAccelerated="true".不过这个需要在android 3.0才可以使用.android4.0这个选项是默认开启的.2.  View中设置缓存属性.setDrawingCache为true.3.    优化你的布局.通过Android sdk中tools目录下的layoutopt 命令查看你的布局是否需要优化.4.    动态加载

Android应用开发性能优化完全分析

 应用UI性能问题分析 UI可谓是一个应用的脸,所以每一款应用在开发阶段我们的交互.视觉.动画工程师都拼命的想让它变得自然大方美丽,可是现实总是不尽人意,动画和交互总会觉得开发做出来的应用用上去感觉不自然,没有达到他们心目中的自然流畅细节:这种情况之下就更别提发布给终端用户使用了,用户要是能够感觉出来,少则影响心情,多则卸载应用:所以一个应用的UI显示性能问题就不得不被开发人员重视. 2-1 应用UI卡顿原理 人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然

Android 应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,譬如Google官方都已经推出了优化专题,我这里只是总结下自的感悟而已,若有得罪欢迎拍砖,我

【转】Android应用开发性能优化完全分析

http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网

转——Android应用开发性能优化完全分析

[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,

转:Android应用开发性能优化完全分析

转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质

【读书笔记】《Android应用性能优化最佳实践》

<第一行代码>读书笔记 一.引言 二.读书内容 书名:<Android应用性能优化最佳实践> 作者:罗彧成 (腾讯音乐Android开发总监) 出版社:机械工业出版社 封面: 三.书籍评价 四.个人心得 五.参考文档