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 :)
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.
Una respuesta relacionada sugiere code.google.com/p/dexmaker para la generación dinámica de code.google.com/p/dexmaker de code.google.com/p/dexmaker de Dalvik.