发布前优化 Android 应用程序

我在一个“ special”的情况下关于我的程序的 效率。现在我需要提高应用程序的性能并减少 电池消耗量

在提问之前:

现在,我很想知道其他开发人员用来优化自己的应用程序的 特别的修复程序。用户可能永远不会认识或关注的东西。但是,这些修复要么会增加电池寿命,要么有助于改善应用程序的维护。

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

我处在一个特殊的情况下,我真的在寻找知识,我认为这将是一个很好的机会,分享开发人员的知识,他们都处在这种情况下。

Please, vote up great answers as that will encourage great developers to share their knowledge.

19146 次浏览

在某些时候,你会到达一个点,使用已知的技巧将达到他们的极限。此时最好的做法是对代码进行概要分析,并根据具体需求查看哪些领域是瓶颈。

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

田径和壁球分配。分配的内容越多,垃圾收集器需要运行的频率就越高,从而使您的进程在相对较长的时间内无法执行其他任何操作,比如100毫秒左右。

我所知道的最好的工具是 DDMS中包含的分配跟踪器。

不仅 GC 会对用户体验产生影响,而且多余的分配和 GC 确实会消耗一些计算资源。

这里有一个例子和一个小技巧。在我的应用程序中,我有一个显示当前(音频)时间的时钟,包括十分之一秒。这是经常更新的。每当您使用 CharSequence 调用 setText ()时,TextView 都会执行分配 在内部。但是它没有使用 setText (char [] text、 int start、 int len)变量分配任何内容。没有记录,我问起的时候也没人回答。

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

除此之外,我还可以建议您尝试使用 ProGuard。它执行几个优化步骤,并记录项目中未使用的方法等信息,这可以帮助您清除代码中的剩余内容。

在使用 SQLlite 时,请特别注意索引。不要假设任何事情。在 Zwitscher,当我把索引放在常用于搜索的列上时,我的速度大大加快了。

我想在任何可能的地方使用“ final”变量也可以提高执行速度。

对于具有多个活动的应用程序,请检查您是否正在重新启动只需使用适当的意图标志显示在前面的活动。检查堆是否处于控制之下,是否没有创建不必要的视图、绑定和上下文。

在应用程序运行时,我发现最好的工具是:

adb shell dumpsys meminfo 'your apps package name'

如果你的应用程序将有很多的屏幕时间,尽可能使用黑色。这将减少设备最糟糕的部分的电池消耗: 屏幕,特别是在 AMOLED 手机和平板电脑。

如果有网络操作,请尝试重用相同的 httpclient 实例。避免使用正则表达式。

Use the Android 资源追踪系统 to find unused resources in your project that can be deleted.

尝试使用 DDMS 跟踪系统中运行的所有线程。例如,我注意到我使用 webview 来显示 html 内容,我注意到它为 cookie 管理会话管理等创建了一些线程。增加了我的记忆足迹。因此,除非您非常需要显示复杂的 Html,否则可以尝试在 android 中使用普通的实用工具类“ Html”来显示 Html 内容。这对于显示 Eula 的人可能很有用,因为 Eula 典型调用包含 html 文本。

如果您是初学者,那么如果必须进行网络操作,请尝试使用 AndroidHttpClient,它拥有一些很好的 SSL 会话缓存功能,所有这些都有助于提高性能。始终将套接字连接超时设置为大约60秒或一些有限的值,因为无限超时可能导致死锁,特别是在 ssl 握手期间断开连接时。

一些技巧可以帮助你根据 UI优化你的应用程序:

  • 对列表适配器使用 convertView-如果你在 Adapter.getView()中创建一个新的视图,这将是非常昂贵的,因为这个例程对列表中的每个位置都要调用。使用 convertView可以重用已创建的视图。在 ApiDemos中可以找到一个很好的例子(连同 ViewHolder的使用)。

  • It might happen that your layouts are not fully optimized and can be improved (for instance by using merging or removing parents). Android tool 布局选择 will find such a situation for you. It can be used with HierarchyViewer for inspecting individual views. More info 给你.

  • 移除背景可绘制的—— Android 框架过去有(现在还有吗?)一个 问题,检测应该绘制什么样的视图。您的(默认)背景绘制可能只会被随后的不透明用户界面隐藏。要摆脱这种浪费绘图只需删除背景绘制。

它可以使用自定义样式来完成

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

一些技巧可以帮助你在 电池使用方面优化你的应用程序:

  • check networking type and wait until user gets in the area with wifi or 3G (and not roaming) and only then allow him to use connection

  • 尽可能使用 gzip 获取文本数据,以加快下载和解析速度

  • 回收复杂的 java 对象,如 XmlPullParserFactory/BitmapFactory/StringBuilder/Matcher等。

更多电池技巧见 电池寿命编码

如果可以通过使用字符串操作例程来获取标记之间的文本来解析 XML 输入,则应避免使用 XPath。我已经测试,可以证实10倍的改善,在这种情况下,对50000项数据集,对 HTC 的欲望。

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

如果你船大 PNG 与阿尔法通道,你可以交易一些 APK 大小的启动速度和 为 RGB 和 A 通道使用单独的 JPG

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

我知道我加入这个对话有点晚,但它将是完美的,有很多好的提示在一个地方,所以我希望这个线程将是活的,更新经常。我的建议:

  • 不要用昂贵的工作阻塞 UI 线程,如果没有应用程序的响应,用户将离开 (使用 AsyncThreads)。
  • 使用 LINT,这个新工具可以扫描 Android 项目源代码中潜在的 bug。

. . 将被更新. 。

需要考虑的事情: 不要过度使用字符串,例如在一个巨大的循环中。 这将创建许多必须进行 GC‘ ed 的 String 对象。 “糟糕的编码”示例将在每个循环中生成2个字符串对象。下一个示例将只生成一个最终 String 和一个 stringBuilder。当优化大循环的速度时,这将产生巨大的差异。我在开发 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);
}

关于这个问题,我写了一篇更长的博客文章。 看这里