Sono interessato ad integrare Scala (o qualche altro linguaggio JVM non Java) nella piattaforma Android. Non mi riferisco alla scrittura di un'applicazione Android con Scala, che ho fatto all'inizio, ma che in realtà mi ha coinvolto nel processo di compilazione che costruisce l'albero dei sorgenti della piattaforma Android. Immagino che si tratterà di aggancio ai makefile e così via. Qualcuno ha idea di questo?Come integrare Scala nella principale piattaforma Android?
Quello che ho finora: GIT piattaforma sorgente treefrom: //android.git.kernel.org/platform/manifest.git costruita nella sua forma vergine, guidato da "[Download e costruire l'Android di Google ] [1]"
- build/core/combo/scalac.mk # Configura variabili Scala compilatore correlati, inclusi da config.mk
- definizioni aggiunti in build/core/definitions.mk per un all-subdir -scala-files e un file all-scala-sotto
- Aggiunta la definizione in definition.mk per costruire la scala un file in modo tale che essi sono inclusi nel pacchetto
Che cosa è rimasto:
- Includere scala-library.jar
- Assicurarsi modifiche -bootclasspath non si è rotto niente
- Capire come gestire il caso in cui le classi scala dipendono da classi java e viceversa
- Maggiore pulizia del codice
- Test!
- Capire cosa fare (diversi dal semplice pubblicandoli qui) con i cambiamenti che ho fatto
sembra che sto quasi arrivati !!!
Alcune note del passato
Ultimo: ho trovato in cui i file di origine Java sono compilati! In definitions.mk, vedi 'define transform-java-to-classes.jar'. L'idea più recente è quella di scrivere una definizione di trasformazione da scala a classi e poi memorizzarla direttamente nel pacchetto che viene impacchettato. Chiamerò transform-scala-to-class proprio prima di questo passaggio in transform-java-to-classes.jar. Il supporto per eclipse e cygwin per ora verrà eliminato poiché ingombra il codice con soluzioni alternative e aumenta quindi le possibilità di errore.
Il processo di compilazione inizia dalla radice Makefile in esecuzione build/core/main.mk build/core/main.mk include build/core/config.mk che include build/core/combo/javac.mk che configura HOST_JAVAC, TARGET_JAVAC e COMMON_JAVAC. COMMON_JAVAC è il "comando del compilatore Java con argomenti comuni", dall'aspetto le altre due variabili ottengono questi valori per impostazione predefinita, a meno che non siano in un ambiente speciale (openjdk o eclipse). COMMON_JAVAC non è utilizzato al di fuori di questo file. Gli altri due sono usati solo in build/core/definitions.mk.
build/core/java_library.mk (incluso da config.mk) sembra riguardare solo la costruzione di vasi. Questo è fuori dalla portata di noi premurosi. Qualsiasi interazione con giare presuppone file di classe che presuppongono che abbiamo già avuto successo nella costruzione dei nostri file di scala.
Sono presenti verifiche in main.mk relative alla versione di java. Ignoreremo questi e supponiamo che la nostra versione di scala sia compatibile. In questo momento (in combo/scalac.mk) sto usando lo stesso argomento --target usato in javac.mk. Questo dovrebbe forse essere memorizzato in una variabile.
main.mk include anche build/core/definitions.mk che a sua volta definisce alcune funzioni utili. Quello che ci interessa qui è tutto-java-files-under e all-subdir-java-files. Quest'ultimo viene utilizzato nei file di Android.mk per trovare i file java. Il primo è utilizzato nella realizzazione di quest'ultimo. Scriverò equivalenti Scala di loro.
Per capire come funziona il processo di compilazione, ora sto eseguendo make con -n e altri. Ho avuto questa idea dall'articolo StackOverflow "[Tool for debugging makefiles] [2]". Sto anche studiando il debugging con remake.
build/core/{config.mk, definitions.mk} ci dà luce su quali file/comandi vengono usati per fare cosa.
Come possibile metodo di hacking in supporto per basi di progetto, il codice aggiuntivo potrebbe molto probabilmente essere aggiunto al file Android.mk del progetto. Dalla piattaforma/build/core/build-system.html leggiamo che "Android.mk è il nome standard per i frammenti di makefile che controllano la costruzione di un determinato modulo: solo la directory principale dovrebbe avere un file chiamato" Makefile "." Potresti creare un nuovo bersaglio come "scala-build" ed eseguirlo (fai di PackageName scala-build) prima del make finale. Si potrebbe forse anche nasconderlo subdolo in un incarico variabile, mitigando la necessità che un obiettivo venga chiamato esplicitamente.
Un altro modo (molto più "hackish") è quello di dirottare il comando utilizzato per javac. Questo è impostato in build/core/combo/javac.mk. Il tuo Android.mk del progetto dovrà includere file * .scala in LOCAL_SRC_FILES insieme ai file * .java.
Vorrei chiedere informazioni sulla mailing list dell'edificio Android. https://groups.google.com/group/android-building –