Android 应用初始启动时间慢
Android app slow initial startup time
在我开始使用 android 支持设计库中的 UI 元素后,应用程序的初始加载时间变得非常慢(大约 8 秒!),我真的不确定为什么。
我运行在大部分启动过程中跟踪方法(android studio 启动运行 cpu 监视器需要时间),发现它花费了 4 秒在:
dalvik.system.DexFile.openDexFile
,我不确定为什么要花这么长时间。
有什么想法吗? (我没有添加任何代码,因为我的应用程序中有很多代码,我不知道问题出在哪里...)
顾名思义,openDexFile是android从dex文件加载方法的过程,越大越多的文件加载时间越长。
所以我对你的问题的回答只是减少你拥有的方法的数量并且更喜欢延迟加载库而不是在应用程序中初始化它们
因此,与其在 App.onCreate 中初始化您的网络库,不如在第一次请求时初始化它,直到需要时才创建您的数据库。
也可以在您的应用程序中使用 android:windowBackground 来显示用户预加载器而不是白屏 :)
如何更好地查看方法计数:
在插件安装 android studio 中 "Android Methods Count",这是一个非常简单的插件,我认为它的名字暗示了它的作用:)
现在鉴于您对项目的了解减少,您现在正在使用的库数量,您可能想要使用 gradle->root->Tasks->android->AndroidDependencies查看您的项目中添加了哪些其他库。
还要记住不要使用核心播放服务,只使用您实际使用的库。
当我使用发布应用程序而不是我通常使用的调试版本时,ui我的速度有所提高 运行。
我不确定它为什么起作用,但我想这一定是因为编译器将 ext 库链接到 apk 的方式。我曾经看过对 Chet Haase 的采访,他是 android ui 平台的开发者之一,他解释了他们如何尝试在应用程序上将第一个 activity 显示为 quickly 尽可能避免沉闷的闪屏。也许在发布 build 过程中以某种方式启用了该功能。
编辑:
正确答案由@Embydextrous 写在下面。这是由于在调试模式下应用程序的 dexing 造成的。
这通常发生在调试版本中,但也可能发生在发布版本中。
如果有多个 dex 文件。首先加载主 dex 文件 (classes.dex),然后加载其他 dex 文件。
它通常不会在发布版本中显示,因为混淆器会删除未使用的方法并减少方法数,因此只生成一个 .dex。在调试构建中,proguard 没有被使用,所以有多个 dex 文件。
然而,在 AirBnb、Facebook、twitter 等非常大的应用程序中,有多个 dex 文件。因此可以使用 dex 优化器优化应用程序启动延迟。
您可以查看您在应用程序文件中初始化了什么
在我开始使用 android 支持设计库中的 UI 元素后,应用程序的初始加载时间变得非常慢(大约 8 秒!),我真的不确定为什么。
我运行在大部分启动过程中跟踪方法(android studio 启动运行 cpu 监视器需要时间),发现它花费了 4 秒在:
dalvik.system.DexFile.openDexFile
,我不确定为什么要花这么长时间。
有什么想法吗? (我没有添加任何代码,因为我的应用程序中有很多代码,我不知道问题出在哪里...)
顾名思义,openDexFile是android从dex文件加载方法的过程,越大越多的文件加载时间越长。
所以我对你的问题的回答只是减少你拥有的方法的数量并且更喜欢延迟加载库而不是在应用程序中初始化它们
因此,与其在 App.onCreate 中初始化您的网络库,不如在第一次请求时初始化它,直到需要时才创建您的数据库。
也可以在您的应用程序中使用 android:windowBackground 来显示用户预加载器而不是白屏 :)
如何更好地查看方法计数:
在插件安装 android studio 中 "Android Methods Count",这是一个非常简单的插件,我认为它的名字暗示了它的作用:)
现在鉴于您对项目的了解减少,您现在正在使用的库数量,您可能想要使用 gradle->root->Tasks->android->AndroidDependencies查看您的项目中添加了哪些其他库。
还要记住不要使用核心播放服务,只使用您实际使用的库。
当我使用发布应用程序而不是我通常使用的调试版本时,ui我的速度有所提高 运行。
我不确定它为什么起作用,但我想这一定是因为编译器将 ext 库链接到 apk 的方式。我曾经看过对 Chet Haase 的采访,他是 android ui 平台的开发者之一,他解释了他们如何尝试在应用程序上将第一个 activity 显示为 quickly 尽可能避免沉闷的闪屏。也许在发布 build 过程中以某种方式启用了该功能。
编辑: 正确答案由@Embydextrous 写在下面。这是由于在调试模式下应用程序的 dexing 造成的。
这通常发生在调试版本中,但也可能发生在发布版本中。
如果有多个 dex 文件。首先加载主 dex 文件 (classes.dex),然后加载其他 dex 文件。
它通常不会在发布版本中显示,因为混淆器会删除未使用的方法并减少方法数,因此只生成一个 .dex。在调试构建中,proguard 没有被使用,所以有多个 dex 文件。
然而,在 AirBnb、Facebook、twitter 等非常大的应用程序中,有多个 dex 文件。因此可以使用 dex 优化器优化应用程序启动延迟。
您可以查看您在应用程序文件中初始化了什么