Android性能调优包含html
参考连接 http://www.trinea.cn/android/android-traceview/android
本文主要针对代码调优web
应用程序的性能问题体如今不少方面, 好比第一次启动速度慢,或者进入某一界面速度慢;动画执行过程不流畅,或者动画执行卡顿时间长;ListView列表滑动过程当中卡顿,不流畅;应用程序自定义的某特定界面执行速度慢;响应某一用户事件时长时间无响应(ANR);操做数据库时,执行大量数据的增删改查操做,执行速度慢;文件读写频繁,缓存文件过大致使卡顿;应用长时间运行后,随机出现卡顿现象。算法
以上的问题的缘由可能不仅一个,而且不少状况下并非应用自己的问题,也有多是系统其余层次有问题,只不过体如今应用层。因此开发人员在处理性能问题时,须要作的第一件事情就是判断是不是应用自身引发的性能问题,而后再对症下药;但有些时候应用自己逻辑正常,但因为系统的硬件配置不足引发了异常,此时就要根据产品或项目需求,采起一些更加精准的方式优化性能,以弥补硬件配置的不足。数据库
如下从几个不一样的角度总结一下应用程序性能优化的一些方法。编程
1、编程思想缓存
应用层的性能优化一般能够从如下几个方面考虑:安全
2、编程技巧性能优化
(一)Performance Tips (For Java)网络
Google官网上有一些关于应用程序性能提高的技巧,以前公司内也有不少总结提到过,在此简单罗列一下,详细内容能够从官网获取。 http://developer.android.com/training/articles/perf-tips.html 须要说明的是,文章列出的优化技巧主要是一些微小的性能提高,决定程序总体性能的仍然取决于程序的业务逻辑设计、代码的数据结构和算法。研发人员须要将这些优化技巧应用到平时的编码过程当中,聚沙成塔,也会对性能有很大的影响。 写出高效的代码须要遵循两条原则: 不执行没必要要的操做; 不分配没必要要的内存; 两条原则分别针对CPU和内存,完成必要操做的前提下尽量的节省CPU和内存资源,天然执行效率要高。单纯这样说听起来很虚,毕竟没有一个统一的标准判断什么是必要和没必要要的,须要结合具体状况具体分析了。
建立太多的对象会形成性能低下,这谁都知道,但是为何呢?首先分配内存自己须要时间,其次虚拟机运行时堆内存使用量是有上限的,当使用量到达必定程度时会触发垃圾回收,垃圾回收会使得线程甚至是整个进程暂停运行。可想而知,若是有对象频繁的建立和销毁,或者内存使用率很高,就会形成应用程序严重卡顿。
2.合理使用static成员
主要有三点须要掌握: 若是一个方法不须要操做运行时的动态变量和方法,那么能够将方法设置为static的。 常量字段要声明为“static final”,由于这样常量会被存放在dex文件的静态字段初始化器中被直接访问,不然在运行时须要经过编译时自动生成的一些函数来初始化。此规则只对基本类型和String类型有效。 不要将视图控件声明为static,由于View对象会引用Activity对象,当Activity退出时其对象自己没法被销毁,会形成内存溢出。
面向对象设计中,字段访问使用Getters/Setters一般是一个好的原则,可是在Android开发中限于硬件条件,除非字段须要被公开访问,不然若是只是有限范围内的内部访问(例如包内访问)则不建议使用Getters/Setters。在开启JIT时,直接访问的速度比间接访问要快7倍。
优先使用加强for循环一般状况下会得到更高的效率;除了一种状况,即对ArrayList进行遍历时,使用普通的for循环效率要更高。
使用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](https://my.oschina.net/u/561366)</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。 **
调用方法时传递的参数以及在调用中建立的临时变量都保存在栈(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-xxxx下,须要复制到手机sd卡上使用的应放在asset目录
23.了解并使用库函数
Java标准库和Android Framework中包含了大量高效且健壮的库函数,不少函数还采用了native实现,一般状况下比咱们用Java实现一样功能的代码的效率要高不少。因此善于使用系统库函数能够节省开发时间,而且也不容易出错。
24.关于WebView
在Activity或者Fragment销毁时记得把WebView也销毁
[@Override](https://my.oschina.net/u/1162528) protected void onDestroy() { if (webView!= null) { webView.destroy(); webView= null; } super.onDestroy(); }
2五、 使用ProGuard来剔除不须要的代码
android { buildTypes { release { minifyEnabled true // 打包剔除无关代码 shrinkResources true // 打包剔除无关资源图片 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'src/main/proguard-project.txt' signingConfig signingConfigs.debug } }