Android应用初始启动时间过慢

8

自从我开始使用来自安卓支持设计库的UI元素后,应用程序的初始加载时间变得非常缓慢(大约8秒!),我真的不知道为什么。

在大部分启动过程中我运行了方法跟踪(android studio 需要一段时间来启动 CPU 监视器),发现它在 dalvik.system.DexFile.openDexFile 上花费了4秒钟,我不确定为什么需要这么长时间。

有任何想法吗?(我没有添加任何代码,因为我的应用程序有很多代码,我不知道问题出在哪里...)


我在构建发布版应用程序时,发现速度有所提升,而不是我通常运行的调试版本。也许你可以测试一下。 - miqueloi
@miqueloi 哦,有趣,它起作用了,你知道为什么吗? - TomerZ
我不确定,但我猜测这可能是由于编译器将外部库链接到apk的方式。我曾经看过一次采访,采访对象是安卓UI平台的开发人员之一Chet Haase,他解释说他们正在尝试尽快显示应用程序的第一个活动,以避免枯燥的启动画面。也许这个功能在发布构建过程中被启用了。 - miqueloi
有趣,請寫一個答案,這樣我就可以接受。 - TomerZ
3个回答

11

我在构建发布版应用程序时,与我通常运行的调试版本相比,经历了速度上的提升。

我不确定为什么会这样,但我猜测这可能是由于编译器将外部库链接到apk的方式所致。我曾经看过一次采访,采访对象是 Android UI 平台的开发人员之一 Chet Haase,他解释说,他们正在尝试尽快显示应用程序的第一个活动,以避免无聊的启动画面。也许该功能在发布版构建过程中以某种方式被启用。

编辑: 正确答案已由@Embydextrous写在下面。原因是在调试模式下对应用程序进行dexing。


2
发布版本使用Proguard并移除不需要的方法,因此只生成单个.dex文件。尝试提取您的发布版本和调试版本。您可能会在调试版本中看到多个classes* .dex文件,而在发布版本中只有一个。 我还回答了这个问题。 - Embydextrous
谢谢,@Embydextrous,解释得很好。 - acmpo6ou
好的。好的。我现在知道了。我使用了一个非常庞大的库。这可能是性能缓慢的原因。 - Naimul Kabir

7

通常情况下,这种情况发生在调试版本中,但也可能发生在发布版本中。

如果存在多个dex文件,则会先加载主要的dex文件(classes.dex),然后再加载其他dex文件。

由于Proguard可以删除未使用的方法并减少方法数量,因此在发布版本中通常不会显示出现多个dex文件。但是,在调试版本中没有使用Proguard,因此存在多个dex文件。

但是,在像AirBnb、Facebook、Twitter等非常大的应用程序中,存在多个dex文件。因此可能导致应用程序启动延迟,但可以使用dex优化器进行优化。


2
如名称所示,openDexFile是一个Android进程,它从dex文件中加载方法,文件越大且越多,加载时间就越长。
对于你的问题,我的回答是尽量减少方法数量,并优先使用惰性加载库而不是在应用程序中初始化它们。
因此,不要在App.onCreate中初始化您的网络库,而是在第一次请求时进行初始化,直到需要时再创建数据库。
此外,使用android:windowBackground在您的应用程序主题中显示用户预加载器,而不是白屏 :)
如何更好地查看方法计数:
在Android Studio的插件下安装“Android Methods Count”,这是一个非常简单的插件,我认为它的名称说明了它的作用 :)
现在,根据您对项目的了解,减少您正在使用的库的数量,您可能希望使用gradle->root->Tasks->android->AndroidDependencies来查看添加到您的项目中的其他库。
还要记住,不要使用核心play-services,只使用您实际使用的库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接