#java #android #scala #guice #roboguice
#java #Android #scala #интерфейс #roboguice
Вопрос:
Я оцениваю Scala на Android, начиная с демо-версии NotesList. Мне удалось без проблем заменить NotesLiveFolder.java
файл на его эквивалент в Scala.
Затем я ввел Roboguice, создав простой, NotesListApplication.java
который настраивает модули Guice, и успешно внедрил ресурс в NoteEditor.java
действие.
Наконец, когда я попытался заменить NotesListApplication.java
его эквивалентом Scala, я получаю следующую ошибку времени выполнения до завершения загрузки приложения:
java.lang.ClassNotFoundException: com.example.android.notepad.NotesListApplication in loader dalvik.system.PathClassLoader[/data/app/com.example.android.notepad-1.apk]
Я создал проект Google Code, содержащий полный проект Eclipse и исходный код. Первоначальное функционирование NotesListApplication.java
является:
package com.example.android.notepad;
import java.util.List;
import roboguice.application.RoboApplication;
import com.google.inject.Module;
public class NotesListApplication extends RoboApplication {
private Module module = new BindEverything();
public void setModule(Module module) {
this.module = module;
}
@Override
protected void addApplicationModules(List<Module> modules) {
modules.add(module);
}
}
и эквивалент Scala, который вызывает ошибку, является:
package com.example.android.notepad
import roboguice.application.RoboApplication
class NotesListApplication extends RoboApplication {
val module : Module = new BindEverything()
override protected def addApplicationModules(modules:java.util.List[Module] ) {
modules.add(module)
}
}
Я создаю в Eclipse с помощью плагина ScalaIDE. Я не запускаю никакой treeshaker / proguard / etc.
Дизассемблирование показывает классы Scala, как и ожидалось:
Class descriptor : 'Lcom/example/android/notepad/NotesLiveFolder;'
...
Class descriptor : 'Lcom/example/android/notepad/NotesListApplication;'
Есть идеи, что могло вызвать это?
Ответ №1:
Обновите RoboGuice до версии 2.0-СНИМОК RoboGuice, и тогда вам не придется использовать RoboApplication, и все это автоматически привязывается. Для получения дополнительной информации о привязке ознакомьтесь со слайдами из презентаций Майка Бертонса о RoboGuice на AnDevCon 2 и ознакомьтесь с разделом 2.0 на wiki.
Как я опубликовал в списке рассылки, возможно, проверьте apk с помощью dedexer и посмотрите, действительно ли класс был удален, например, Proguard или переименован, чтобы его нельзя было найти в качестве следующего шага.
Комментарии:
1. Манфред, я проверил, что это не просто проблема с
Application
классом — если я пытаюсь создать текущую папку (activity), я получаю аналогичное исключение:java.lang.ClassNotFoundException: com.example.android.notepad.NotesLiveFolder in loader dalvik.system.PathClassLoader[/data/app/com.example.android.notepad-1.apk]
2. Я также обнаружил, что класс присутствовал при разборке. Я думаю, что в процессе сборки по умолчанию в Scala IDE есть что-то, из-за чего необходимые зависимости библиотеки Scala удаляются или исключаются из окончательного apk. Я не знаю, как устранить это.
3. @Jeff — Я получаю похожую / ту же проблему. Есть прогресс?
4. @MarkLapasa Я пока отложил написание своего основного приложения на Scala, чтобы сосредоточиться на укреплении архитектуры моего приложения. Я использую Scala для своих тестов Android, и я почти уверен, что смог бы заставить основное приложение работать, но это было бы огромной проблемой. Я потратил много недель, работая над этим. Вы должны использовать ProGuard и / или другие сложные в настройке инструменты, чтобы все заработало. Я надеюсь, что в конечном итоге необходимость в этих инструментах исчезнет, и мы получим что-то гораздо более удобное для Scala на Android.