Generación dinámica de bytecode Dalvik en una aplicación en ejecución de Dalvik / Android

Esta pregunta ha sido hecha (y contestada) muchas veces sobre la generación y carga dinámica de bytecodes de Java en tiempo de ejecución en una máquina virtual de Dalvik en ejecución, pero ¿hay alguna forma de cargar archivos / bytecodes dex en una aplicación en tiempo de ejecución?

Gracias

El equipo de Dalvik quiere construir una biblioteca de generación de código de tiempo de ejecución de primera clase. Seguimos la solicitud de característica como error 6322 de Android . Desafortunadamente, tenemos una lista muy larga de problemas de rendimiento y corrección, por lo que no puedo darle una línea de tiempo para cuando pasaremos tiempo en este tema.

Hay algunas alternativas, pero todas tomarán algún trabajo:

  • Ejecute su aplicación en una JVM estándar y ejerza allí toda la generación de código de ejecución. Vaciar los archivos .class de la memoria en archivos y, a continuación, ejecutar dx en esos archivos. Si eres bastante sofisticado, podrías integrar todo este trabajo en tu compilación.

  • Incluya la herramienta dx de código abierto como una biblioteca de proyectos y ejecútela de forma programática desde su aplicación, posiblemente en el cargador de clases de su aplicación. Esto hinchará el binario de su aplicación.

¿Hay alguna manera de cargar dex archivos / bytecodes en una aplicación en tiempo de ejecución?

Vea DexFile y DexClassLoader .

Una respuesta relacionada sugiere Dexmaker para la generación dinámica de bytecode Dalvik.

He utilizado ASM y BCEL para generar clases Java y luego las he convertido en archivos Dex. Por último, he creado jar archivos para cargar dinámicamente en el dispositivo.

Puedes consultar mi código 🙂

https://github.com/sciruela/android

Si dentro de cualquier programa C o C ++, desea cargar y llamar a las clases DEX, puede ver cómo se inicia la VM de Dalvik, dentro de AndroidRuntime, por ejemplo frameworks / base / cmds / app_process / app_main.cpp:

 status_t app_init(const char* className, int argc, const char* const argv[]) { LOGV("Entered app_init()!\n"); AndroidRuntime* jr = AndroidRuntime::getRuntime(); jr->callMain(className, argc, argv); LOGV("Exiting app_init()!\n"); return NO_ERROR; } 

Como "jr" AndroidRuntime ya está iniciado, callMain () se llamará:

 status_t AndroidRuntime::callMain( const char* className, int argc, const char* const argv[]) { JNIEnv* env; jclass clazz; jmethodID methodId; LOGD("Calling main entry %s", className); env = getJNIEnv(); if (env == NULL) return UNKNOWN_ERROR; clazz = findClass(env, className); if (clazz == NULL) { LOGE("ERROR: could not find class '%s'\n", className); return UNKNOWN_ERROR; } methodId = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); if (methodId == NULL) { LOGE("ERROR: could not find method %s.main(String[])\n", className); return UNKNOWN_ERROR; } <...> env->CallStaticVoidMethod(clazz, methodId, strArray); return NO_ERROR; } 

Desde arriba, podemos ver cómo se cargan los códigos de las clases DEX y CallStaticVoidMethod () comenzará a interpretar los códigos DEX.

  • Programación de juegos para Android - Heap issues
  • ¿Cómo puedo usar la opción `--multi-dex`?
  • Carga modificada /system/framework/*.jar sin reiniciar
  • ¿Soporta Android ART la carga de clase dinámica de ejecución como Dalvik?
  • Scala en Android: java.lang.NoSuchMethodError: java.lang.String.isEmpty
  • Android Entendiendo tamaños de montón
  • Acceder directamente a los campos estáticos en lugar de llamar a un método getter estático, ¿es más rápido?
  • Dalvik classloader misterio
  • LinearAlloc excedió la capacidad (5242880), ultimo = 1092 Error al instalar en mi dispositivo Tablet Samsung
  • Java.lang.IllegalArgumentException: Rect debe intersectarse con los límites del niño
  • ¿DalvikVM Vs JavaVM en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.