在发布前优化Android应用程序

我处于一个“ 特殊 ”情况下,关于我的程序的效率 。 现在我正处于一个需要改善应用程序性能并降低电池消耗的阶段

在问题之前:

  • 首先 ,我的申请工作。 它运行良好 – 没有任何错误。
  • 其次 ,我已经阅读了Android开发者网站上的“优化电池寿命”,并对他们所要求的小事进行了优化。 没有任何问题。

现在,我很想知道其他开发人员用来优化自己的应用程序的特殊修复程序。 用户可能永远不会认可或注意的东西。 但是,修复将增加电池寿命或帮助改进应用程序的维护。

那么, 你独特的优化技巧是什么?

我正处于一个特别的情况,那就是我真的在寻找知识,我认为这将是一个很好的机会来分享开发人员对他们所处状况的了解。

请给出最佳答案,因为这将鼓励伟大的开发者分享他们的知识。

在某些时候,你将会达到使用已知技巧将达到极限的地步。 在这一点上做的最好的事情是分析你的代码,并根据你的具体要求看瓶颈是什么区域。

使用MAT和使用Traceview 调查RAM使用情况 :一篇关于如何使用这些工具来分析应用程序的文章。

跟踪和壁球分配。 分配得越多,垃圾收集器就越需要运行,从而阻止你的进程在相当长的时间内完成其他任何事情,比如100ms左右。

我所知道的最好的工具是DDMS中包含的Allocation Tracker。

不仅GC可以影响用户体验,而且多余的分配和GC也会消耗一些计算资源。

这是一个例子和一个小窍门。 在我的应用程序中,我有一个显示当前(audio)时间的时钟,包括十分之一秒。 这经常更新。 而且,只要您使用CharSequence调用setText(),TextView就会在内部执行分配。 但是它不会用setText(char []文本,int start,int len)变体来分配任何东西。 这没有logging,当我问到这个问题时没有人回答。

有很多这样的。 这是我的应用程序包含50%本地代码(但还有其他原因)的原因之一。

除此之外,我可以推荐你试用ProGuard 。 它执行几个优化过程,并将这些信息logging为项目中未使用的方法,这可以帮助您删除代码中的剩余部分。

如果您的应用程序将有大量的屏幕时间, 尽可能使用黑色 。 这将减less设备最差部分的电池消耗:特别是在AMOLED手机和平板电脑中的屏幕。

对于具有多个活动的应用程序,检查是否没有重新启动只需要通过使用适当的意图标志提前到达的活动。 检查你的堆是否受到控制,并且不必要的视图,绑定和上下文没有被创build。

我find最好的工具来显示你所有这些应用程序运行是:

adb shell dumpsys meminfo 'your apps package name' 

在使用SQLlite时,要特别注意索引。 不要假设任何事情。 我在Zwitscher中获得了巨大的加速,当时我把索引放在通常用于search的列上。

一些技巧可以帮助您在UI方面优化您的应用程序:

  • 使用convertView作为列表适配器 – 如果在Adapter.getView()创build一个新的视图,那么这个例程会被调用,这将是非常昂贵的。 使用convertView可以重用已经创build的视图。 在ApiDemos中可以find很好的例子(和ViewHolder一起使用)。

  • 这可能会发生,你的布局没有完全优化,可以改善(例如通过使用合并或删除父母)。 Android的工具layoutopt会为你find这样的情况。 它可以与HierarchyViewer一起用于检查单个视图。 更多信息在这里 。

  • 删除背景drawable – Android框架曾经有(它仍然有?)检测到应该绘制的视图的问题 。 您的(默认)可绘制背景有可能只是被您的不透明的UI隐藏。 为了摆脱这个浪费的绘图,只需删除背景可绘制。

可以使用自定义样式完成

 <resources> <style name="Theme.NoBackground" parent="android:Theme"> <item name="android:windowBackground">@null</item> </style> </resources> 

一些技巧可以帮助您根据电池使用情况优化您的应用程序:

  • 检查networkingtypes,并等待用户进入无线或3G(而不是漫游)的区域,然后才允许他使用连接

  • 尽可能使用gzip文本数据来加速下载和parsing

  • 回收复杂的Java对象,如XmlPullParserFactory / BitmapFactory / StringBuilder / Matcher

有关更多的电池技巧,请参阅Coding for Life – 电池寿命,即是 。

有些事情要考虑:不要过度使用String,例如在一个巨大的循环中。 这将创build大量必须被GC化的String对象。 “不好的编码”例子将在每个循环中产生2个string对象。 下一个例子将只产生一个最终的string和一个string构build器。 当优化巨大的循环速度时,这会产生巨大的差异。 在制作我的Wordlist Pro Android应用程序的时候,我使用了很多stringbuilder,而且在270000字的时候速度非常快。

  //Bad coding: String s = ""; for(int i=0;i<999999;i++){ s = "Number="; s = s + i; System.out.println(s); } //Better coding final String txt = "Number="; StringBuilder sb = new StringBuilder(); for(int i=0;i < 999999;i++){ sb.setLength(0); sb.append(txt); sb.append(i); System.out.println(sb); } 

我写了一篇关于这个问题的更多扩展的博客post。 在这里阅读

我想在所有可能的地方使用“final”variables也可以提高执行速度。

使用OptiPNG和PNGCrush等工具优化您的PNG图片,从APK大小中删除一些(千字节)字节。 网站的图像优化技巧也适用于这里:使用适当的图片格式,使用JPG压缩,考虑使用二进制透明胶片而不是8位透明胶片等。

如果您发送带有Alpha通道的大型PNG,您可以交易一些APK大小的启动速度,并为RGB和A通道使用不同的JPG 。

如果您正在进行HTTP连接,请检查您的HTTP客户端是否利用内容压缩。 如果它caching收到的HTTP响应,请检查它是否正确理解并使用与caching相关的HTTP头。

如果您有networking操作,请尝试重新使用相同的httpclient实例。 避免使用正则expression式。

尝试使用DDMS来跟踪系统中运行的所有线程。 例如,我已经注意到,我使用webview来显示html内容,我注意到它创buildcookiepipe理会话pipe理等几个线程,这增加了我的记忆足迹。 所以,除非你有严重的需要显示复杂的HTML尝试使用正常工具类“Html”在Android中显示HTML内容。 由于eula typicall包含HTML文本,因此这可能对显示Eula的人有用。

如果你必须做networking操作,如果你是初学者,那么尝试使用AndroidHttpClient,它已经有了一些很好的cachingSSL会话的能力,并且它确实有助于提高你的性能。 总是将套接字连接超时设置为60秒左右或某些有限值,因为无限超时会导致死锁,特别是在ssl握手期间丢弃连接时。

使用Android资源跟踪器查找可以删除的项目中未使用的资源。

如果可以通过使用string操作例程来获取标签之间的文本来parsingXMLinput,请避免使用XPath。 我已经testing过,可以在HTC Desire的50000条数据集上确认这种情况下的10倍的提升。

我知道我稍后join了这个对话,但在一个地方有很多好的提示是完美的,所以我希望这个线程能够经常更新和更新。 我的提示:

  • 不要阻塞昂贵的作业的UI线程,如果没有来自应用程序的响应(使用AsyncThreads),用户将离开。
  • 使用LINT ,扫描Android项目源的潜在错误的新工具。

..将会被更新..