Проблемы с запуском файла Android APK при слиянии файлов dex с помощью Scala

Я пытался создавать приложения для Android, используя Scala 2.9.1, SBT 0.13 и Android-Plugin.
Однако запуск ProGuard может быть очень медленным.
Вместо этого, когда я не использую никаких новых классов / methods с момента предыдущей сборки, я просто пытаюсь объединить classes.dex с моими собственными классами dexed android-app (например, MainActivity.scala и тому подобное).

Проблема, с которой я сталкиваюсь (на Android 4.0.x), заключается в том, что слияние происходит без ошибок, но когда я пытаюсь запустить приложение, я получаю это "Unfortunately, MyAndroidApp has stopped".

Вот журнал 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 и классы .dex внутри него, прошел через пакеты и нашел там MainActivity.

Любая помощь будет оценена.


person ioreskovic    schedule 11.07.2012    source источник
comment
Как вы сливаете файлы dex?   -  person James Moore    schedule 16.07.2012
comment
Проверьте мой ответ ниже, я понял, где была ошибка. Что касается слияния, я использую классы DexMerger, DexBuffer и CollisionPolicy, доступные в Android SDK's dx Tool 1.7 API.   -  person ioreskovic    schedule 16.07.2012
comment
К вашему сведению, у меня есть плагин Eclipse (github.com/banshee/AndroidProguardScala), который делает что-то подобное - он вычисляет сигнатуру вызовов, которые вы делаете, и, если возможно, будет использовать кешированный прогон proguard. Это не интересно (пока), если вы используете sbt.   -  person James Moore    schedule 17.07.2012


Ответы (2)


Хорошо, я понял, в чем дело.

По определению, каждый класс Scala реализует scala.ScalaObject.
Мой dexed com.my.app.MainActivity также реализовал scala.ScalaObject.

Однако, поскольку у меня не было scala.ScalaObject в составе моего предыдущего файла classes.dex, и я не включил его в новый, DVM не смог найти класс с подписью public class com.my.app.MyAndroidApp extends android.app.Activity implements com.my.app.TypedActivity with scala.ScalaObject.

person ioreskovic    schedule 12.07.2012

Я предполагаю, что dalvik по какой-то причине отвергает этот класс. Вы хотите посмотреть в logcat примерно то время, когда вы устанавливали приложение, и найти какие-либо сообщения от dalvik. Он напечатает краткую аннотацию о том, какой класс отклоняется и почему.

person JesusFreke    schedule 11.07.2012
comment
Но если вы внимательно посмотрите на мой вопрос, вы заметите, что я уже предоставил журналы logcat;) - person ioreskovic; 11.07.2012
comment
Если вы внимательно посмотрите на мой ответ, я упомяну, что вам нужны журналы с времени установки, а не времени выполнения :) - person JesusFreke; 12.07.2012
comment
Ой, прибудет через 2 часа или около того: D - person ioreskovic; 12.07.2012