2013-10-07 56 views
22

我看到Android的ant腳本有消息說它是「pre-dexing」。不過,dex和pre-dex使用相同的選項,但一次只能放入一個jar,而另一種情況下一次只能放置多個jar。什麼是Android Pre-Dexing以及如何提高性能?

真正的需求是什麼? pre-dex是強制性的嗎?

e.g

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' 
+1

這個預定義過程是爲您可能包含在項目中的外部庫完成的。第二個dexing過程適用於您的應用程序(.class to .dex [DEX更適用於受限於內存和速度的系統])。每次構建應用程序時都需要Pre-Dexing,因爲:1)應用程序中的某些代碼(從外部庫中獲取)可能無法正常運行。 2)庫(您可能已從外部網站下載)可能已使用舊的java編譯器編譯(SDK Tools會爲此發出警告)。 – 10101010

回答

19

在這種情況下,你是在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。