我的Android項目有幾個配置。以前,我通過手動切換並從Eclipse構建apk,但最近我開發了一些ant任務,以使我的生活變得更加輕鬆:我啓動cmd文件,並構建所有配置(每次更改配置變量,移動資源,修改清單,等等。)。用Ant生成VerifyError,從Eclipse生成時確定OK
但是今天我發現用android工作流(我的build.xml包含$ {sdk.dir} /tools/ant/build.xml)編譯的ant(它使用javac)代碼與生成的代碼不同通過Eclipse中的ADT工具。差異是致命的。
在編譯階段,javac聲稱某些文件包含BOM,並且一個類太大(對於很多靜態數組)。我已經將所有文件轉換爲utf8 w/o bom,將大類拆分爲兩個,並且javac沒有更多的問題。很容易。
但是如果我推出螞蟻造APK 4.0.x的設備或仿真器上(而作品上1.6,2.2,4.1,4.2),它力運行時將關閉,並說:
03-01 09:15:16.247: W/dalvikvm(1993): VFY: register1 v3 type 17, wanted 18
03-01 09:15:16.247: W/dalvikvm(1993): VFY: rejecting opcode 0xc8 at 0x0023
03-01 09:15:16.247: W/dalvikvm(1993): VFY: rejected Lcom/myproj/MySomeClass;.doThing (I)V
03-01 09:15:16.247: W/dalvikvm(1993): Verifier rejected class Lcom/myproj/MySomeClass;
03-01 09:15:16.247: W/System.err(1993): java.lang.VerifyError: com/myproj/MySomeClass
...
<stack here>
...
但Eclipse的ADT -made apk在4.0.x上運行得非常好!此外 - 我從來沒有看到關於編譯的utf bom或class size的聲明。
所以我認爲我們應該在ant build中使用比javac更遠的東西。但Google在其build.xml中正好使用了javac。 如何在使用ant構建時使用ADT編譯器而不是javac?
當然,我仍然可以在eclipse中構建,但是當我花費20分鐘時,ant腳本花費1分鐘,並且它在改變cfg vars(它們之間存在一些相關性)時從未犯下愚蠢的錯誤。
在此先感謝!
更新: 我懷疑它以某種方式與我使用的java版本連接。 Ant使用1.7 x86 jdk執行,而eclipse使用jdk1.6.0_26 x64。有人說Dalvik dex不懂一些java 1.7的字節碼,但我應該檢查一下。
UPDT1:不,我已經刪除了所有jdks,然後安裝了jdk 1.6.0_41 x86和x64,設置了eclipse 1.6.0_41 x64並將JAVA_PATH設置爲jdk 1.6.0_41 x86。同樣的事情 - apk在Eclipse中編譯(Android工具 - >導出簽名apk)的作品,螞蟻編譯apk說VerifyError。
什麼是你默認的stackTrace? – 2013-03-01 18:46:29
它是調用堆棧,它並不重要:主要的是它在第一次嘗試訪問類MySomeClass時在運行時崩潰。所以我試圖弄清楚的主要問題是 - 在ant build中啓動javac和adt執行此操作之間有什麼區別? – Tertium 2013-03-01 18:52:48