发布前优化Android应用[关闭]


120

我在程序效率方面处于“ 特殊 ”情况。现在我处于一个需要提高应用程序性能并减少电池消耗的阶段

在提问之前:

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

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

我处于一种特殊的情况下,我确实在寻找知识,我认为这将是一个很好的机会,可以分享开发人员有关他们所处的情况的知识。

请对好的答案进行投票,因为这将鼓励优秀的开发人员分享他们的知识。


2
由于效率最终归结为不执行任何您不需要做的事情(或者比您需要做的更多的事情),我认为这很大程度上取决于您的应用程序必须完成什么类型​​的工作...可以做的就是收集“通常的嫌疑犯”
克里斯·斯特拉顿

1
@克里斯·斯特拉顿:嗯,你是对的。但是,“通常的嫌疑人”或对特定技巧的一些回答将使其他人更容易做出决定,如果该“猜测”正是他们正在寻找的东西(并且对于特定情况是否有用)。
Wroclai 2011年

荒谬的是,这个站点上关闭了许多真正有趣的问题。
Patrick

Answers:



37

跟踪和压缩分配。您分配的次数越多,垃圾收集器将需要运行的频率就越高,从而使您的进程在相当长的一段时间(例如100毫秒左右)内停止执行其他任何操作。

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

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

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

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

除此之外,我建议您尝试使用ProGuard。它执行了几次优化遍历,并记录了项目中未使用的方法之类的信息,这可以帮助您删除代码中的残留物。


1
好答案!具体的技巧表示赞赏。
Wroclai 2011年

22

如果您的应用有很多屏幕显示时间,请尽可能使用黑色。这将减少设备最坏部分的电池消耗:屏幕,特别是AMOLED手机和平板电脑中的屏幕。


明智地使用深色意味着可以赢得电池。
罗伯特·马赛奥利

7
另一方面,在LCD屏幕上,黑色比白色消耗更多的功率,因为​​光(由背光源发出)从白色开始,必须被主动阻挡才能产生黑色。[ scientificamerican.com/article.cfm?id=fact-or-fiction-black-is ]底线:不要指望太多关于这个色彩优化。
闪亮

16

对于具有多个活动的应用程序,请检查您是否没有重新启动仅需要使用适当的Intent标志带到最前面的活动。检查您的堆是否处于受控状态,并且没有创建不必要的视图,绑定和上下文。

我发现在应用运行时向您展示所有这些的最佳工具是:

adb shell dumpsys meminfo 'your apps package name'

1
哦,那是新的。感谢分享!
Wroclai 2011年

15

使用SQLlite时,请特别注意索引。不要承担任何责任。当我将索引放在通常用于搜索的列上时,我在Zwitscher中获得了极大的提速。


13

可以帮助您优化UI的一些技巧:

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

  • 可能会发生布局没有完全优化而无法改善的情况(例如,通过合并或删除父项)。Android工具layoutopt将为您找到这种情况。可以与HierarchyViewer一起使用以检查单个视图。更多信息在这里

  • 删除背景可绘制对象-曾经有(仍然有吗?)Android框架在检测应绘制哪些视图时出现问题。您的(默认)背景可绘制对象有可能仅在随后被不透明的UI隐藏时才被绘制。要摆脱这种浪费的图形,只需删除背景可绘制对象即可。

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

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

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

  • 检查网络类型并等待,直到用户进入具有wifi或3G的区域(并且不能漫游),然后才允许他使用连接

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

  • 再循环复杂Java对象诸如XmlPullParserFactory/ BitmapFactory/ StringBuilder/ Matcher

有关电池的更多技巧,请参阅“寿命编码-电池寿命”


“回收诸如此类的复杂Java对象”如何?Java具有GC时
Yousha Aleayoub 2015年

9

需要考虑的事情:不要过度使用String,例如在一个巨大的循环中。这将创建很多必须进行GC处理的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);
    }

我写了一个关于这个问题的更广泛的博客文章。 在这里阅读


6

我猜想尽可能在​​所有可能的地方使用“最终”变量也可以提高执行速度。


1
我记得在某处阅读过,您可以提供一个链接吗?
Wesley Wiser

1
不确定是否是最终的变量真实的,但可以为静态final变量-见stackoverflow.com/questions/3117770/...
阿利斯泰尔·科林斯

无法提供链接,但我在Reto Meier(2010年5月19日)/ Google IO的“ Android初学者指南”中遇到了有关该链接的通知。简短地说,它是免费下载的,并且对于如何构建一个好的应用程序具有很好的建议。
斯坦(Stan)

2
最终变量可以使代码更有效,因为这意味着所有对象将在同一运行中进行GC处理。根据您将它们设置为null的时间不同。
罗伯特·马赛奥利

1
问题:编译器是否没有明确为您执行此操作?我认为它应该在其代码分析阶段就这样做。
Pawan

6

使用OptiPNGPNGCrush之类的工具优化您的PNG图片以减少APK大小的部分(千字节)。网站的图像优化技巧也适用于此:使用适当的图片格式,使用JPG压缩,考虑使用二进制透明胶片而不是8位透明胶片等。

如果您提供带有Alpha通道的大型PNG,则可以将一些APK大小换成启动速度,并为RGB和A通道使用单独的JPG

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


感谢您的见解!我从未听说过!
Wroclai 2011年


5

尝试使用DDMS跟踪系统中运行的所有线程。例如,我注意到我正在使用webview显示html内容,我注意到它为cookie管理会话管理等创建了几个线程,这增加了我的内存占用空间。因此,除非您非常需要显示复杂的html,否则请尝试在android中使用常规实用程序类“ Html”来显示html内容。这对于显示Eula的人可能很有用,因为eula典型地包含html文本。

如果必须进行网络操作,如果您是初学者,请尝试使用AndroidHttpClient,它具有一些用于缓存SSL会话的良好功能,并且所有这些功能实际上都有助于提高性能。始终将套接字连接超时设置为60秒左右或一些有限值,因为无限超时会导致死锁,尤其是在ssl握手期间断开连接的情况下。



4

如果可以通过使用字符串操作例程来获取标记之间的文本来解析XML输入,请避免使用XPath。在HTC Desire上的50000项数据集上,我已经测试过并可以确认在这种情况下可提高10倍。


3

我知道我稍后会加入这个对话,但是在一个地方有很多好的提示是很完美的,所以我希望这个话题会很活跃并且经常更新。我的提示:

  • 不要用繁琐的工作来阻止UI线程,如果没有来自应用程序的响应(使用AsyncThreads),用户将离开。
  • 使用新工具LINT,它可以扫描Android项目源以查找潜在的错误。

..将会被更新..

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.