Scala Android Roboguice: исключение ClassNotFoundException в загрузчике

#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.