Android, scala y eclipse = mezcla inestable

Recientemente, he escrito algunas aplicaciones para Android en scala, trabajando con Eclipse. Todo estaba bien hasta que mi programa sólo tenía varias clases / actividades. Cuando agregué más código, JVM empezó a fallar, eclipse a menudo congelado y adb perdió constantemente la conexión. Administrador de tareas mostró que el proceso de Java estaba tomando de 800 a 1300 MB de memoria!

Los parámetros de hardware de mi computadora son bastante agradables como i7 3rd gen, 8GB DDR3 y SSD 256. Así que no es la razón.

También mi software está actualizado y consits de la nueva versión de Eclipse, Android SDK, Scala y Java kit de desarrollo, todos los complementos para eclipse. -vmargs se configuran para el desarrollo scala pero no ayuda en absoluto. Así que lo eliminé como una causa del problema.

Cuando reescribo mi código a Java everythig va excelente y puedo seguir con mi proyecto.

¿Alguien ha encontrado alguna solución para trabajar con scala en el proyecto Android? He leído un par de temas similares aquí y en grupos de google, pero no hubo respuesta sobre esta cuestión.

EDITAR:

He perfilado mi código con visual vm, pero el uso de espacio en montón fue normal. He aquí un fragmento de mi código.

imports ... class MainActivity extends FragmentActivity { private lazy val timePicker = findViewById(R.id.timePicker).asInstanceOf[TimePicker] private lazy val spinner_sourceBank = findViewById(R.id.spinnerSource).asInstanceOf[Spinner] private lazy val spinner_targetBank = findViewById(R.id.spinnerDestination).asInstanceOf[Spinner] private lazy val myApplication = getApplication.asInstanceOf[MyApplication] private var ignoreTimeChange = false override protected def onCreate(savedInstanceState: Bundle) = { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) timePicker.setIs24HourView(true) initializeSpinner(spinner_sourceBank) initializeSpinner(spinner_targetBank) } private def initializeSpinner(spinner: Spinner) = { val adapter = ArrayAdapter.createFromResource(this, R.array.banks, R.layout.spinner_item) adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) spinner.setAdapter(adapter) } def reset(w: View) = { timePicker.setCurrentHour(13) timePicker.setCurrentMinute(00) spinner_sourceBank.setSelection(0) spinner_targetBank.setSelection(0) } def submit(w: View) = { if (spinner_sourceBank.getSelectedItemPosition == 0 || spinner_targetBank.getSelectedItemPosition == 0) { new AlertDialog.Builder(this).setPositiveButton("OK", new OnClickListener { override def onClick(dialog: DialogInterface, which: Int) { dialog dismiss } }).setMessage(getString(R.string.alert_title)).setTitle("Alert Dialog").setIcon(android.R.drawable.ic_dialog_alert).create.show } else manageFragments(sourceBank, targetBank) } def manageFragments(sourceBank: String, targetBank: String) = { val fragmentTransaction = getSupportFragmentManager.beginTransaction if (targetBank == sourceBank) myApplication.setCurrentFragment(MyApplication.NOW) else myApplication.setCurrentFragment(MyApplication.FIRST_SESSION) fragmentTransaction.replace(R.id.fragment_container, myApplication.getCurrentFragment) fragmentTransaction.commit } override def onCreateOptionsMenu(menu: Menu): Boolean = { getMenuInflater.inflate(R.menu.activity_main, menu); true } } 

Podría probar mi aplicación en un dispositivo móvil y funcionó bastante bien. También podría escribir mi código, pero eclipse se comportó como funcionó en la vieja computadora – las lengüetas de la conmutación tomaron mucho tiempo y así que construyendo y desplegando.

Añádale a eclipse.ini (o edite si está presente), ya que están más optimizadas para el desarrollo de Scala: Deben aparecer debajo de entradas de eclipse, como -vm:

 -Xverify:none -Dosgi.requiredJavaVersion=1.6 -Xms900m -Xmx900m -Xss2m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxGCPauseMillis=20 -XX:MaxHeapFreeRatio=70 -XX:+ScavengeBeforeFullGC -XX:+UseParallelOldGC -XX:+UnlockExperimentalVMOptions -XX:+UseFastAccessorMethods -XX:ReservedCodeCacheSize=128m -XX:+TieredCompilation -XX:+AggressiveOpts 

Probablemente improbable, pero si utiliza CMS GC, elimine las referencias del archivo.

Si bien no he hecho esto con el desarrollo específico de Android, he golpeado problemas similares mientras se hace el curso de "Principios de programación de funciones en Scala" Coursera. Lo que resultó ser era el espacio PermGen para el Eclipse JVM estaba maxing hacia fuera lo que provoca todo tipo de comportamiento Eclipse aleatorio y caótico. Resulta que detrás de las escenas, el compilador Scala genera MUCHAS más veces el número de archivos de clase que para un proyecto Java de aproximadamente el mismo tamaño. Por lo tanto, he añadido lo siguiente a la línea de comandos de inicio para Eclipse:

-XX: MaxPermSize = 256m

Antes de esto, yo estaba teniendo los más extraños errores de Eclipse, en los momentos más extraños, sin ninguna forma razonable de reproducirlos consistentemente. Y tuve esto durante las primeras tres semanas del curso. Casi salí del curso desde que estaba usando la versión de TypeSafe de Eclipse que había descargado explícitamente para el curso. Una vez que agregué lo anterior a la puesta en marcha de JVM para Eclipse, no tuve otro problema. No podía creer lo impresionante que era el Scala IDE, ya que nunca había podido usarlo estable antes de hacer esto.

Espero que esto ayude.

  • Con ProGuard, ¿cuál es el impacto en la estrategia de pruebas?
  • Android, Scala y Proguard
  • ¿Qué idiomas están maduros para desarrollar aplicaciones nativas en Android
  • ¿Hay una manera de combinar dos o más archivos .dex en un archivo .dex utilizando Scala?
  • ¿Está utilizando Scala en Android vale la pena? ¿Hay un montón de gastos generales? ¿Problemas?
  • ¿Qué hay en scala-android.jar?
  • Problemas con la ejecución del archivo APK de Android al fusionar archivos dex con Scala
  • No se puede encontrar el método en la actividad
  • Dependencia no resuelta: com.hanhuy.sbt # android-sdk-plugin; 1.3.19: no encontrado
  • Cómo bajar la versión proguard en androide gradle estudio?
  • Error al ejecutar 'sbt start-device'
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.