Intereting Posts
Разница между setContentView и LayoutInflater Добавить значок в правом нижнем углу уведомления InboxStyle Способ передачи имени пользователя и пароля в VpnService.Builder Сохранять данные в методе onDestroy Как интегрировать Google Plus и Facebook Authentication вместе в ту же деятельность Android-проекта? Android: текстовая гиперссылка Могу ли я обнаружить, когда мой сервис убит с помощью «Advanced Task Killer» Android Development Tool 23.0.0 и Android L Ошибка обновления в eclipse Как перечислить пары ключевых значений пакета Google Cloud Messaging не работает с 4.1.2 устройствами в корпоративной сети Как избавиться от подчеркивания в Spannable String с помощью объекта Clickable? Создание масштабированного растрового изображения с помощью createScaledBitmap в Android Ошибка открытия ExifInterface JHEAD (андроида) Мастер Eclipse для создания новой активности Android не работает Как установить двустороннюю связь между Activity и Service в разных процессах?

ExceptionWithContext получает бросок при попытке создать Android-приложение с Ant

Я пробовал искать как в 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 

Для контекста я использую Ant v1.9.2 и Android build-tools v18.0.1 на компьютере с Windows, и я никак не редактировал сценарии сборки. Я создал один для приложения, а другой – для библиотеки, использующей android update project --path . В их двух каталогах. Я также не пробовал настраивать его, чтобы автоматически использовать правильное хранилище ключей для подписания, хотя и для моего (ограниченного) понимания, которое не должно быть необходимым, по крайней мере, не для сборки отладки с Ant.

Кто-нибудь видел этот конкретный вопрос раньше? Это проблема с созданным файлом .class? Файлы сборки? Это мой первый реальный набег на создание с Ant (я вообще просто позволяю Eclipse делать всю тяжелую работу для меня), поэтому у меня очень мало времени для продолжения. Любая помощь приветствуется.

Обновление: если кто-то обратил внимание на этот вопрос, мой вопрос, похоже, разрешился. Как и почему, я не знаю. Я попробовал обновить источник сегодня утром (у нас было несколько изменений), проект android update project -p . reran 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 является ложным, вызывает проблемы. И другая странная часть заключается в том, что у нас есть то же самое, если блок в другом файле приложения (активность, тогда как эта – услуга).

Solutions Collecting From Web of "ExceptionWithContext получает бросок при попытке создать Android-приложение с Ant"

У меня было то же исключение при компиляции проекта для выпуска. Мой код:

 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 ), но поскольку он оптимизирован, произойдет ошибка. Я взял анонимный класс за фигурные скобки, проблема решена:

 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 } }); } 

После нескольких месяцев борьбы с этой точной проблемой я наконец нашел решение, которое работает для меня. Возможно, это не ваш случай. Убедитесь, что ни один из классов, к которым вы обращаетесь (возможно, настройки? Может быть, AndroidUncaughtExceptionHandler?) Является закрытым. Gradle не может справиться с этим и не может найти метод внутри класса. Просто измените его на общедоступный (или просто удалите флаг, чтобы сохранить его по умолчанию, если класс вложен), и вам должно быть хорошо идти.

Другим решением, чем предлагал @ Albert-Jan, было бы «обернуть» эту константу в методе. Что-то вроде

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

В этом случае он не будет «разрешен» как постоянный по градиенту, и во время сборки не будет проблем.

Вероятно, самым известным «эксплойтом» этого подхода будет метод isUserAGoat () из класса UserManager в Android SDK. Здесь очень популярная дискуссия о возможном использовании этого метода. Наслаждайтесь;)

Надеюсь, это будет полезно для кого-то с подобными проблемами