Я пытался найти ответ на этот вопрос как в 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 v18.0.1 на компьютере с Windows и никак не редактировал сценарии сборки. Я создал один для приложения и один для библиотеки, используя 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 в другом файле приложения (активность, а этот — сервис).
android update project path -- .
иant clean debug
). Сборка прошла успешно, и я смог без проблем установить и запустить ее на своем телефоне. - person Alex   schedule 29.08.2013