1

我从 NotesList 演示开始评估 Android 上的 Scala。我能够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]

我创建了一个包含完整 Eclipse 项目和源代码的Google Code 项目。原来的功能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)
    }
}

我正在使用 ScalaIDE 插件在 Eclipse 中构建。我没有运行任何 treeshaker/proguard/etc。

反汇编按预期显示了 Scala 类:

Class descriptor : 'Lcom/example/android/notepad/NotesLiveFolder;'

...

Class descriptor : 'Lcom/example/android/notepad/NotesListApplication;'

有什么想法可能导致这种情况吗?

4

1 回答 1

0

升级到 RoboGuice 的 2.0-SNAPSHOT,然后你就不必使用 RoboApplication,它会自动绑定。有关如何绑定的更多信息,请查看 Mike Burtons 在 AnDevCon 2 上关于 RoboGuice 的演示文稿中的幻灯片,并查看wiki 上的 2.0 部分。

就像我在邮件列表上发布的那样,也许可以使用 dedexer 查看 apk,看看该类是否实际上被 Proguard 删除或重命名,因此下一步无法找到它。

于 2011-11-10T19:03:24.480 回答