什么是 Android Pre-Dexing 以及它如何提高性能?

Posted

技术标签:

【中文标题】什么是 Android Pre-Dexing 以及它如何提高性能?【英文标题】:What is Android Pre-Dexing and how to does it increase performance? 【发布时间】:2013-10-14 04:33:44 【问题描述】:

我看到 android 的 ant 脚本有消息说它是“pre-dexing”。然而 dex 和 pre-dex 使用相同的选项,除了在一种情况下一次一个罐子,在另一种情况下一次多个罐子。

真正的需要是什么? pre-dex 是强制性的吗?

例如

The ' characters around the executable and arguments are
not part of the command.
      [dex] Pre-Dexing F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\libs\pinit-sdk-1.0.jar -> pinit-sdk-1.0-e3bebafa2727504605edf3d8d85b5d46.jar
       [dx] Current OS is Windows 7
       [dx] Executing 'D:\Apps\java\embd\cmn\android\oems\google\adt\4.x\4.3.x\4.3\sdk\build-tools\18.1.0\dx.bat' with arguments:
       [dx] '--dex'
       [dx] '--output'
       [dx] 'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\bin\dexedLibs\pinit-sdk-1.0-e3bebafa2727504605edf3d8d85b5d46.jar'
       [dx] 'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\libs\pinit-sdk-1.0.jar'
       [dx] 
       [dx] The ' characters around the executable and arguments are
       [dx] not part of the command.
Execute:Java13CommandLauncher: Executing 'D:\Apps\java\embd\cmn\android\oems\google\adt\4.x\4.3.x\4.3\sdk\build-tools\18.1.0\dx.bat' with arguments:
'--dex'
'--output'
'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\bin\dexedLibs\pinit-sdk-1.0-e3bebafa2727504605edf3d8d85b5d46.jar'
'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\libs\pinit-sdk-1.0.jar'

The ' characters around the executable and arguments are
not part of the command.
      [dex] Converting compiled files and external libraries into F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\bin\classes.dex...
       [dx] Current OS is Windows 7
       [dx] Executing 'D:\Apps\java\embd\cmn\android\oems\google\adt\4.x\4.3.x\4.3\sdk\build-tools\18.1.0\dx.bat' with arguments:
       [dx] '--dex'
       [dx] '--output'
       [dx] 'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\bin\classes.dex'
       [dx] 'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\bin\classes'
       [dx] 'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\bin\dexedLibs\classes-144740ee5cf8b90b747300d19fb8201e.jar'
       [dx] 'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\bin\dexedLibs\classes-1593da1bb60c5ec741aca494963e04a3.jar'
       [dx] 'F:\users\tejasoft\work\fnd\cmn\tools\social\sz\demo\bin\dexedLibs\classes-37bb5269e4fbd6dda9900fea95c0c29b.jar'

【问题讨论】:

此预索引过程是针对您可能已包含在项目中的外部库完成的。第二个 dexing 过程适用于您的应用程序(.class 到 .dex [DEX 更适合内存和速度受限的系统])。每次构建应用程序时都需要预先进行 Dexing,因为:1) 应用程序中的某些代码(取自外部库)可能无法正常运行。 2) 库(您可能从外部站点下载)可能是使用旧的 java 编译器编译的(SDK 工具会为此发出警告)。 【参考方案1】:

在这种情况下,记住您使用的是 Java 是很有用的,这与 Dalvik 运行时并不完全相同。来自 Oracle 的 Java 使用完全不同的虚拟机,而 Dalvik 专门针对移动设备进行了微调。

DEX 进程获取您的 Java 编译 JAR 文件并将它们转换为将在 Android 上运行的 Dalvik 可执行文件 (.dex) 文件。 Oracle JVM 使用与 Dalvik 运行时不同的字节码,因此这一步是必要的。

对于您可能已包含在项目中的库,有一个流程,因为它们也是使用标准 Java 编译器编译的,然后是您的实际项目的另一个流程。

分两步完成,因为最后一个过程,即您的应用程序,需要访问已索引的库文件,以避免在过程繁忙时引用代码更改。

您可以在http://source.android.com/devices/tech/dalvik/index.html 上找到更多信息 - 您还可以在其中看到 Dalvik 计划替换为一种称为 ART 的东西。

【讨论】:

以上是关于什么是 Android Pre-Dexing 以及它如何提高性能?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Android 上下文以及为什么需要它 [重复]

什么是 firebase 以及如何在 Android 中使用它? [关闭]

什么是android系统,android的发展以及android的平台架构和特性

什么是 Android Debug 符号以及如何在 Flutter 应用程序中配置它

Android SDK对应API级别以及版本说明

Android高级开发面试题以及笞案整理