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
- Posible BUG en Android Clase ImageDownloader: sHardBitmapCache NO estática cuando debería ser?
- Constantemente ... DeviceMonitor] No se pudo iniciar la supervisión
- "Tiros" y "anotación para excepción" en el bytecode de Dalvik
- Dalvik auto-compilado no carga bibliotecas compartidas
- ¿Es Kotlin 100% compatible con ART en Android?
- Cómo minimizar las ocurrencias GC_FOR_ALLOC?
- ¿Cómo puedo detectar el tiempo de ejecución de Android (Dalvik o ART)?
- ¿El compilador java optimizará una llamada de método a una variable estática final? ¿Y qué pasa cuando se convierte en código dalvik?
- Entender los lazos estrechos de Android / Spin-On-Suspender el error
- ¿Cuál es la diferencia entre Dalvik VM y ART Runtime?
- Android y Dalvik - Obtener el tamaño de un objeto
- Desventajas en Multidexing la aplicación de Android
- CLI en DalvikVM falla en JNI lib
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 🙂
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.