什么是Android预编译,它如何提高性能?

25

我看到 Android 的 Ant 脚本中有一个消息,它是“pre-dexing”。然而 dex 和 pre-dex 使用相同的选项,除了在一个情况下一次处理一个 jar 文件,在另一个情况下同时处理多个 jar 文件。

真正的需要是什么?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'

2
这个预编译过程是针对您可能在项目中包含的外部库完成的。第二个 dexing 过程是针对您的应用程序(.class 到 .dex [DEX 更适合内存和速度受限的系统])。每次构建应用程序时都需要进行预编译,因为:1)应用程序中的某些代码(来自外部库)可能无法正常运行。2)该库(您可能已从外部网站下载)可能已使用旧的 Java 编译器进行编译(SDK 工具会发出警告)。 - 10101010
1个回答

22

在这种情况下,需要记住你是在使用Java,而不是Dalvik运行时。Oracle的Java使用完全不同的虚拟机,而Dalvik则专门为移动设备进行了微调。

DEX进程将Java编译的JAR文件转换为Dalvik可执行文件(.dex),以便在Android上运行。 Oracle JVM使用不同的字节码,因此这一步是必需的。

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

这个过程分两步完成,因为最终的应用程序需要访问已经经过dex处理的库文件,以避免在处理过程中引用的代码改变。

您可以在http://source.android.com/devices/tech/dalvik/index.html了解更多信息,在那里您还将看到Dalvik计划用名为ART的东西进行替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接