2010-04-09 6 views

Répondre

23

L'équipe de Dalvik aimerait créer une bibliothèque de génération de code d'exécution de première classe. Nous suivons la demande de fonctionnalité en tant que Android bug 6322. Malheureusement, nous avons une très longue liste de problèmes de performance et d'exactitude, donc je ne peux pas vous donner de calendrier pour le moment où nous allons passer du temps sur cette question.

Il existe des alternatives, mais ils vont tous prendre un peu de travail:

  • exécuter votre application sur une machine virtuelle Java standard et d'y exercer toute la génération de code d'exécution. Vider les fichiers .class de la mémoire dans les fichiers, puis exécutez dx sur ces fichiers. Si vous êtes assez sophistiqué, vous pouvez intégrer tout ce travail dans votre build.

  • Incluez l'outil open source dx en tant que bibliothèque de projet et exécutez-le par programme depuis votre application, éventuellement dans le chargeur de classe de votre application. Cela va gonfler le binaire de votre application.

+1

Merci pour votre réponse. Y a-t-il quelque chose qui m'empêche d'écrire mon propre générateur de code maintenant? J'en ai écrit un pour .Net-> Flash et .Net ->. Net, et Dex est comme un croisement entre Java .Class et les fichiers Flash .ABC. Aussi, merci pour le lien. Je l'ai joué et ajouté un commentaire (demandant que son API soit similaire au DLR de .Net). –

+3

Vous pouvez certainement écrire votre propre générateur de code dès maintenant. Si vous lui donnez une licence Apache, encore mieux! –

+3

Mise à jour: jetez un oeil à dexmaker qui rend cela facile: http://code.google.com/p/dexmaker/ –

5

est-il possible de charger des fichiers/dex bytecode dans une application à exécution?

Regardez DexFile et DexClassLoader.

+1

Précédemment sur ce sujet: http://stackoverflow.com/questions/1001944/android-remote-code-loading/2450049#2450049 – fadden

1

Si l'intérieur de tout C ou C++ programme, vous voulez charger et appeler dans les classes de DEX, vous pouvez voir comment la machine virtuelle Dalvik est démarré, à l'intérieur du AndroidRuntime - par exemple des cadres/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; 
} 

Comme "jr" AndroidRuntime est déjà commencé, callMain() sera appelé:

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

d'en haut, on peut voir comment sont chargés les codes des classes DEX et CallStaticVoidMe thod() commencera à interpréter les codes DEX.

2

J'ai utilisé ASM et BCEL pour générer des classes Java, puis je les ai convertis en fichiers Dex. Enfin, j'ai créé des fichiers jar à charger dynamiquement sur l'appareil.

Vous pouvez consulter mon code :)

https://github.com/sciruela/android

Questions connexes