在发布之前优化Android应用程序

Wro*_*lai 120 java optimization android

关于我的计划的效率,我处于" 特殊 "状态.现在我处于需要提高应用程序性能和减少电池消耗的阶段.

在问题之前:

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

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

我处在一个特殊的情况,我正在寻找知识,我认为这将是一个很好的机会,可以分享开发人员对他们所处过的情况的了解.

请投票给出很好的答案,因为这将鼓励优秀的开发人员分享他们的知识.

unh*_*ler 67

在某些时候,你将达到使用已知技巧将达到极限的程度.此时最好的做法是对您的代码进行分析,并根据您的具体要求了解哪些区域是瓶颈.

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


oli*_*erg 37

跟踪和挤压分配.您分配的越多,垃圾收集器运行所需的频率就越高,阻止您的进程在相对较长的时间内执行任何其他操作,例如100毫秒左右.

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

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

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

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

除此之外,我建议你试用ProGuard.它执行多个优化传递,并在项目中记录诸如未使用方法之类的信息,这可以帮助您删除代码中的剩余物.


Ale*_*dam 22

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

  • 另一方面,黑色在LCD屏幕上比白色消耗更多功率,因为​​光(由背光源提供)开始为白色并且必须被主动阻挡以产生黑色.[http://www.scientificamerican.com/article.cfm?id=fact-or-fiction-black-is]底线:这个颜色优化不要太多. (7认同)

Nic*_*ckT 16

对于具有多个活动的应用程序,请检查您是否通过使用适当的Intent标志重新启动只需要将其带到前面的活动.检查您的堆是否受到控制,以及是否未创建不必要的视图,绑定和上下文.

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

adb shell dumpsys meminfo 'your apps package name'
Run Code Online (Sandbox Code Playgroud)


Hei*_*upp 15

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


you*_*uri 13

一些提示可以帮助您在UI方面优化您的应用:

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

  • 可能会发生您的布局未完全优化并且可以改进(例如,通过使用合并或删除父项).Android工具layoutopt会为您找到这样的情况.它可以与HierarchyViewer一起用于检查各个视图.更多信息在这里.

  • 删除背景drawable - 以前的Android框架(它还有吗?)检测应该绘制哪些视图的问题.您的(默认)背景绘制可能只会被随后的不透明UI隐藏.要摆脱这种浪费的绘图,只需删除背景drawable.

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

<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

一些提示可以帮助您在电池使用方面优化您的应用:

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

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

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

有关更多电池技巧,请参阅Coding for Life - 电池寿命,即可.


ern*_*ell 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);
    }
Run Code Online (Sandbox Code Playgroud)

我写了一篇关于此事的更广泛的博文. 在这里阅读


Sta*_*tan 6

我想在任何地方都可以使用"最终"变量来提高执行速度.

  • 最终变量可以使代码更有效,因为它意味着所有对象将在同一次运行中进行GC.不是在不同的时间基于何时将它们设置为null. (2认同)

Pēt*_*une 6

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

如果您发送带有Alpha通道的大型PNG,您可以交换一些APK大小以获得启动速度,并为RGB和A通道使用单独的JPG.

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


小智 5

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


小智 5

尝试使用DDMS跟踪系统中运行的所有线程.例如,我注意到我使用webview来显示html内容,我注意到它为cookie管理会话管理等创建了很少的线程.这增加了我的内存占用量.因此,除非你非常需要显示复杂的html尝试在android中使用普通的实用程序类"Html"来显示html内容.这可能对显示Eula的人有用,因为eula typicall包含html文本.

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