ExceptionWithContext gets thrown when trying to build an Android app with Ant
我试着在谷歌和StackOverflow上搜索这个问题的答案,但我找不到任何人有我的确切问题。我正试图建立一个持续集成服务器(特别是Bamboon),每当有人更改源代码管理时,就更新、构建和导出一个APK。当我手动执行每一步时,我在本地机器上遇到同样的错误,当我使用已设置的作业时,在服务器上遇到同样的错误。当我到达构建的dex步骤时,就会发生错误。到目前为止,我已经得到了与
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | -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机器上使用Antv1.9.2和Android构建工具v18.0.1,并且我没有以任何方式编辑构建脚本。我在两个目录中使用
以前有人看过这个特别的问题吗?生成的.class文件有问题吗?生成文件?这是我第一次真正的尝试使用蚂蚁进行构建(我通常只是让Eclipse为我做所有的艰苦工作),所以我没有什么可以继续。任何帮助都将不胜感激。
更新:如果有人关注这个问题,我的问题似乎已经解决了。我不知道为什么会这样。今天早上我试着更新源代码(我们在中做了一些修改),重新运行
更新2:我在第一次更新中说的话现在无效。我孤立了这个问题,但离理解它不近。这段代码是罪魁祸首:
1 2 3 4 5 6 7 8 | if (Settings.DEBUG) { Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { storeDebugNotification(AndroidUncaughtExceptionHandler.getStackTraceString(ex)); } }); } |
这就是事情变得奇怪的地方。当
我在为发布编译项目时也遇到了同样的异常。我的代码是:
1 2 3 4 5 6 7 8 9 | if (BuildConfig.DEBUG) { myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }); } |
因为buildconfig.debug是一个值为false的常量,所以块中的代码被识别为死代码,并在优化时删除。
cftranslator(class file translator)希望为块内的匿名类(someclass$1.class)创建一个单独的文件,但是由于它被优化掉了,将发生错误。我把匿名类放在花括号外,问题解决了:
1 2 3 4 5 6 7 8 9 10 | View.OnClickListener lClickListener = new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }; if (BuildConfig.DEBUG) { myView.setOnClickListener(lClickListener); } |
更新:解决此问题的另一种方法(由@ewoks在下面的答案中描述)是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public boolean isInDeveloperMode() { return BuildConfig.DEBUG; } ... if (isInDeveloperMode()) { myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }); } |
经过几个月的努力,我终于找到了一个适合我的解决方案。可能不是你的情况。确保没有您所指的类(可能是设置?可能是AndroidUncaughtexceptionhandler?)是私人的。Gradle无法处理它,并且在类中找不到方法。只需将其更改为public(或者,如果类是嵌套的,则只需删除标志以将其保持为默认值),这样就可以很好地执行了。
@albert jan提出的其他解决方案是用一个方法"包装"这个常量。类似的东西
return BuildConfig.DEBUG;
}
在这种情况下,它将不会被梯度"解决"为常量,并且在构建期间不会出现任何问题。
这种方法最著名的"漏洞"可能是android sdk中usermanager类的isuseragoat()方法。关于这种方法的可能用途,这里有非常流行的讨论。享受;
希望这对有类似问题的人有用