navegador maquina islandia funcionamiento caracteristicas cache art android dalvik

maquina - Generación dinámica de Bytecode Dalvik en una aplicación Dalvik/Android en ejecución



dalvik vs art (5)

Esta pregunta se ha formulado (y ha respondido) muchas veces sobre la generación dinámica y la carga de códigos de byte java en tiempo de ejecución en una máquina virtual Dalvik en ejecución, pero ¿hay alguna forma de cargar archivos / bytecodes dex en una aplicación en tiempo de ejecución?

Gracias


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

Mira a DexFile y DexClassLoader .


El equipo de Dalvik desea construir una biblioteca de generación de código de tiempo de ejecución de primera clase. Estamos rastreando la solicitud de función como Android 6322 . Desafortunadamente, tenemos una lista muy larga de problemas de rendimiento y corrección, por lo que no puedo darle una fecha límite para cuándo dedicaremos tiempo a este problema.

Hay algunas alternativas, pero todas necesitarán algo de trabajo:

  • Ejecute su aplicación en una JVM estándar y ejecute toda la generación de código de tiempo de ejecución allí. Vuelque los archivos .class de la memoria a los archivos y luego ejecute 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 programáticamente desde su aplicación, posiblemente en el cargador de clases de su aplicación. Esto inflará el binario de tu aplicación.


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

Puedes revisar mi código :)

https://github.com/sciruela/android


Si está dentro de cualquier programa C o C ++, desea cargar y llamar a las clases DEX, puede ver cómo se inicia Dalvik VM, 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, se llamará a callMain ():

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.