在我开始使用Android支持设计库中的UI元素后,应用程序初始加载时间变得非常慢(大约8秒!),我真的不确定原因。
我在大多数启动过程中运行了方法跟踪(android studio开始运行cpu监视器需要时间)并发现它花了4秒钟:
dalvik.system.DexFile.openDexFile
,我不知道为什么这么长时间。
有什么想法吗? (我没有添加任何代码,因为我的应用程序中有很多代码,我不知道问题来自哪里......)
答案 0 :(得分:7)
在构建发布应用程序而不是我正常运行的调试版本时,我的速度有所提高。
我不确定它为什么会起作用,但我想这必须是因为编译器将ext库链接到apk中的方式。我曾经看过Chet Haase的采访,他是android ui平台上的开发者之一,他解释了他们是如何尽快在应用程序上展示第一个活动以避免沉闷的闪屏。也许在发布构建过程中以某种方式启用了该功能。
编辑: 正确的答案由@Embydextrous写在下面。它是由调试模式下的应用程序dexing引起的。
答案 1 :(得分:5)
这通常发生在调试版本中,但也可能在发布版本中发生。
如果有多个dex文件。首先加载主要dex文件(classes.dex),然后加载其他dex文件。
它通常不会在发布版本中显示,因为proguard会删除未使用的方法并减少方法计数,因此只生成一个.dex。在调试版本中,不使用proguard,因此有多个dex文件。
然而,在像AirBnb,Facebook,Twitter等非常大的应用程序中,有多个dex文件。因此可以使用dex优化器优化应用程序启动延迟。
答案 2 :(得分:0)
顾名思义,openDexFile是从dex文件加载方法的android进程,负载较长的文件越大,文件就越多。
所以我对你的问题的答案就是减少你拥有的方法数量,而不是延迟加载库而不是在Application中初始化它们
因此,不要在App.onCreate中初始化您的net lib,而是在第一次请求时初始化它,不要在需要之前创建db。
还可以在你的app thame中使用android:windowBackground来显示用户preloader而不是whitescreen:)
如何更好地查看方法计数:
在android工作室下插件安装" Android方法计数",这是非常简单的插件,我确实认为它的名字暗示它的作用:)
现在,鉴于您对项目的了解减少,您现在使用的库数量,您可能需要使用gradle-> root-> Tasks-> android-> AndroidDependencies查看其他库是什么添加到您的项目中。
另外请记住,不要使用核心播放服务,也不要使用实际使用的库。
答案 3 :(得分:0)
您可以检查在应用程序文件中初始化的内容