【问题标题】:does dexed file persistent in the system ? Does it exist after rebooting the device ? if yes where stored?dexed 文件是否在系统中持久存在?重启设备后是否存在?如果是,存储在哪里?
【发布时间】:2014-06-20 08:32:29
【问题描述】:

问题:

Dex 优化会在我们每次重启设备时进行吗?还是将dex文件存入系统本身,二次使用?

目录:系统/框架

文件:core.jar、core-junit.jar、framework.jar 等...

源码分析:

看起来,系统检查缓存中是否已经存在dex文件,如果存在则忽略,如果不存在则创建dex文件。

http://androidxref.com/4.1.2/xref/dalvik/vm/RawDexFile.cpp

  optFd = dvmOpenCachedDexFile(fileName, cachedName, modTime,
        adler32, isBootstrap, &newFile, /*createIfMissing=*/true);


   This 'newFile'  flag tells if dex file exists in the cache,

下面是对文件实际调用 dex 优化的代码。

if (newFile) {
   ......

  result = dvmOptimizeDexFile(optFd, dexOffset, fileSize,
            fileName, modTime, adler32, isBootstrap);

Logcat 输出:

03-29 12:16:59.617 D/dalvikvm( 1071): DexOpt: --- END 'core.jar' (success) ---

03-29 12:16:59.617 D/dalvikvm( 1071): DEX prep '/system/framework/core.jar': unzip in 239ms, rewrite 3943ms

03-29 12:16:59.617 D/dalvikvm( 1071): DexOpt: --- BEGIN 'core-junit.jar' (bootstrap=1) ---

03-29 12:16:59.664 D/dalvikvm( 1372): DexOpt: load 4ms, verify+opt 10ms, 137044 bytes

03-29 12:17:00.250 D/dalvikvm( 1071): DexOpt: --- END 'core-junit.jar' (success) ---

03-29 12:17:00.250 D/dalvikvm( 1071): DEX prep '/system/framework/core-junit.jar': unzip in 
0ms, rewrite 627ms

03-29 12:17:00.304 D/dalvikvm( 1071): DexOpt: --- BEGIN 'bouncycastle.jar' (bootstrap=1) ---

03-29 12:17:00.882 D/dalvikvm( 1373): DexOpt: load 25ms, verify+opt 463ms, 598508 bytes

03-29 12:17:01.507 D/dalvikvm( 1071): DexOpt: --- END 'bouncycastle.jar' (success) ---

03-29 12:17:01.507 D/dalvikvm( 1071): DEX prep '/system/framework/bouncycastle.jar': unzip 
in 49ms, rewrite 1204ms

03-29 12:17:01.632 D/dalvikvm( 1071): DexOpt: --- BEGIN 'ext.jar' (bootstrap=1) ---

【问题讨论】:

    标签: android dalvik dex android-framework


    【解决方案1】:

    dexopt的输出存储在/data/dalvik-cache中。

    在生产设备上,系统分区上的应用和引导类在 .dex 文件旁边存储有“.odex”文件。如果内置应用程序更新,APK 将存储在数据分区中,而 odex 将照常进入 dalvik-cache。

    dexopt 通常由包管理器运行。应用进程无权在/data/dalvik-cache 中创建文件,因此包管理器必须在应用启动前创建文件并运行 dexopt。唯一的例外是引导类,其中 dexopt 由 zygote 运行,并且仅在开发版本中发生。

    dexopt documentation 有点过时,但基本准确。

    【讨论】:

    • 感谢您的回复。如果我正确理解您的观点,1) .odex 是持久的。除非安装了新的应用程序,否则每次都不需要创建。 [可能是第一次生成 .odex 并将其保存在 dalvik-cache 中? 2) 对于工程构建,zygote 负责引导类的 dexopt。 3) 每次启动设备时都会将类预加载到 VM 中。请帮助理解它。
    • 还有其他细节,例如在更改引导类的系统更新后,必须重新生成所有 app .odex,但我认为您的想法是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多