Не удалось выполнить автоматические тесты пользовательского интерфейса Android на Jenkins-Server из-за сложных зависимостей основного проекта от lib-проекта - PullRequest
5 голосов
/ 02 апреля 2012

Вкратце, моя структура проекта выглядит следующим образом:
- A и B - это lib-проекты Android, где B зависит от A
- C (обычный проект Android) зависит от B
- T - тест-проект C

У меня соответственно два проекта на моем сервере jenkins, один для C и один для T , у которых есть свой собственный скрипт для сборки, использующий фактически толькокоманды android и ant.Так что нет никаких проблем со сборкой C , но я не могу получить рабочую сборку T .

«Работа» должна означать, что, в зависимости отв сценарии он либо не компилируется, либо завершается с ошибкой во время выполнения из-за некоторых отсутствующих классов, которых на самом деле не может быть, или не проходит этап дексирования из-за добавления дубликатов.

Так что все ясно, что с зависимостями что-то не так, но интересно то, что он очень хорошо работает на локальной машине с eclipse & on emulator.

Итак, вот пример кода shell-script, который на самом деле должен работать и создаватьapk-файл:

cd project-test
android update test-project -m ../projectC -p .
ant clean debug

Это вызывает, к сожалению, что некоторые классы из B , которые я также собираюсь протестировать, не могут быть найдены из компилятора java и явсегда получаю ошибку вот так:

...
[javac] Compiling 14 source files to /home/mehmed/git/project/test-project/bin/classes
[javac] SomeActivityTest.java:8: package com.mydomain.portal.android.project.activity does not exist
[javac] import com.mydomain.portal.android.project.activity.SomeClass1;
[javac]                                                        ^
[javac] SomeActivityTest.java:9: package com.mydomain.portal.android.project.data does not exist
[javac] import com.mydomain.portal.android.project.data.SomeClass2;
[javac]                                                    ^
[javac] SomeActivityTest.java:10: package com.project.portal.android.project.util does not exist
[javac] import com.mydomain.portal.android.project.util.SomeClass3;
[javac]                                                    ^
...

Я пытался исправить практически все возможные ошибки, даже вручную редактируя файл project.properties, включая B или B и C одновременно сПодобные lib-проекты:

cd project-test
android update test-project -m ../projectC -p .
echo "android.library.reference.1=../projectB" >> project.properties
# or even also projectA:
echo "android.library.reference.2=../projectA" >> project.properties
ant clean debug

, что в этот раз приводит к ошибкам при дексинге из-за дублирования при добавлении классов из lib-проектов.

У кого-нибудь есть идеи по поводу исправления этого?Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Из общего описания это звучит как Ошибка Android # 21720 - где недавние изменения в системе сборки Android означают, что создание таких проектов в командной строке не работает должным образом.

В комментариях 16 и 17 есть обходной путь, который вы можете попробовать.

1 голос
/ 03 апреля 2012

В вашем тестовом проекте T , если у вас есть SomeActivityTest, который явно импортирует / использует какой-то пакет / класс из Библиотечного проекта B и / или C , вынеобходимо добавить библиотечный проект в качестве зависимости тестового проекта, так как указанный пакет / класс требуется во время сборки проекта.в противном случае вы получите следующую ошибку при компиляции тестового проекта:

[javac] SomeActivityTest.java:8: package com.mydomain.portal.android.project.activity does not exist
[javac] import com.mydomain.portal.android.project.activity.SomeClass1;
[javac]                                                        ^
[javac] SomeActivityTest.java:9: package com.mydomain.portal.android.project.data does not exist

Если вы добавите Библиотечный проект в качестве зависимости как в Основной проект, так и в Тестовый проект и используете Ant build свой тестовый проект,это вызывает повторяющиеся записи на этапе dexing.Плагин Eclipse ADT знает, как правильно справиться с этой ситуацией, чтобы вы не столкнулись с этой проблемой при сборке с Eclipse:

[dx] UNEXPECTED TOP-LEVEL EXCEPTION:
[dx] java.lang.IllegalArgumentException: already added: Lcom/mydomain/...;
[dx]     at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
[dx]     at com.android.dx.dex.file.DexFile.add(DexFile.java:163)

В настоящее время существует обходной путь (грязное исправление в скрипте ant), посмотрите мой ответ здесь для подробностей.

Обратите внимание, что последний выпуск SDK r17, который получил много исправлений ошибок и улучшений.Согласно changelog , в нем утверждается, что теперь SDK может более эффективно работать с дублирующимися зависимостями, хотя я еще не устал от Test Project.Вероятно, вы можете дать ему шанс и посмотреть, работает ли он.Надеюсь, это поможет.

...