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

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

所以问题是:


Android版本的Dalvik文件在启动过程中不会无效?
您自己进行此操作是否有优势,而不是让系统执行应做的工作?

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

#1 楼

要回答您的问题:


我不知道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本身的。 'd,表示替换并重新打包了dex文件,以便更轻松地对apk进行主题化/修改。附加了一个不同的dex文件,当Dalvik通过它们时,它会看到目录中找到的现有缓存dex文件,并跳过该文件,然后在运行该应用程序时,可以确保强制关闭或ANR(应用程序无响应)。

您本身并不会丢失数据,如果使用ClockWorkMod Recovery,并且选择了“擦除数据”,那么可以,所有与应用程序有关的设置都会被彻底擦除-在/data/app中查找。

因此,您可以清除缓存,但不能清除数据,有效完成的操作将保留在新的apk中,并保留了设置。对于CyanogenMod夜间系统,这是相当普遍的情况,其中会刷新不稳定/正在测试的ROM版本,并通过缓存擦除保留设置。续航里程将取决于从市场上下载的应用程序(设置很可能会因版本变化而改变)。

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

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

认真使用Luke源! :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文件,因此在启动时,旧文件被新生成的文件替换。哦,如果这真的很重要,开发人员为什么不将其添加到更新程序脚本中呢?我会检查出源,谢谢。

– R R
2012年7月15日15:11



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

– t0mm13b
2012年7月15日15:15



我不是说数据/数据,而是数据\ dalvik-cache。可能只是系统的。

– R R
2012年7月15日在15:18

普通的AOSP ROM已被删除,CM已修改了构建系统以使用deodex ....只是说;)

– t0mm13b
2012年7月15日在15:19

感谢您提供详细的答案t0mm13b。可以这样,我很清楚...看来发布的问题的简单答案是“您不知道。默认情况下在启动时将其擦除”。正确?

– GollyJer
2012年8月24日14:09