2016-03-24 2 views
0

Je voulais savoir les raisons pour lesquelles la manipulation de bytecode sur android à l'exécution n'est pas possible? Est-ce parce qu'actuellement il n'y a pas de bibliothèque de support ou parce que le format DEX est quelque chose qui ne peut pas être manipulé?manipulation bytecode sur Android à l'exécution

+0

[ce] un (http://asm.ow2.org/doc/tutorial-asmdex.html)? – pskink

+0

merci ... :) – FAZ

+0

Est-ce juste une question "Je me demande pourquoi" ou "Je veux faire quelque chose"? Si c'est le dernier, vous pouvez utiliser Java-ASM. Doug a raison de dire que vous ne pouvez pas modifier les classes existantes à l'exécution, mais vous pouvez créer vos propres classes et les exécuter à l'exécution avec ASM. Je fais cela dans un de mes programmes et pendant que icky fonctionne bien. –

Répondre

2

Lors de l'exécution, après le chargement d'une classe, la définition de cette classe ne peut pas être modifiée. Cela est vrai pour tout système semblable à la JVM, y compris Dalvik d'Android. Cependant, vous pouvez modifier les classes après la compilation mais avant l'inclusion dans l'APK, que j'ai beaucoup fait pour les outils de l'application Android. Une fois l'APK créé, vous ne pouvez plus apporter de modifications, car le fichier APK est signé pour vérifier le contenu de l'archive. Ne pas confondre avec la technique similaire dans Objective-C appelée méthode swizzling qui vous permet d'apporter des modifications efficaces aux définitions d'objet lors de l'exécution. L'exécution d'Objective-C est mutable, l'exécution de JVM ne l'est pas.

Si vous avez un dex externe à modifier avant de le charger dans une application Android, vous pouvez le faire également, mais encore une fois, une fois que les classes ont été chargées par un ClassLoader, elles ne peuvent pas être modifiées.

1

Eh bien, il y a DexClassLoader, qui peut au moins obtenir des classes de l'extérieur d'un apk. Comment créer les classes.dex à l'intérieur de ce .jar est une autre histoire. Pour citer les documents:

Un chargeur de classe qui charge les classes de .jar et .apk fichiers contenant une entrée de classes.dex. Cela peut être utilisé pour exécuter du code non installé dans le cadre d'une application.

Ce chargeur de classe requiert un répertoire accessible en écriture, privé, pour mettre en cache les classes optimisées. Utilisez Context.getCodeCacheDir() pour créer un répertoire