使用Scala合并dex文件时运行Android APK文件出现问题

5
我一直在尝试使用Scala 2.9.1和SBT 0.13以及Android-Plugin创建Android应用程序。然而,运行ProGuard可能会非常慢。因此,当我没有使用任何新的类/方法自上次构建以来时,我只是尝试将classes.dex与我的dexed android-app类(例如MainActivity.scala等)合并。
问题是,当我尝试在Android 4.0.x上运行应用程序时,合并过程没有出现任何错误,但是我收到了"不幸的是,MyAndroidApp已停止"的消息。
以下是logcat日志:
  EmbeddedLogger  E  App crashed! Package: com.my.app v0 (0.1)
  300         EmbeddedLogger  E  Application Label: MyAndroidApp
 24137        AndroidRuntime  E  FATAL EXCEPTION: main
 24137        AndroidRuntime  E  java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.app/com.my.app.MainActivity}: java.lang.ClassNotFoundException: com.my.app.MainActivity
 24137        AndroidRuntime  E   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2118)
 24137        AndroidRuntime  E   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237)
 24137        AndroidRuntime  E   at android.app.ActivityThread.access$600(ActivityThread.java:139)
 24137        AndroidRuntime  E   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
 24137        AndroidRuntime  E   at android.os.Handler.dispatchMessage(Handler.java:99)
 24137        AndroidRuntime  E   at android.os.Looper.loop(Looper.java:156)
 24137        AndroidRuntime  E   at android.app.ActivityThread.main(ActivityThread.java:5005)
 24137        AndroidRuntime  E   at java.lang.reflect.Method.invokeNative(Native Method)
 24137        AndroidRuntime  E   at java.lang.reflect.Method.invoke(Method.java:511)
 24137        AndroidRuntime  E   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
 24137        AndroidRuntime  E   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
 24137        AndroidRuntime  E   at dalvik.system.NativeStart.main(Native Method)
 24137        AndroidRuntime  E  Caused by: java.lang.ClassNotFoundException: com.my.app.MainActivity
 24137        AndroidRuntime  E   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
 24137        AndroidRuntime  E   at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
 24137        AndroidRuntime  E   at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
 24137        AndroidRuntime  E   at android.app.Instrumentation.newActivity(Instrumentation.java:1039)
 24137        AndroidRuntime  E   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2109)
 24137        AndroidRuntime  E   ... 11 more
  300        ActivityManager  W    Force finishing activity com.my.app/.MainActivity
  5864        OpenGLRenderer  D  Flushing caches (mode 1)
  300           ViewRootImpl  D  @@@- disable SystemServer HW acceleration

我手动打开了生成的apk文件,然后打开它里面的classes.dex文件,在其中浏览包名并找到了MainActivity类。
非常感谢您的帮助。

你是如何合并dex文件的? - James Moore
请检查我的回答,我找到了错误所在。至于合并,我正在使用Android SDK的dx工具1.7 API中提供的DexMerger、DexBuffer和CollisionPolicy类。 - ioreskovic
我有一个 Eclipse 插件(https://github.com/banshee/AndroidProguardScala),它可以做类似的事情 - 它计算你所做的调用的签名,并在可能的情况下使用缓存的 proguard 运行。如果你正在使用 sbt,那么它还不是很有趣。 - James Moore
2个回答

2

好的,我找到了问题所在。

根据定义,每个Scala类都实现了scala.ScalaObject
我的dexed文件中的com.my.app.MainActivity也实现了scala.ScalaObject

但是,由于我之前的classes.dex文件中没有scala.ScalaObject,并且我也没有在新文件中包含它,因此DVM无法找到具有签名public class com.my.app.MyAndroidApp extends android.app.Activity implements com.my.app.TypedActivity with scala.ScalaObject的类。


1

我最好的猜测是Dalvik由于某种原因拒绝了该类。您需要在安装应用程序时查看logcat,并查找来自Dalvik的任何消息。它将打印有关它拒绝哪个类以及原因的简要摘要。


但是如果您仔细查看我的问题,您会注意到我已经提供了logcat日志 ;) - ioreskovic
3
如果您仔细查看我的回答,我提到您需要安装时间的日志,而不是执行时间的日志 :) - JesusFreke
抱歉,大约2小时后就会到了:D - ioreskovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接