2013-07-09 3 views
9

Я пробовал использовать вещи на Janino на Android и пришел к выводу, что они просто не работают в VM Dalvik.Компиляция строки как кода во время выполнения на Android

Итак, я просто задаю простой вопрос: Android. Можно ли скомпилировать строку, содержащую код во время выполнения, для использования в приложении. Если да, есть ли библиотеки, которые позволяют мне это делать и/или вы можете поделиться примером кода, как это сделать?

Для (очень простой) Например, если у меня был объект строки, содержащее следующее:

public class Adder{ 

    int x; 
    int y; 

    public Adder(int x,int y) { 
    this.x = x; 
    this.y = y; 
    } 

    public int add() { return x+y;} 

} 

как один гигантская линия строки. Есть ли способ обработать его, чтобы создать экземпляр объекта Adder, чтобы я мог вызвать метод add(), скажем, через Reflection API?

Редактировать Я пробовал интерпретацию beanshell, но это оказалось слишком медленным. Im ищет что-то немного быстрее, так же, как Janino

ответ

7

ImagePlayground - приложение для Android с открытым исходным кодом, которое делает это с использованием Dexmaker и пользовательского языка программирования.

5

Вы могли бы взглянуть на dexmaker: https://github.com/crittercism/dexmaker

Это, как представляется, Android дружеский эквивалентно ASM или CGLIB; он генерирует файлы .dex вместо файлов .class.

+1

Ive просмотрел свою документацию, но понятия не имеет, как я смогу использовать его для компиляции строки кода в качестве кода. Из того, что кажется (по крайней мере, на примере приветствия), я не смогу использовать его для компиляции строк. Я подчеркиваю часть строки, потому что пользователю нужно создать математическое выражение, которое необходимо скомпилировать и оценить до двойника. – sourdesi

+2

Yikes, динамически компилируя введенные пользователем данные, звучит как жесткая гайка для взлома. Вам нужно будет разобрать эту строку для кусков, чтобы построить и использовать метод «уравнения», используя dexmaker. т.е. «2 * 4/6». Вы могли бы определенно использовать dexmaker для динамического построения метода, а затем запустить его, но было бы неплохо попытаться проанализировать «на лету». Если бы у вас был доступ к мосту Java-> JS, вы могли бы использовать что-то вроде mathjs (http://mathjs.org/), но даже это только оценило бы то, что было подано в него, а не проанализировало его. – Durandal

+0

Да, его прослушивали меня уже неделю. Я прошел через все от компиляторов до экспертов по оценке выражений на языках сценариев, и все было слишком медленным или не работало. Я еще не потерял надежду, хотя я нашел способ – sourdesi

2

В принципе, вам нужен компилятор Java/Dalvik, который вы можете запрограммировать программно, аналогично Java javax.tools. Короткий ответ заключается в том, что это невозможно.

+1

Почему вы говорите, что это невозможно? – danfuzz

+0

Видимо я ошибаюсь. Но не будет ли возможность генерировать и запускать код во время выполнения, имеют серьезные последствия для безопасности?Было бы очень интересно узнать, что делает Android для смягчения любых потенциальных проблем. – Kai

+1

Модель безопасности Android основана на процессах как единице доверия и изоляции. Таким образом, не имеет значения, что процесс может загружать новый код сам по себе. Вот почему собственный (не VM) код приложения на Android не изменяет свойства безопасности системы. Риск безопасности заключается в том, что вы можете обмануть системный процесс (то есть, привилегированный процесс) для запуска плохого кода. Однако это не имеет никакого отношения к виртуальной машине как таковой (поскольку, например, плохой код может быть родным кодом). – danfuzz

Смежные вопросы