2013-07-09 16 views
9

Ho provato a utilizzare le cose su Janino su Android e ho concluso che semplicemente non funzionano all'interno della VM Dalvik.Compilazione di String come codice durante il runtime su Android

Quindi, sto solo facendo una semplice domanda: su Android, è possibile compilare una stringa contenente codice durante il runtime per l'utilizzo all'interno dell'applicazione. Se è così, ci sono delle librerie che mi permettono di farlo e/o puoi condividere un esempio di codice su come farlo?

Per (molto semplice) esempio, Se avessi un oggetto String contenente il seguente:

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

} 

Come una linea gigante di corda. C'è un modo in cui posso elaborarlo per creare un'istanza di un oggetto Adder in modo da poter chiamare il metodo add(), ad esempio, tramite l'API Reflection?

Modifica Ho provato l'interpretazione del beanshell ma si è rivelato troppo lento. Im che cerca di qualcosa di un po 'più veloce, proprio come Janino

risposta

7

ImagePlayground è un'app Android open source che utilizza questo Dexmaker e un linguaggio di programmazione personalizzato.

5

Si potrebbe dare un'occhiata a dexmaker: https://github.com/crittercism/dexmaker

Sembra essere un equivalente amichevole Android per ASM o cglib; genera file .dex invece di file .class.

+1

Ive ha esaminato la documentazione ma non ha idea di come sarei in grado di utilizzarlo per compilare una stringa di codice come codice. Da quello che sembra (almeno nell'esempio del mondo ciao), non sarò in grado di usarlo per compilare effettivamente le stringhe. Sottolineo la parte di stringa perché l'utente deve creare un'espressione matematica che deve essere compilata e valutata in un doppio. – sourdesi

+2

Yikes, la compilazione dinamica dei dati immessi dall'utente sembra un duro da spezzare. Dovresti analizzare quella stringa per i pezzi da costruire e il metodo di "equazione" usando Dexmaker. es. "2 * 4/6" Si potrebbe sicuramente usare dexmaker per costruire dinamicamente un metodo e poi eseguirlo, ma sarebbe abbastanza incline a provare e analizzare al volo in quel modo. Se tu avessi accesso a un ponte Java-> JS potresti essere in grado di usare qualcosa come mathjs (http://mathjs.org/) ma anche solo valutare ciò che è stato inserito in esso, non analizzarlo. – Durandal

+0

Sì, mi ha infastidito per una settimana. Ho passato tutto da compilatori a valutatori di espressioni a linguaggi di scripting e tutto era troppo lento o non funzionava. Non ho ancora perso la speranza, però, troverò un modo di fare. – sourdesi

2

Fondamentalmente si desidera un compilatore Java/Dalvik che sia possibile richiamare a livello di programmazione, in modo simile a Java javax.tools. La risposta breve è che non è possibile la corrente.

+1

Perché dici che non è possibile? – danfuzz

+0

Apparentemente mi sbaglio. Ma la capacità di generare ed eseguire codice in fase di esecuzione non avrebbe gravi implicazioni in termini di sicurezza?Sarebbe molto interessato a sapere cosa fa Android per mitigare eventuali problemi potenziali. – Kai

+1

Il modello di sicurezza di Android si basa sui processi come unità di fiducia e isolamento. In quanto tale, non importa che un processo possa caricare un nuovo codice, di per sé. Questo è il motivo per cui il codice dell'applicazione nativo (non VM) su Android non modifica le proprietà di sicurezza del sistema. Il rischio per la sicurezza è se si può ingannare un processo di sistema (cioè un processo privilegiato) nell'esecuzione di codice non valido. Tuttavia, ciò non ha nulla a che fare con la VM di per sé (poiché il codice errato potrebbe essere il codice nativo, ad esempio). – danfuzz