我已经尝试在 Google 和 stackoverflow 上搜索这个问题的答案,但我一直无法找到与我遇到的确切问题有关的任何人。我正在尝试设置一个持续集成服务器(特别是 Bamboo),以在每次有人更改源代码控制时更新、构建和导出 APK。当我手动执行每一步时,我在本地机器上和使用我设置的作业时在服务器上都遇到了同样的错误。当我到达构建的 dex 步骤时会发生错误。到目前为止,我用ant debug
, ant release
,ant clean debug
和得到了相同的输出ant clean release
。整个 dex 步骤的输出,完全错误,如下所示:
-dex:
[dex] input: C:\Users\...\Android\bin\classes
[dex] input: C:\Users\...\google-play-services_lib\bin\classes.jar
[dex] input: C:\Program Files (x86)\Android\android-sdk\tools\support\annotations.jar
[dex] input: C:\Users\...\Android\libs\FlurryAgent.jar
[dex] input: C:\Users\...\Android\libs\gcm.jar
[dex] input: C:\Users\...\Android\libs\android-support-v4.jar
[dex] input: C:\Users\...\google-play-services_lib\libs\google-play-services.jar
[dex] Pre-Dexing C:\Users\...\google-play-services_lib\bin\classes.jar -> classes-64c0adfe92ddc950c7ab8c5002ceabf2.jar
[dex] Pre-Dexing C:\Program Files (x86)\Android\android-sdk\tools\support\annotations.jar -> annotations-62bab95d6948a2db17bbc7976160b014.jar
[dex] Pre-Dexing C:\Users\...\Android\libs\FlurryAgent.jar -> FlurryAgent-499d43756a3ce626a64773e6dfd5eaec.jar
[dex] Pre-Dexing C:\Users\...\Android\libs\gcm.jar -> gcm-ae2640f44640eb4fd7b13964b65d2d70.jar
[dex] Pre-Dexing C:\Users\...\Android\libs\android-support-v4.jar -> android-support-v4-fa30b373a3e3ba9f2cf94900a9eb42fe.jar
[dex] Pre-Dexing C:\Users\...\google-play-services_lib\libs\google-play-services.jar -> google-play-services-9efad6e9178399c185fae6c0b6bdc4c6.jar
[dex] Converting compiled files and external libraries into C:\Users\...\Android\bin\classes.dex...
[dx]
[dx] UNEXPECTED TOP-LEVEL EXCEPTION:
[dx] com.android.dx.util.ExceptionWithContext
[dx] at com.android.dx.util.ExceptionWithContext.withContext(ExceptionWithContext.java:46)
[dx] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:344)
[dx] at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:134)
[dx] at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:87)
[dx] at com.android.dx.command.dexer.Main.processClass(Main.java:487)
[dx] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459)
[dx] at com.android.dx.command.dexer.Main.access$400(Main.java:67)
[dx] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:135)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[dx] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
[dx] at com.android.dx.command.dexer.Main.processOne(Main.java:422)
[dx] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333)
[dx] at com.android.dx.command.dexer.Main.run(Main.java:209)
[dx] at com.android.dx.command.dexer.Main.main(Main.java:174)
[dx] at com.android.dx.command.Main.main(Main.java:91)
[dx] Caused by: java.lang.NullPointerException
[dx] at com.android.dx.cf.code.ConcreteMethod.<init>(ConcreteMethod.java:87)
[dx] at com.android.dx.cf.code.ConcreteMethod.<init>(ConcreteMethod.java:75)
[dx] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:247)
[dx] ... 23 more
[dx] ...while processing <init> (Lcom/.../android/LocationService;)V
[dx] ...while processing com/.../android/LocationService$1.class
[dx]
[dx] 1 error; aborting
对于上下文,我在 Windows 机器上使用 Ant v1.9.2 和 Android build-tools v18.0.1,并且我没有以任何方式编辑构建脚本。android update project --path .
我在他们的两个目录中为应用程序生成了一个,为库生成了一个。我还没有尝试将其设置为自动使用正确的密钥库进行签名,尽管根据我的(有限的)理解,这不应该是必要的,至少对于使用 Ant 的调试构建来说不是必需的。
有没有人见过这个特殊的问题?生成的 .class 文件有问题吗?构建文件?这是我第一次真正尝试使用 Ant 进行构建(我通常只是让 Eclipse 为我完成所有艰苦的工作),所以我几乎没有什么可做的。任何帮助将非常感激。
更新:如果有人关注这个问题,我的问题似乎已经解决了。如何以及为什么,我不知道。今天早上我尝试更新源代码(我们做了一些更改),重新运行android update project -p .
,尝试了一个ant clean debug
,你瞧,它奏效了。和 一样ant release
,它甚至用我给它的密钥正确地签署了它。我最好的猜测是 LocationService 类文件中有一些奇怪的东西,尽管它超出了我的范围。
更新 2:我在第一次更新中所说的任何内容现在都无效了。我已经隔离了这个问题,但还没有更接近于理解它。这段代码是罪魁祸首:
if (Settings.DEBUG) {
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
storeDebugNotification(AndroidUncaughtExceptionHandler.getStackTraceString(ex));
}
});
}
这就是事情变得奇怪的地方。当Settings.DEBUG
标志为true
时,这与 ant 构建良好。当它是 时false
,它会失败,给我上面显示的错误。当我评论整个事情时,它适用于任何一种DEBUG
设置。这同样适用于对if (Settings.DEBUG)
行及其花括号进行注释但主体保持不变,以及注释主体并单独留下 if 部分。所以......我在这里不知所措。在这个特定文件中,关于 if 语句和正文之间的交互的某些事情,当DEBUG
为 false 时会导致问题。另一个奇怪的部分是我们在应用程序的另一个文件中拥有完全相同的 if 块(一个活动,而这个是一个服务)。