为什么需要擦拭Dalvik缓存?


46

当我更新自定义ROM时,总会有擦除Dalvik缓存的指令。我看不出为什么有这个必要。

在系统启动时观看logcat,我可以清楚地看到,如果某个应用程序更改了,则其dex文件将无效,然后重新生成。但是,当我在任何地方提及此事时,我都会保持沉默。似乎甚至没有一些ROM开发人员意识到这一点,他们之所以这样做,是因为其他所有人都知道。

所以问题是:

  • 是否有一个Android版本,其中Dalvik文件在启动期间没有失效?
  • 您自己进行此操作是否有任何优势,而不是让系统执行应做的工作?

理想的答案应该包括对相关代码的引用,因此下次出现此问题时,我将提供引用。

Answers:


43

要回答您的问题:

  • 不知道Dalvik在启动时不会失效的任何Android版本。也许我最初不知道最初的1.0版本经历了Eclair,Froyo,Gingerbread,Ice Cream Sandwich。您需要查看源代码树并将其重新设置为CupCake或Donut(分别为1.5和1.6)

  • 详细原因:)

必须使用Wipe Cache的原因是因为所有apk(包括系统apk)都附加有dex文件,因此,当第一次启动ROM时,Android的Dalvik会遍历每个apk,然后解压缩并将其中的dex文件放入缓存中,/data/dalvik-cache从而加快了应用本身的执行速度。

大多数ROM具有经过odex处理的apk,高速缓存作为外部文件捆绑在apk本身中。

许多自定义ROM修改器都会使用这些apks deodex'd,这意味着dex文件已被替换并重新打包,以使其更易于主题化/修改apk。

当您刷新自定义ROM且未清除缓存时,较新的自定义ROM的apk将附加一个不同的dex文件,当Dalvik遍历它们时,它将看到目录中找到的现有缓存dex文件,并且跳过它,然后在运行应用程序时,可以确保强制关闭或ANR(应用程序无响应)。

如果使用ClockWorkMod Recovery并选择了Wipe Data,则您本身并不会丢失数据,那么是的,所有与应用程序相关的设置都会被干净擦除-查找/data/app

因此,您可以擦除Wipe Cache而不擦除Wipe Data,有效完成的操作被放置在较新的apk中,并保留了设置。对于CyanogenMod夜间情况,这是很常见的情况,其中会刷新不稳定/正在测试的ROM版本,并通过缓存擦除保留设置。续航里程取决于从市场上下载的应用程序(设置可能会因版本变化而改变)。

为了获得最佳结果,明智的做法是同时执行“ 擦除数据”和“ 擦除缓存”以确保完整性,并且在应用程序本身内没有程序错误。

是的,这意味着启动时间会更慢,但它的初始启动时间为短暂。之后,它会更快启动。简而言之,通过CWM明确擦除缓存本身实际上有助于提高缓存速度,并确保不会混入先前版本的残留物(现在,在此阶段,我意识到您的问题,因此,公平地说,实际上并没有看到Android在刷新新ROM时在启动时未执行缓存本身的无效化。)

认真使用源卢克!:D

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java是每个apk运行时的启动代码。它与dalvik目录树中的本机C代码进行交互,该目录树包含特定的芯片集指令,以解释apk到本机CPU指令集内的字节码。ARMv6几乎是ARMv5的黑客版本(这是Eclair之前的较早Android版本中的原始芯片组),因此您不会在Google的AOSP源代码中看到ARMv6。CyanogenMod将在其源代码中包含该ARMv6。


为了便于讨论,我们假设我们正在谈论的是CM7官方发行版。首先我要说的是,我从未,从未擦除过达尔维克缓存,也从未遇到过可以解决的问题。因为它不是非odex,所以无法存在多个(o)dex文件,因此在启动时,旧文件将被新生成的文件替换。哦,如果这真的很重要,为什么开发人员不将其添加到更新程序脚本中呢?我会检查出源,谢谢。
RR 2012年

1
您实际上可以明确地将其放入updater-script中,但是这会在闪烁时惹恼其他人,因为“哦,糟糕,我丢失了我的设置/数据”,CM可能不想被火焰问题/答案烧死,如“为什么在刷新新版本的CM时擦除缓存?” -也许是由于CM的责任,所以才让最终用户选择该选项?然后将其放回去,以便如果它们闪动而没有擦拭,并在论坛上抱怨“嘿,我的应用程序崩溃了”,CM可以转身说:“擦拭了吗?”
t0mm13b 2012年

我不是那个意思data/data,但data\dalvik-cache。可能只是系统的。
RR 2012年

1
库存的AOSP ROM已被odex删除,CM已修改了构建系统以使用deodex。...只是说;)
t0mm13b 2012年

2
感谢您提供详细的答案t0mm13b。可以这样说,我很清楚...对发布的问题的简单答案似乎是“您不知道。默认情况下在启动时将其擦除”。正确?
GollyJer 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.