我目前正在开发一个适用于iOS和Android的Adobe AIR项目
我们通过Jenkins运行ANT构建脚本来自动构建这个东西。它根据不同的编译(发布版本和测试版本)打包不同版本的应用程序,并且测试版本中打包了更多不同的配置。
到目前为止,一切都很好。该构建在我的本地机器上运行ANT 1.8.4和AIR 3.6 SDK。
问题是,有时,或最近大多数时候,在Jenkins机器(Mac Mini)上,构建失败,并显示错误消息,如下所示:
package-android-versions:
[delete] Deleting directory /private/var/jenkins/workspace/**********/dist/android/release
[mkdir] Created dir: /private/var/jenkins/workspace/*************/dist/android/release
[echo] packaging for android...
[echo] done
[delete] Deleting directory /private/var/jenkins/workspace/************/dist/android/test/dummy
[mkdir] Created dir: /private/var/jenkins/workspace/**************/dist/android/test/dummy
[echo] packaging for android...
[java] SDK component at air/android/device/Runtime.apk is out of date
正如你可能注意到的,第一个包命令成功了,所以我的SDK组件不可能真的过时了。那么第一个包命令也会失败。
以下是相关的ANT构建命令:
<echo>packaging for android...</echo>
<java jar="${AIR_SDK_HOME}/lib/adt.jar" fork="true" failonerror="true">
<jvmarg line="-Xmx1024m" />
<jvmarg line="-XX:MaxPermSize=2048m" />
<arg line="-package"/>
<arg line="-target apk-captive-runtime"/>
<arg line="-storetype pkcs12 -keystore '${dir.portal}/self-signed.p12' -storepass ******"/>
<arg line="'@{destination}/${app.name}@{label}' '@{source}/${app.descriptor}'" />
<arg line="-C '@{source}' ."/>
<arg line="-C '${dir.assets.runtime.android}' ."/>
</java>
<echo>done</echo>
我曾尝试增加java命令的可用内存量(因为根据我的经验,这通常是导致失败的原因),但这不是解决方案。
此外,我已经研究了这个类似问题的答案,但我们的构建机器在编译和打包之间不会有任何问题,所以这不可能是真正的答案;)
还有其他想法吗?
我做了一些调查:adt.jar正在启动一个单独的进程,使用lib/Android/bin/aapt从Runtime.apk获取Android版本信息。看起来调用这个单独的进程和/或读取其输出可能是罪魁祸首。
如果没有以可编译的版本获得adt.jar的源代码并添加额外的调试信息,我无法确定这是问题所在,但它看起来很像。错误的触发器可能是机器上影响线程或文件读取的任何东西,这基本上是任何系统活动。
AIR SDK 3.8中的adt.jar在启动外部进程的区域中包含了一个小的更改,以确保aapt命令的输出被完全读取。
升级到3.8可能会解决这个问题,如果不修改adt.jar,3.6版本就无法修复。
PS:哈,弗兰克!:-)