A blog site for teams who care about building great apps

App瘦身不只是一个传说

在上一篇文章中,我们探究了一套能保证近乎完美的 APP 启动体验的架构/第三方库的选择。今天我想探究另一种性能优化:APK 的大小。更小的 APK 会带来更快的资源查找和反射调用。图片优化是一种重要的 APK 瘦身手段,能减少更多的掉帧现象。而且用户通常更喜欢更小的 APP,因为它们需要下载的数据更小,安装占用的空间也更小。

阅读文章
常见的八种导致 APP 内存泄漏的问题

像 Java 这样具有垃圾回收功能的语言的好处之一,就是程序员无需手动管理内存分配。这减少了段错误(segmentation fault)导致的闪退,也减少了内存泄漏导致的堆空间膨胀,让编写的代码更加安全。然而,Java 中依然有可能发生内存泄漏。所以你的安卓 APP 依然有可能浪费了大量的内存,甚至由于内存耗尽(OOM)导致闪退。 传统的内存泄漏是由忘记释放分配的内存导致的,而逻辑上的内存泄漏则是由于忘记在对象不再被使用的时候释放对其的引用导致的。如果一个对象仍然存在强引用,垃圾回收器就无法对其进...

阅读文章
NimbleDroid 2016年5月产品更新

这个月我们主要聚焦于改进 NimbleDroid 中用户无法直接感知的部分,同时也为下个月将要发布的令人振奋的特性做好准备工作。现在,有以下几点可以感知到的提升。 更好的上传管理功能 我们有很多用户都在使用 Gradle 插件自动上传 功能了,或者是在调研 NimbleDroid 时上传了一些测试版本的 APP。由于有的用户希望可以删除指定上传的分析结果,我们在 APP 页面的上传 tab 中增加了这一功能。你也可以查看和管理完整的上传分析结果列表。 方法计数更好的拆分处理 我们之前的方法...

阅读文章
拖慢 APP 启动的 5 个常见问题

在过去的几个月里,通过 NimbleDroid 的分析,我们分享了很多导致安卓 APP 运行变慢的常见问题。在本文中,我们把这些问题总结如下。 Java 发射的使用。在 Java 和安卓开发中,反射是非常有用的特性。但是如果使用不当,反射往往是导致安卓 APP 严重性能问题的元凶。例如,你使用 Gson 来序列化/反序列化大量的数据,使用反射的 adapter 会严重拖慢你的 APP。请使用自定义的 adapter。我们的建议是,理解你们使用反射(或者利用反射的库)会导致怎样的后果。...

阅读文章
第三方库和SDK中隐藏的性能问题

很难想象现在的 APP 不会使用任何第三方库或者 SDK,毕竟大部分 APP 都会需要进行网络图片加载、闪退追踪、广告或者用户行为分析。这是很有意义的,开发者不应该在每次开发 APP 时都重复造轮子。然而很多第三方库和 SDK 都会导致 APP 启动变慢以及一些其他的性能问题。而这些性能问题通常都很难追踪分析,因为大部分开发者都对第三方库和 SDK 的实现细节了解很少,甚至完全没有了解。 第三方库和 SDK 中常见的性能问题 我们一直在向开发者们强调第三方库和 SDK 中存在的几个常见问题,然而其...

阅读文章
突破App启动时间的极限

开发一个高性能的小规模 APP 很简单,一旦涉及到数据缓存、JSON 解析、不可变对象、依赖注入以及一系列安卓 support 库时,保持 APP 的高性能就变得很有挑战性了。幸运的是保持 APP 的高性能依然是有可能的,即便我们使用了 RxJava 进行响应式编程,不可变数据对象, Guava 集合,Optional,以及用 Dagger 进行依赖注入。关键是如何减少[阻塞代码](http://blog.nimbledroid.com/2016/03/21/ways-to-hang-main-thr...

阅读文章
NimbleDroid 2016年4月产品更新

这个月我们发布了一系列的新特性,大部分主要关注于让 NimbleDroid 的 UI 更便于使用。 测试凭证(Test Credentials)的保存 我们以前就允许用户在上传 APK 时同时上传测试凭证,这次我们允许用户保存一个测试凭证,并默认用于其他 APP。它将默认应用在 gradle 上传的 APK 中,也会在用户上传测试凭证时提供保存选项。 方法数统计、APK 大小、问题数的趋势数据 我们的一个用户希望能够看到方法数、APK 大小的趋势信息,我们觉得这个主意很不错,所以我们对这些...

阅读文章
揭秘在安卓平台上奇慢无比的 ClassLoader.getResourceAsStream

我们 NimbleDroid 经过大量的分析,发现了一些避免 APP 整体变慢,让 APP 快速启动以及迅速响应的技巧。其中有一个就是奇慢无比的 ClassLoader.getResourceAsStream 函数,这个函数可以让 APP 通过名字访问资源。在传统的 Java 程序开发中,这个函数用得非常普遍,但是在安卓平台上,这个函数在第一次调用时执行时间非常长,会严重拖慢安卓 APP 的运行。在我们分析的 APP 和 SDK 中(我们分析了大量的 APP 和 SDK ),我们发现超过 10% 的 ...

阅读文章
5个导致主线程卡顿较鲜为人知的元凶

广大安卓开发者都知道主线程是APP用来响应用户交互的线程,因此应该避免执行耗时操作。通常来说,耗时方法导致主线程卡住超过16*N毫秒时,APP界面将会丢掉N帧。让我们把这些耗时长的方法称作卡顿函数(Hung Method)。在本文中,我们首先看一个典型的卡顿函数案例,接着仔细分析5个较鲜为人知的导致主线程卡顿原因。 Hollister中一个卡顿函数的例子 让我们分析一下Hollister v3.1.2中的卡顿函数例子: prefetchData() 函数导致主线程卡住了很长时间 你可...

阅读文章
NimbleDroid 2016年3月产品更新

过去的一个月中,我们加入了很多激动人心的新特性,同时也包括一系列提升NimbleDroid用户体验的更新。 内存泄漏 NimbleDroid早已提供检测速度相关问题的功能,现在我们加入了检测内存泄露的新功能。我们会报告对已销毁的Activity的引用情况,这些引用已销毁Activity的对象会导致Activity对象无法被垃圾回收,即内存泄漏。Activity对象的泄露在安卓平台是非常严重的bug,因为Activity对象占用非常多的内存资源,而且Activity对象可能会被创建多次,每次都会进一...

阅读文章
新闻类榜单APP的启动速度有多快?

两周前我们公布了Google Play榜单APP的冷启动速度,与此同时,New York Times的开发者也详细说明了他们是如何在NimbleDroid的帮助下把安卓APP的启动时间从5.6秒降低到1.7秒的。所以我们觉得有必要对新闻类榜单APP进行一次快速的启动速度分析。 为什么NYTimes的开发者如此关注APP的启动时间?想象一下当用户收到一条新闻推送之后,点击通知栏消息,却需要等待4秒才能启动APP的场景,这样的用户体验毫无疑问非常糟糕,所以快速启动和运行流畅对新闻类A...

阅读文章
依赖注入框架性能对比

依赖注入(DI)技术在安卓开发领域已经非常流行了。DI可以减少重复代码的编写,更便于调试和测试,使得开发出优秀的APP更加简单。尽管各种DI框架看着都非常强大,但也需要非常注意它们对APP性能带来的开销。本文中我们对比了三个最流行的DI框架,来帮助开发者了解它们各自的优劣。 我们比较的是以下三个DI框架: Roboguice Dagger1 Dagger2 Roboguice和Dagger的工作原理有所差异,Roboguice在运行时利用反射进行依赖注入,而Dagger则利用编译...

阅读文章
在Android中使用反射到底有多慢?

(到目前为止,我们分析了大量的APP并发现了一些严重拖慢很多APP速度的问题。从这篇文章开始,我们将逐个对这些问题进行详细的分析。) 反射(Reflection)在Java和安卓开发过程中非常有用,但是反射的使用往往是APP严重性能问题的根本原因。下面我们通过分析几个真实的案例来帮助我们更直观的理解这个问题。 两个真实的案例 第一个案例是纽约时报安卓客户端。在NimbleDroid的帮助下,纽约时报的开发者发现Gson中的type adapter使用了反射,增加了APP700毫秒的启动时间,他们...

阅读文章
Google Play榜单APP冷启动速度分析报告

此前的一篇文章 中我们强调了APP应该快速启动,但现在应用市场上的APP启动速度如何?我们在这篇文章中测量了 Google Play商店中排名前100名APP的启动速度,并和大家分享我们的分析结果。 背景:三种APP启动模式 通常APP启动会有三种模式:首次启动,冷启动,和热启动。 首次启动是指用户在安装APP之后的第一次启动。首次启动的速度是最慢的,因为操作系统需要进行许多初始化操作,例如创建SQLite数据库,将多个dex文件编译为本地代码等。尽管首次启动越快越好,但由于它只...

阅读文章
2016年2月NimbleDroid产品更新

过去几周里,我们一直都在努力改进NimbleDroid,让NimbleDroid成为帮助开发者提升APP性能时更强大的工具。在本文中我们将展示这次更新中最大的改进,然后展望一下今后的开发规划。 更多的深入分析 NimbleDroid一直都在提供关于APP速度以及响应时间的分析数据,但通过和我们的用户(各位开发者)沟通,我们发现NimbleDroid还能做更多工作,以帮助开发者更深刻的理解他们的APP性能。这些工作在老的低端的设备上对性能的影响尤其重要。 基于这些工作,我们很高兴的宣布,Nimbl...

阅读文章
如何打造操作顺滑的APP

在此前一篇文章中,我们讨论了监控APP性能的重要性,在本文中,我们将展示如何具体做到这一点。我们和数个来自世界顶尖APP的开发者团队进行了交流,包括微信和Yahoo News Digest,讨论打造顺滑APP的最佳实践。根据我们的经验以及交流的结果,我们发现打造优秀APP的过程中,最重要的一点就是建立一套性能优化的规范流程: 性能优化过程 持续测量APP的性能非常重要,这样才能第一时间检测出APP性能的下降。一旦检测到性能问题,第一步应该是分析出性能问题的根本原因。在分析过程中,你可能会需要...

阅读文章
开发者为什么应该关注安卓APP的性能

随着安卓平台在世界范围内移动APP市场上的风靡,开发者们每天都会发布大量新的安卓APP。 2011年初, 每天已经有500多个新的安卓APP发布, 截至2015年4月,市场上发布的安卓APP总量已经超过了140万个, 而且Google Play商店的APP下载量达到了1250亿次。 毫无疑问,安卓APP的市场仍将继续增长。 然而,大部分APP都存在严重的卡顿和延迟,导致用户体验急剧下降。 CompuWare的一项研究调查 显示,56%的用户都在过去的6个月内遇见过手机APP的问题,将近47%的用户表...

阅读文章