====== Diverses Notes sur Android ====== ==== Android en ligne de commande ==== En m'inspirant des blogs : * http://blog.rom1v.com/2012/03/android-en-ligne-de-commande/ * http://blog.freelan.org/2010/11/22/developper-pour-android-sans-utiliser-eclipse/ * http://dmathieu.com/articles/development/deploy-an-android-application/ Commençons par télécharger les //tools// Android. Notons que c'est la seule manière actuellement d'installer le SDK sans installer l'IDE Android Studio. cd /opt wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip unzip tools_r25.2.3-linux.zip cd tools plus quelques dépendances (à compléter...) : sudo apt-get install openjdk-8-jdk ant Nous allons maintenant lancer le //Android SDK Mananger// : android Commençons par installer le dernier SDK et le NDK et d'autres trucs déjà présélectionnés qu'il faut installer ou mettre à jour. == HelloWorld == Créons maintenant un petit projet HelloWorld : android create project --target 1 --name HelloWorld --path ./HelloWorld \ --activity HelloWorldActivity --package com.example.myandroid Ou en plus court : android create project -t 1 -n HelloWorld -p ./HelloWorld -a HelloWorldActivity -k com.orel.helloworld Pour connaître la liste des //targets// disponibles, il faut lancer la commande : android list targets # ici, nous utilisons la target 1 ou "android-25" Ensuite, on peut compiler notre petit projet simplement avec Ant : cd HelloWorld ant # pour voir toutes les cibles disponibles dans build.xml ant clean ant debug # pour compiler le projet en debug... Le fichier APK (Android Application Package) sera créé à l’emplacement : HelloWorld/bin/HelloWorld-debug.apk == Déploiement sur son smartphone == Pour déployer, l'application HelloWorld sur son smartphone, il faut le brancher en USB et activer le //Débogage USB//. Pour ce faire, il faut commencer par passer son smartphone en //mode développeur// : dans les Paramètres / A propos de l'appareil / Infos Logiciel, puis cliquez 6 fois sur le "Numéro de Version". Un nouveau menu "Option de développement" apparaît alors dans les Paramètres de votre smartphone. Ce dernier vous permet alors d'activer le //Débogage USB//. On peut alors vérifier que le //device// (smartphone ou émulateur) est bien visible : adb devices Si un seul device est visible, le déploiement de l'application Android peut s'effectuer tout simplement avec la commande suivante : ant debug install == Utilisation de l'émulateur == Il faut commencer par créer un AVD (Android Virtual Device) en lançant la commande : android avd Dans la fenêtre qui s’ouvre, cliquer sur "New", puis configurer le smartphone (Nexus5, x86, API level 25, ...) et lui donner un nom, //MyPhone//. Sa configuration est sauvegardée dans ~/.android/avd/MyPhone.avd/ Pour lancer l'émulateur, il suffit de taper la commande : emulator -avd MyPhone On peut alors vérifier que le device (smartphone ou émulateur) est bien visible : adb devices Si un seul device est visible, le déploiement de l'application Android peut s'effectuer avec la commande suivante : ant debug install On peut également effectuer le déploiement manuellement sur l'émulateur avec la commande //adb// (Android Device Bridge) : adb -e install bin/HelloWorld-debug.apk # -e for emulator adb -e uninstall com.orel.helloworld Pour info, le nom du package "com.orel.helloworld" est indiqué dans le fichier //AndroidManifest.xml//. Pour démarrer l'application manuellement : adb shell am start -a android.intent.action.MAIN -n com.orel.helloworld/.HelloWorldActivity ==== Utilisation de Gradle ==== Gradle est la nouvelle chaîne de compilation Android qui vise à remplacer Ant : Pour générer un projet Android basé sur Gradle plutôt que Ant, il faut utiliser l'option "-g" : android create project -p HelloWorld -t 1 -n HelloWorld -k com.orel.helloworld -a HelloWorld -g -v 2.2.3 avec 2.2.3 la version appropiée du plugin Gradle. Après quoi, on utilise le script //gradlew// pour compiler, etc. gradlew build gradlew assembleDebug __Attention__ : Le code généré n'est pas tout à fait correct pour la version 2.2.3 du plugin Gradle ! Voici donc quelques modifications nécessaires des sources générés pour que ça tombe en marche :-( * Dans le fichier build.gradle, dans la section "release", remplacer la ligne "runProguard false" par "minifyEnabled true". * Dans le fichier build.gradle, dans la section "repositories" remplacer la ligne "mavenCentral()" par "jcenter()" * Dans le fichier gradle/wrapper/gradle-wrapper.properties, mettre le champs "distributionUrl" à la valeur "https\:%%//%%services.gradle.org/distributions/gradle-2.14.1-all.zip". Voir ici, pour plus de détails : * https://developer.android.com/studio/build/building-cmdline.html * http://eqdn.tech/android-development-on-the-command-line ==== Test du NDK==== // Quelques notes encore en vrac...// Pour faire au plus simple, j'ai installé l'environnement de développement Android Studio, qui contient le SDK et permet de facilement installer le NDK. Ensuite, je travaille en ligne de commande ! Pour utiliser les exemples NDK avec Gradle en ligne de commande, il faut positionner les variables d'environnement ANDROID_HOME et ANDROID_NDK_HOME sur les installations locales de SDK et du NDK respectivement. export ANDROID_HOME=/opt/Android/sdk export ANDROID_NDK_HOME=/opt/Android/sdk/ndk-bundle export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_NDK_HOME Ensuite on peut tester un petit exemple... git clone https://github.com/googlesamples/android-ndk.git cd android-ndk/native-activity ./gradlew assembleDebug Puis on effectue le déploiement avec l'emulateur... emulator -avd MyPhone abd devices ./gradlew installDebug (...) Pour ajouter du code C/C++ à son projet Android : https://developer.android.com/studio/projects/add-native-code.html A propos de NativeActivity : * https://developer.android.com/reference/android/app/NativeActivity.html * https://developer.android.com/ndk/samples/sample_na.html * https://github.com/googlesamples/android-ndk/tree/master/native-activity A propos de NDK : * https://developer.android.com/ndk/index.html * https://developer.android.com/ndk/guides/index.html * http://www3.ntu.edu.sg/home/ehchua/programming/android/android_ndk.html Les exemples classiques : * Exemples avec Gradle : https://github.com/googlesamples/android-ndk * Exemples avec Android.mk (ndk-build system) : https://github.com/googlesamples/android-ndk/tree/android-mk Pour récupérer les exemples classiques via github : git clone https://github.com/googlesamples/android-ndk.git # branch master git clone -b android-mk https://github.com/googlesamples/android-ndk.git # branch android-mk ====Android et SDL2 ==== On positionne correctement son environnement... export ANDROID_HOME=/opt/Android/sdk export ANDROID_NDK_HOME=/opt/Android/sdk/ndk-bundle export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_NDK_HOME Ensuite, on va récupérer SDL2 et préparer notre petite coquille en suivant ce tutoriel : http://www.dinomage.com/2013/01/howto-sdl-on-android/ cd /opt wget http://www.libsdl.org/release/SDL2-2.0.5.zip unzip SDL2-2.0.5.zip cp -rf SDL2-2.0.5/android-project my-android-project cd my-android-project ln -s /opt/SDL2-2.0.5 jni/SDL Commençons par mettre à jour le fichier "build.properties" en indiquant la //target// API que vous avez installé, "android-25" dans mon cas. Dans le fichier "jni/src/Android.mk", remplacez "YourSourceHere.c" par [[ http://www.dinomage.com/wp-content/uploads/2013/01/main.c | main.c ]] et ajoutez le fichier [[http://www.dinomage.com/wp-content/uploads/2013/01/image.bmp | image.bmp ]] dans un sous-répertoire 'assets'. Notez que les données contenues dans ce répertoire seront accessibles dans votre APK. cp main.c jni/src mkdir assets ; cp image.bmp assets/ On compile et on installe tout ça... ndk-build ant debug emulator -avd MyPhone ant debug install Et ça marche !!! ==== Biblio ==== * SDL : https://wiki.libsdl.org + http://www.libsdl.org/ * https://hg.libsdl.org/SDL/file/ba1da2658d76/docs/README-android.md * Download SDL2 : http://www.libsdl.org/download-2.0.php * Quelques Tutoriels sur SDL : https://wiki.libsdl.org/Tutorials * Premier Tutoriel sur Android+SDL * Part 1 : http://www.dinomage.com/2013/01/howto-sdl-on-android/ * Part 2 : http://www.dinomage.com/2013/05/howto-sdl-on-android-part-2-platform-details/ * Part 3 : http://www.dinomage.com/2013/05/howto-sdl-on-android-part-3-native-libraries/ * Second Tutoriel sur Android+SDL * Part 1 : http://blog.stuff-o-matic.com/post/2013/09/07/Porting-a-C-game-to-Android%2C-the-case-of-Andy-s-Super-Great-Park * Part 2 : http://blog.stuff-o-matic.com/post/2013/09/15/ASGP-s-Android-Port-Part-II%3A-from-SDL-1.2-to-SDL-2. * Part 3 : http://blog.stuff-o-matic.com/post/2013/10/08/ASGP-s-Android-Port-Part-III%3A-from-OpenGL-Direct-Mode-to-GLES * Part 4 : http://blog.stuff-o-matic.com/post/2013/10/20/ASGP-s-Android-Port-Part-IV%3A-building-the-APK * Troisième tutoriel : http://lazyfoo.net/tutorials/SDL/52_hello_mobile/index2.php * Wiki SDL+Android : https://wiki.libsdl.org/Android * OpenGLES : http://www.learnopengles.com/calling-opengl-from-android-using-the-ndk/ * Test Android + SDL/OpenGLES : https://wiki.libsdl.org/Android#SDL_wrapper_for_simple_programs (Section 3.1)