2010-08-06 8 views
27

Je suis intéressé par l'intégration de Scala (ou d'un autre langage JVM non-Java) dans la plate-forme android. Je ne parle pas d'écrire une application android avec Scala, ce que j'ai fait tôt le matin, mais en train de m'intégrer dans le processus de construction qui construit l'arbre source de la plateforme android. J'imagine que ce sera une question d'accrocher dans les makefiles et autres. Quelqu'un a-t-il un aperçu de cela?Comment intégrer Scala dans la plate-forme Android de base?

Ce que j'ai jusqu'à présent: La source plate-forme treefrom git: //android.git.kernel.org/platform/manifest.git construit sous sa forme vierge, guidée par « [Télécharger et construire le Google Android ] [1] »

  • build/core/combo/scalac.mk # Configure variables liées compilateur scala, inclus par config.mk
  • définitions ont été ajoutées dans la construction/core/definitions.mk pour un tout-subdir -scala-files et un tous-scala-fichiers-sous
  • Ajout de la définition dans definitions.mk pour construire le scal un des fichiers tels qu'ils sont inclus dans le package

Ce qui reste:

  • Inclure scala-library.jar
  • assurer que les changements à -bootclasspath n'a rien
  • cassé la figure en comment gérer le cas où les classes scala dépendent des classes java et vice versa
  • Nettoyage majeur du code
  • Test!
  • Figure quoi faire (autres que simplement les afficher ici) avec les changements que je l'ai fait

On dirait que je suis presque là !!!

Quelques notes du passé

Dernières: J'ai trouvé où les fichiers source Java sont compilés! Dans definitions.mk, voir 'define transform-java-to-classes.jar'. La dernière idée consiste à écrire une définition transform-scala-to-classes, puis de stocker ces classes directement dans le package. J'appellerai transform-scala-to-class juste avant cette étape dans transform-java-to-classes.jar. La prise en charge d'eclipse et de cygwin sera pour l'instant supprimée car elle encombre le code avec des solutions de contournement et augmente donc mes chances d'échec. Le processus de construction commence par la racine Makefile en cours d'exécution build/core/main.mk build/core/main.mk inclut build/core/config.mk qui inclut build/core/combo/javac.mk qui définit HOST_JAVAC, TARGET_JAVAC et COMMON_JAVAC. COMMON_JAVAC est la "commande du compilateur Java avec des arguments communs", par le fait que les deux autres variables obtiennent ces valeurs par défaut, sauf dans un environnement spécial (openjdk ou eclipse). COMMON_JAVAC n'est pas utilisé en dehors de ce fichier. Les deux autres ne sont utilisés que dans build/core/definitions.mk.

build/core/java_library.mk (inclus par config.mk) ne semble concerner que les bocaux de construction. C'est hors de notre champ d'action. Toute interaction avec des jars suppose des fichiers de classe qui présupposent que nous avons déjà réussi à construire nos fichiers de scala.

Il y a des contrôles dans main.mk concernant la version de java. Nous allons les ignorer et supposer que notre version de scala est compatible. En ce moment (dans combo/scalac.mk) j'utilise le même --argarget utilisé dans javac.mk. Cela devrait peut-être être stocké dans une variable. Main.mk comprend également build/core/definitions.mk qui à son tour définit certaines fonctions utiles. Celui qui nous intéresse ici est all-java-files-under et all-subdir-java-files. Ce dernier est utilisé dans les fichiers Android.mk pour trouver les fichiers java. Le premier est utilisé dans la mise en œuvre de ce dernier. J'écrirai des équivalents Scala d'eux.

Pour comprendre comment fonctionne le processus de construction, je lance make avec -n et d'autres. J'ai trouvé cette idée dans l'article de stackoverflow "[Tool for debugging makefiles] [2]". J'étudie également le débogage avec remake. Build/core/{config.mk, definitions.mk} nous permet de savoir quels sont les fichiers/commandes utilisés pour faire quoi.

Comme un moyen possible de piratage à l'appui sur une base par projet, le code supplémentaire pourrait très probablement être ajouté au fichier Android.mk du projet. De plate-forme/build/core/build-system.html nous lisons "Android.mk est le nom standard pour les fragments makefile qui contrôlent la construction d'un module donné.Seul le répertoire supérieur doit avoir un fichier nommé" Makefile "." Vous pouvez créer une nouvelle cible comme "scala-build" et l'exécuter (make PackageName scala-build) avant la création finale. On pourrait peut-être aussi le cacher discrètement dans une assignation de variable, atténuant le besoin d'une cible à appeler explicitement.

Une autre façon (beaucoup plus hackish) est de détourner la commande utilisée pour javac. Ceci est défini dans build/core/combo/javac.mk. Le fichier Android.mk de votre projet devra inclure les fichiers * .scala dans LOCAL_SRC_FILES avec les fichiers * .java.

+0

Je voudrais poser à ce sujet sur la liste de diffusion du bâtiment android. https://groups.google.com/group/android-building –

Répondre

7

Les gars sur reddit disent, il y a un tutoriel sur l'intégration Scala dans Android avec ant here.

+0

Je vais essayer. Merci! – Octoberdan

+0

@Octoberdan si vous pouviez notifier ce fil de votre progression, cela aurait été vraiment cool. – folone

+0

J'étais parti pour le week-end, mais je viens de rentrer. Je n'aurai pas le temps d'essayer jusqu'à demain. Je vais certainement vous le faire savoir! – Octoberdan

Questions connexes