尝试使用Ant构buildAndroid应用程序时引发ExceptionWithContext

我已经尝试在谷歌和stackoverflowsearch周围的答案,但我一直无法find任何人与我有什么确切的问题。 我试图build立一个连续的集成服务器(特别是竹)来更新,构build和导出一个APK,每次有人在源代码pipe理中进行更改。 当我使用我设置的工作时,手动和服务器上的每一步都会在本地计算机上遇到同样的错误。 当我到达构build的dex步骤时发生错误。 到目前为止,我已经获得了相同的输出与ant debugant releaseant 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,并没有以任何方式编辑构build脚本。 我使用android update project --path .为应用程序和库生成一个android update project --path . 在他们的两个目录中。 我也没有尝试设置它自动使用适当的密钥库进行签名,但对我的(有限的)理解,这不应该是必要的,至less不是用Ant的debugging版本。

有没有人见过这个特殊的问题? 这是生成的.class文件的问题吗? 生成文件? 这是我第一次真正尝试用Ant来进行构build(我通常只是让Eclipse为我做所有的辛苦工作),所以我几乎没有继续下去。 任何帮助将非常感激。

更新:如果有人关注这个问题,我的问题似乎已经解决了。 如何和为什么,我不知道。 我尝试更新源今天上午(我们有一些变化),重新android update project -p . ,尝试了一个ant clean debug ,你看,它的工作。 ant release ,甚至用我给它的钥匙正确签署。 我最好的猜测是在那个LocationService类文件中有些奇怪的东西,尽pipe它是什么超越了我。

更新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 ,这与antbuild立良好。 当它是false ,失败,给我上面显示的错误。 当我评论整个事情,它可以正常使用DEBUG设置。 if (Settings.DEBUG)行和它的花括号注释,但身体保持不变,以及评论身体和离开if部分单独同样如此。 所以…我在这里不知所措 在DEBUG为false的情况下,在这个特定的文件中,关于if语句和body之间的相互作用引起了一些问题。 而另一个奇怪的部分是,我们有完全相同的,如果在应用程序中的另一个文件(一个活动,而这是一个服务) 阻止

Solutions Collecting From Web of "尝试使用Ant构buildAndroid应用程序时引发ExceptionWithContext"

在编译发布项目时,我有同样的exception。 我的代码是:

 if (BuildConfig.DEBUG) { myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }); } 

因为BuildConfig.DEBUG是一个值为false的常量,所以块中的代码被识别为死代码,并在优化时被删除。

CfTranslator(Classfile Translator)希望为块内的匿名类SomeClass $ 1.class )创build一个单独的文件,但是由于它被优化了,所以会发生错误。 我花了大括号之外的匿名课,解决了这个问题:

 View.OnClickListener lClickListener = new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }; if (BuildConfig.DEBUG) { myView.setOnClickListener(lClickListener); } 

更新:解决这个问题的另一种方法(在下面的回答中,由@Ewoks描述)是:

 public boolean isInDeveloperMode() { return BuildConfig.DEBUG; } ... if (isInDeveloperMode()) { myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }); } 

经过几个月的努力,我终于find了一个适合我的解决scheme。 这可能不是你的情况。 确保没有你所指的类(也许设置?也许AndroidUncaughtExceptionHandler?)是私有的。 Gradle不能处理它,在类中找不到方法。 只要将其更改为public(或只是删除标志以保持默认状态,如果该类是嵌套的),那么您应该很好。

除了@ Albert-Jan提出的解决scheme之外,其他的解决scheme是在方法中“包装”这个常量。 就像是

public boolean isInDeveloperMode(){ return BuildConfig.DEBUG; }

在这种情况下,它不会被gradle“解决”为常量,并且在构build时没有问题。

这种方法最有名的“漏洞”可能是Android SDK中UserManager类的isUserAGoat()方法。 这里有非常受欢迎的讨论这种方法的可能用途..享受;)

希望这对有类似问题的人有用