2010-04-09 14 views

Antwort

23

Die Dalvik-Team möchte eine erstklassige Laufzeitcodegenerierung Bibliothek bauen. Wir verfolgen die Feature-Anforderung als Android bug 6322. Leider haben wir eine sehr lange Liste von Leistungs- und Korrektheitsproblemen, daher kann ich Ihnen keine Zeit geben, wann wir uns mit diesem Problem beschäftigen werden.

Es gibt einige Alternativen, aber sie werden alle etwas Arbeit:

  • Führen Sie Ihre Anwendung auf einem Standard-JVM und trainieren den gesamten Code Laufzeit Generation gibt. Speichern Sie die .class-Dateien aus dem Speicher in Dateien und führen Sie dann dx für diese Dateien aus. Wenn Sie ziemlich anspruchsvoll sind, können Sie all diese Arbeit in Ihren Build integrieren.

  • Schließen Sie das Open-Source-DX-Tool als Projektbibliothek ein und führen Sie es programmgesteuert aus Ihrer Anwendung aus, möglicherweise im Classloader Ihrer Anwendung. Dies wird die Binärdatei Ihrer Anwendung aufblähen.

+1

Vielen Dank für Ihre Antwort. Gibt es etwas, das mich daran hindert, meinen eigenen Code-Generator zu schreiben? Ich habe einen für .Net-> Flash und .Net ->. Net geschrieben, und Dex ist wie eine Kreuzung zwischen Java .Class und Flash .ABC-Dateien. Auch, danke für den Link. Ich habe es mit einem Stern versehen und einen Kommentar hinzugefügt (er fordert, dass sein API dem DLR von .Net ähnlich ist). –

+3

Sie könnten jetzt definitiv Ihren eigenen Code-Generator schreiben. Wenn Sie eine Apache-Lizenz geben, noch besser! –

+3

Update: Werfen Sie einen Blick auf dexmaker, das macht das einfach: http://code.google.com/p/dexmaker/ –

5

ist es eine Möglichkeit, dex Dateien/Bytecode in eine App bei Laufzeit zu laden?

Betrachten Sie DexFile und DexClassLoader.

+1

Zuvor zu diesem Thema: http://stackoverflow.com/questions/1001944/android-remote-code-loading/2450049#2450049 – fadden

1

Wenn innerhalb jeder C oder C++ Programm, Sie wollen in die DEX-Klassen laden und aufrufen, können Sie sehen, wie die Dalvik VM gestartet wird, innerhalb des Android Runtime - zum Beispiel Gerüste/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; 
} 

Als "jr" Android Runtime bereits gestartet ist, wird callMain() aufgerufen werden:

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; 
} 

Von oben können wir sehen, wie die Codes DEX Klassen geladen und CallStaticVoidMe thod() beginnt mit der Interpretation der DEX-Codes.

2

Ich habe ASM und BCEL verwendet Java-Klassen zu erzeugen, und dann habe ich konvertiert sie Dateien Dex. Endlich habe ich JAR-Dateien zum dynamischen Laden auf dem Gerät erstellt.

Sie können meinen Code überprüfen :)

https://github.com/sciruela/android