【问题标题】:Why are dex files being stored in my app's cache directory?为什么 dex 文件存储在我的应用程序的缓存目录中?
【发布时间】:2017-06-30 13:19:45
【问题描述】:

我最近注意到很多 dex 文件(总计超过 40 MB 的数据)存储在我的应用程序的缓存目录中。我发现这很不寻常,因为 quick search 表明 dex 文件应该存储在 /data/dalvik-cache 目录中,而不是一般的应用程序缓存目录中。

我想知道为什么会这样:

  1. 它在我的应用缓存目录中占用了大量空间。
  2. 我的应用程序有时需要清除缓存目录,当它这样做时,应用程序再次启动所需的时间会急剧增加(10-20 秒)。大概是因为 Android 需要重新创建这些 dex 文件。

提前谢谢你!

更新

我的设备运行的是 Android 6.0.1。这是我的应用程序缓存目录的摘录:

drwx------ u0_a178  u0_a178           2016-08-07 22:56 okhttp
drwx------ u0_a178  u0_a178           2016-08-07 23:08 org.chromium.android_webview
-rw-r--r-- u0_a178  u0_a178   1919104 2016-08-07 22:56 slice-MPAndroidChart-v2.2.4_756cc00da936eb4e219a44a244b55e2df68d07e2-classes.dex
-rw-r--r-- u0_a178  u0_a178     74664 2016-08-07 22:56 slice-com.android.support-animated-vector-drawable-24.1.1_0eb7fa04565008cb6cbb1feab2ae0affa5250da4-classes.dex
-rw-r--r-- u0_a178  u0_a178   2865992 2016-08-07 22:56 slice-com.android.support-appcompat-v7-24.1.1_ade323d4e3df1f7773864c565dd60eea04590c76-classes.dex
-rw-r--r-- u0_a178  u0_a178    129848 2016-08-07 22:56 slice-com.android.support-cardview-v7-24.1.1_5a2590aaa21e69d85533742fbf35c4a80037594f-classes.dex
-rw-r--r-- u0_a178  u0_a178   1266992 2016-08-07 22:56 slice-com.android.support-design-24.1.1_bae3a91de6040c93aed67ba25c118a1eb2cd63d0-classes.dex
-rw-r--r-- u0_a178  u0_a178     67576 2016-08-07 22:56 slice-com.android.support-percent-24.1.1_eef44a28578a5bdac3ec7f4f8fe6db395b9242f5-classes.dex
-rw-r--r-- u0_a178  u0_a178   1642120 2016-08-07 22:56 slice-com.android.support-recyclerview-v7-24.1.1_07c9cf9bb8d7da6bdbc7c7ce0e107b56362aa6e1-classes.dex
-rw-r--r-- u0_a178  u0_a178   5368720 2016-08-07 22:56 slice-com.android.support-support-v4-24.1.1_3f84799af1c5ce5634d5302937609addc3d526de-classes.dex
-rw-r--r-- u0_a178  u0_a178    245256 2016-08-07 22:56 slice-com.android.support-support-vector-drawable-24.1.1_183c04613849d18c534c9c96e5b5186bdf542d11-classes.dex
-rw-r--r-- u0_a178  u0_a178    234976 2016-08-07 22:56 slice-com.crashlytics.sdk.android-answers-1.3.7_7d587ccfdb8d98904ff3416a950d4ca3d718fc04-classes.dex
-rw-r--r-- u0_a178  u0_a178     76296 2016-08-07 22:56 slice-com.crashlytics.sdk.android-beta-1.1.5_2fa53876dc0fc447f8152c075ab46f0d8d92a816-classes.dex
-rw-r--r-- u0_a178  u0_a178     45904 2016-08-07 22:56 slice-com.crashlytics.sdk.android-crashlytics-2.5.6_fb76c5554f0f0d4fc0a08ade7b64b0268ce17199-classes.dex
-rw-r--r-- u0_a178  u0_a178    612144 2016-08-07 22:56 slice-com.crashlytics.sdk.android-crashlytics-core-2.3.9_2dff6f00a6ff1f48d87225bdaeac3553925a96a1-classes.dex
-rw-r--r-- u0_a178  u0_a178   3565568 2016-08-07 22:56 slice-com.google.android.gms-play-services-ads-9.2.1_287b02684d9f21d460a20b44d7850ec566e57278-classes.dex
-rw-r--r-- u0_a178  u0_a178   1664224 2016-08-07 22:56 slice-com.google.android.gms-play-services-ads-lite-9.2.1_ded75934ccfef925c6aa74ca2000dbc6904d5258-classes.dex
-rw-r--r-- u0_a178  u0_a178   1233032 2016-08-07 22:56 slice-com.google.android.gms-play-services-base-9.2.1_359213862239d71bf62ed09377d593890ed8403c-classes.dex
-rw-r--r-- u0_a178  u0_a178   3085656 2016-08-07 22:56 slice-com.google.android.gms-play-services-basement-9.2.1_70ce5ca57eb75287bd07834797967b46576d6fb7-classes.dex
-rw-r--r-- u0_a178  u0_a178    223936 2016-08-07 22:56 slice-com.google.android.gms-play-services-clearcut-9.2.1_6c6330c827462491a41455b4ed9262ce276082a9-classes.dex
-rw-r--r-- u0_a178  u0_a178     50472 2016-08-07 22:56 slice-com.google.android.gms-play-services-gass-9.2.1_1d2be8e71249040cb385274d0b324ea16d3879ec-classes.dex
-rw-r--r-- u0_a178  u0_a178    102832 2016-08-07 22:56 slice-com.google.android.gms-play-services-tasks-9.2.1_922d581385edc6689dc58268229f0677eaa652ec-classes.dex
-rw-r--r-- u0_a178  u0_a178    122848 2016-08-07 22:56 slice-disklrucache-2.0.2_a161adf664669683c31953160e5205319f8b5cd4-classes.dex
-rw-r--r-- u0_a178  u0_a178    904856 2016-08-07 22:56 slice-gson-2.4_a6797fe63a0f01937ca151851d4933eb1f53d03b-classes.dex
-rw-r--r-- u0_a178  u0_a178   1418992 2016-08-07 22:56 slice-internal_impl-24.1.1_1aa620cefcfc678e4b33946a0285c30664a7bc02-classes.dex
-rw-r--r-- u0_a178  u0_a178   1018112 2016-08-07 22:56 slice-io.fabric.sdk.android-fabric-1.3.11_37c4b03d2dd42835d17319c32054c93008baf362-classes.dex
-rw-r--r-- u0_a178  u0_a178   1405656 2016-08-07 22:56 slice-jsoup-1.9.2_5418f1f89f6018c691a8c003aa26c56de67bd7af-classes.dex
-rw-r--r-- u0_a178  u0_a178   1557672 2016-08-07 22:56 slice-okhttp-3.3.0_3ce69bdb19c526170b282b56e8a73f9c77c74b9a-classes.dex
-rw-r--r-- u0_a178  u0_a178    425616 2016-08-07 22:56 slice-okio-1.8.0_81dd90ec651c4bc7aa252b97e6338a5a365dcfb1-classes.dex
-rw-r--r-- u0_a178  u0_a178     99104 2016-08-07 22:56 slice-org.apmem.tools-layouts-1.10_495a455557b5a529e5dfebcdc6a3bc57243903cb-classes.dex
-rw-r--r-- u0_a178  u0_a178    186216 2016-08-07 22:56 slice-slice_0-classes.dex
-rw-r--r-- u0_a178  u0_a178     28200 2016-08-07 22:56 slice-slice_1-classes.dex
-rw-r--r-- u0_a178  u0_a178    541768 2016-08-07 22:56 slice-slice_2-classes.dex
-rw-r--r-- u0_a178  u0_a178      8872 2016-08-07 22:56 slice-slice_3-classes.dex
-rw-r--r-- u0_a178  u0_a178   1954440 2016-08-07 22:56 slice-slice_4-classes.dex
-rw-r--r-- u0_a178  u0_a178   7168784 2016-08-07 23:08 slice-slice_5-classes.dex
-rw-r--r-- u0_a178  u0_a178      8872 2016-08-07 22:56 slice-slice_6-classes.dex
-rw-r--r-- u0_a178  u0_a178   3348288 2016-08-07 22:56 slice-slice_7-classes.dex
-rw-r--r-- u0_a178  u0_a178    601304 2016-08-07 22:56 slice-slice_8-classes.dex
-rw-r--r-- u0_a178  u0_a178     35224 2016-08-07 22:56 slice-slice_9-classes.dex
-rw-r--r-- u0_a178  u0_a178     17064 2016-08-07 22:56 slice-support-annotations-24.1.1_b529bf0c82ba4e707c1b9be345d7c92d60cd7e8d-classes.dex

【问题讨论】:

  • 您使用的是操作系统版本 > 5.0 的手机吗?
  • 是的。我的手机运行的是 6.0.1 版本。
  • 据我所知,ART 在安装应用程序时会进行大量预编译。这会增加应用程序的数据大小。还有一点,dalvik-cache 不能以编程方式删除(因为它存在于根目录中),因此 .dex 不会被删除。您的应用级缓存位于其他位置,每次您清除缓存时都会被删除。
  • @jitinsharma 是的,这是真实的和预期的。但是,此数据不应存储在缓存目录中。另外,其他应用似乎没有这个问题,所以我觉得这很奇怪。
  • 当您的应用第一次启动时,android 会自动缓存“一些东西”,以便下次启动总是很快。这些可以通过清除/data/data/com.my.appName/cachedalvik-cache 处的缓存来删除,这是完全不同的事情。

标签: android caching


【解决方案1】:

因为Instant Run,当你构建release apk时,你不会看到这个cache dir那么大,会很正常,不会包含所有这些dex文件。

【讨论】:

  • 是的,看起来是正确的。过了一会儿我才真正想通了,但我忘了回答我自己的问题。
猜你喜欢
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2023-04-03
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多