我的 Android 的 java 项目有几个配置。以前我切换它们并手动从 Eclipse 构建 apk,但最近我开发了几个 ant 任务以使我的生活更轻松:我启动 cmd 文件并构建所有配置(每次更改配置变量,移动资源,修改清单, ETC。)。
但是今天我发现ant(它使用javac)用android工作流(我的build.xml包括${sdk.dir}/tools/ant/build.xml)编译的代码与Eclipse中ADT工具生成的代码不同. 差异是致命的。
在编译阶段 javac 声称某些文件包含 BOM,并且一个类太大(对于许多静态数组)。我已经将所有文件转换为 utf8 w/o bom,将大类分成两个,javac 没有更多问题。很容易。
但是,如果我在 4.0.x 设备或模拟器上启动 ant-made apk(在 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 或类大小的 adt 声明。
所以我认为我们应该在 ant build 中使用其他东西而不是 javac。但是谷歌在它的 build.xml 中完全使用了 javac。使用 ant 构建时,我们如何使用 ADT 编译器而不是 javac?
当然,我仍然可以在 eclipse 中构建,但是 ant 脚本在我花费 20 分钟时花费 1 分钟,并且在更改 cfg vars 时它永远不会犯愚蠢的错误(它们之间存在一些依赖关系)。
提前致谢!
UPDT:我怀疑它与我使用的 java 版本有某种联系。Ant 使用 1.7 x86 jdk 执行,而 eclipse 使用 jdk1.6.0_26 x64。有人说 Dalvik dex 不理解一些 java 1.7 字节码,但我应该检查一下。
UPDT1:不,我已经删除了所有 jdk,然后安装了 jdk 1.6.0_41 x86 和 x64,设置 eclipse 使用 1.6.0_41 x64 并将 JAVA_PATH 设置为 jdk 1.6.0_41 x86。同样的事情-在eclipse中编译的apk(Android工具->导出签名的apk)可以工作,ant-compiled apk说VerifyError。