Créer une librairie Android pour Unity avec Android Studio en 5 étapes

Introduction

Unity sur Android est très pratique et permet un grand nombre de chose. L'émulateur est en effet assez complet, pour pouvoir développer un jeu sans avoir besoin de fonctionnalités avancées de l'OS sur lequel le jeu tourne. Cependant, nous sommes parfois obligés de revenir à du code natif Android pour pouvoir jouir des fonctionnalités du système d’exploitation. Par exemple, si vous souhaitez intéragir avec les services ou lancer une app suite à un événement, ces derniers sont lancées directement depuis le manifeste et non pas dans l’émulateur Unity d’Android. Heureusement, depuis Unity 5 vous pouvez importer les librairies d’Android, au format .JAR ou.AAR.

Dans cette article, je vais créer une librairie android pour pouvoir lancer l'app au démarrage du système. Cela peut par exemple être pratique sur des casques de réalité virtuelle comme Oculus Go ou le Mirage Solo Daydream, où vous voulez restreindre l'accès qu'à votre application.

I - Créer votre code Android

Créer d’abord votre projet Android. Codez, faites ce pourquoi vous avez besoin d’un code Natif Android.

Par exemple dans mon cas, je devais lancer automatiquement l’app au démarrage. Pour cela j’ai enregistré un BrodcastReceiver dans le manifest. Dans ce BroadcastReceiver, j'ai ajouté:

  • la permission de recevoir l'intent qui indique que le démarrage a terminé: android.permission.RECEIVE_BOOT_COMPLETED
  • la priorité 999 (maximum), pour que l'intent soit traité par l'application le plus tôt possible
  • le nom avec le package de la classe à appeler.

AndroidManifest.xml

Extrait du AndroidManifest.xml

J'ai également ajouté au manifest la permission de savoir si le smartphone a fini de démarrer:

android:name="android.permission.RECEIVE_BOOT_COMPLETED"

J'ai créé le code java associé à mon broadcast receiver. Il est très simple vu qu'il suffit simplement de lancer l'activité principale d'Unity

BootUpReceiver - Android - Unity

BootUpReceiver.java

Avec la configuration précédente du manifest, la fonction onReceive() sera appelé lorsque le système Android a démarré.

Le code lance simplement l’activité CustomUnityActivity qui hérite de UnityPlayerActivity qui est l’activité conçue par Unity pour le player Android. Si vous exportez le projet Android Studio depuis Unity, vous verrez l'apparence de cette activité.

Le code de la classe CustomUnityActivity est rudimentaire, il sert juste à attester que nous pouvons hérité de l’activité du player Unity, pour rajouter des initialisations ou des fonctions qui serviront dans le jeu pour des appels systèmes. Par exemple, j’ai affiché un message - le fameux Toast sur Android - dans le onCreate qui va apparaît de manière brève sur le smartphone/casque VR:


CustomUnityActivity - Android - Unity

CustomUnityActivity.java

Et là vous allez me dire, mais d’où il sort ce com.unity3d.player.UnityPlayerActivity. Une librairie que t’as ajoutée et que t’as oubliée de nous dire ?

Ce à quoi je répond: Oui ! Belle transition vers la partie II


II - Ajouter la librairie “classes.jar” d’unity

Vous trouverez la librairie classes.jar à différents endroits selon votre système d'exploitation.

Sur Mac dans /Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono or il2cpp/Development or Release/Classes/

Sur Windows dans C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono or il2cpp\Development or Release\Classes\

Copier là dans votre projet android dans le dossier app/libs/

Synchroniser le gradle. Une fois cela fait, les erreurs que vous avez eu partie 2 sont maintenant résolvables car vous pouvez importer la classe UnityPlayerActivity.

https://docs.unity3d.com/Manual/AndroidUnityPlayerActivity.html



III - Transformez votre projet en une librairie Android

Il vous faut transformer ce projet Android Studio en une librairie aar en suivant ces 3 étapes sur le fichier build.gradle

  1. Changer (tout en haut) com.android.application en com.android.plugin 
  2. Supprimer versionCode, versionName et applicationId dans defaultConfig
  3. Supprimer toutes les dépendances qui vous servent à rien dans dependencies

A la fin, le fichier build.gradle doit ressembler à cette capture d'écran:

Gradle - Autostart Unity Android

Remarque: J’ai gardé la librairie AppCompat pour pouvoir avoir un splashScreen noir quand je lance l’application, ce qui fait une transition correcte vers le splashscreen d’Unity, qui apparait dans la version gratuite d'Unity.


IV - Faites un build de votre librairie

Compiler le projet sur Android Studio avec Build > Make Project

Si vous constatez quelque chose d’anormal, nettoyer le projet en faisant Build > Clean puis Build > Make Project

La librairie sera alors présente dans le dossiers build/outputs/aar


V - Importez-la dans Unity

Dans Unity, vous devez copier votre AndroidManifest.xml, et le app-debug.aar généré en étape IV, dans le dossier Assets/Plugins/Android de votre projet

Unity est sympathique: dans l’inspecteur quand vous cliquez sur l’insert, il vous l’importe directement, sans bronché. C’est seulement à l’exécution qu’il risque de broncher.

Compiler et lancer votre projet sur Android depuis Unity. Si vous êtes chanceux, ça marche du premier coup. Sinon, le gradle va vous énerver. Aussi, je vous conseille de vérifier les quelques erreurs communes soulevées dans la partie VI.


VI - Bonus (Résolution de quelques problèmes)

Le nom de package de l’application (dans PlayerSettings d’Unity) doit être différent de la librairie ! Sinon lorsque vous voudriez compiler votre projet Unity sur Android, Unity va vous lever l'erreur “Fail … aapt”

Si vous avez enlevé des librairies android à l'étape 2 (AppCompat, …) vérifiez que vous les utilisez effectivement plus dans la librairie, autrement il va vous lever une erreur indiquant “mergeDex Resources failed !”


Article publié le 19/09/2019 à 23:38 par Jérôme



Consulter plus d'articles de Histoires de développeurs