Выполнение Groovy скриптов, встроенных в Java во время выполнения для Android

Начиная с версии 2.4, Groovy поддерживает Android. Я хочу запустить встраивание Groovy script в Java в приложении для Android.

На этом веб-сайте объясняется, что это возможно: http://melix.github.io/blog/2014/06/grooid2.html

Одна из трудностей адаптации языка Groovy заключается в том, что, поскольку мы сказал, Groovy - очень динамичный язык. Одна из его возможностей - выполнение сценариев во время выполнения. Итак, что, если мы хотим набрать Groovy script на устройстве и выполнить его непосредственно на нем? Является ли это возможным? На самом деле, да, это возможно, учитывая, что вы следуете этому процессу:

У вас может быть приложение, написанное в Groovy или нет, но в конце, после запуска приложения у вас есть Groovy исходный код, который вы хотите выполнить. Затем он должен скомпилировать классы, вызвать dex непосредственно на устройстве, упакуйте результат в файл jar на локальную файловую систему, затем загрузите его с помощью специального загрузчика классов. Так почему это возможно, процесс очень сложный, а не простой, но что более важно, это значительно медленнее.

Я очень рад, что это действительно возможно, независимо от скорости. Здесь представлен пример проекта: https://github.com/melix/grooidshell-example.

К сожалению, я не очень понимаю этот процесс. У меня есть проект, который довольно мал, но я не уверен, где именно смотреть.

Можете ли вы указать мне в правильном направлении выполнение Groovy скриптов, встроенных в Java во время выполнения для Android?

Ответ 1

Посмотрите более внимательно на https://github.com/melix/grooidshell-example/blob/master/GroovyDroid/src/main/java/me/champeau/groovydroid/GrooidShell.java

Создайте экземпляр DexFile (строка 71), добавьте в компиляцию пост-код-почтовый процессор (строка 73), чтобы взять сгенерированные байты классов и перевести его в формат dex (строка 76) и, наконец, сохранить это в файле dexfile экземпляр (строка 77). Затем получите байт-код dalvik (строка 91), используйте DexClasLoader (строка 136) для загрузки классов dalvik/dex (строка 138).