This is an old revision of the document!
Table of Contents
Android
L'objectif de ce petit tutoriel est de développer des applications Android en ligne de commande…
Installation
Nous allons commencer par installer le kit de développement Android, les Tools , le NDK et Gradle.
mkdir /opt/Android/ cd /opt/Android wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip wget https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip wget https://services.gradle.org/distributions/gradle-3.3-all.zip unzip *.zip
Nous allons maintenant poursuivre l'installation avec le SDK Manager, en installant principalement le SDK (API 25). Attention à ne pas oublier d'accepter les licences au moment de l'installation !
tools/android sdk &
Puis, on positionne toutes les variables d'environnement nécessaires : source env.sh.
- env.sh
ROOT=/opt/Android export ANDROID_HOME=$ROOT export GRADLE_HOME=$ROOT/gradle-3.3 export ANDROID_NDK_HOME=$ROOT/android-ndk-r13b export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_NDK_HOME:$GRADLE_HOME/bin
Installation avec Android Studio
Une alternative facile à tout ce merdier consiste à installer Android Studio , dont le SDK Manager (plus puissant) permet d'installer tous les outils nécessaires comme Gradle, NDK, CMake, etc.
mkdir /opt/Android/ cd /opt/Android wget https://dl.google.com/dl/android/studio/ide-zips/2.2.3.0/android-studio-ide-145.3537739-linux.zip unzip android-studio-ide-*-linux.zip cd android-studio/bin ./studio.sh
Une fois l'IDE installée, si l'on souhaite utiliser le NDK (Native Development Kit), il faut installer quelques outils supplémentaires via le menu Tools/Android/SDK Manager : LLDB, CMake et NDK. Puis, on positionne toutes les variables d'environnement nécessaires : source env.sh.
- env.sh
ROOT=/opt/Android export ANDROID_HOME=$ROOT/sdk export ANDROID_NDK_HOME=$ROOT/sdk/ndk-bundle export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_NDK_HOME
Tutoriels
Hello World from Scratch
Considérons un petit exemple Android minimaliste, HelloWorld ! Je me suis librement inspiré de plusieurs tutoriels :
Notre projet HelloWorld nécessite quelques fichiers organisés selon l'arborescence suivante (helloworld-v1.zip) :
├── build.gradle └── src └── main ├── AndroidManifest.xml ├── java │ └── org │ └── hello │ └── HelloActivity.java └── res ├── drawable │ └── icon.png ├── layout │ └── mylayout.xml └── values └── strings.xml
Le fichier AndroidManifest.xml contient les informations de haut-niveau de l'application Android. Dans ce cas, l'application a pour label la valeur définie dans le fichier ressource “res/values/strings.xml”, c'est-à-dire “MyHelloWorld”. Et son icône est définie par le fichier ressource “res/drawable/icon.png” (au format hdpi, 72 x 72 px). Son activity est défini dans la classe HelloActivity du package org.hello. La section intent-filter précise qu'il s'agit de l'activity principale initiant notre application (“android.intent.action.MAIN”), qui sera affichée dans le launcher du smartphone (“android.intent.category.LAUNCHER”).
- src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.hello" android:versionCode="1" android:versionName="1.0.0" > <application android:label="@string/app_name" android:icon="@drawable/icon"> <activity android:name=".HelloActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
- res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">MyHelloWorld</string> </resources>
Le fichier mylayout.xml est un fichier XML qui décrit le layout de votre activity, c'est-à-dire l'agencement de l'interface graphique de votre application. Celle-ci contient essentiellement composé d'un TextView et d'un Button. Le champs id permet de faire référence au TextView dans le code grâce à la méthode findViewById(). Concernant le Button, on définit une methode callback sayHello() qui sera appelé sur l'évènement onClick.
- src/main/res/layout/mylayout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/mytextview" android:layout_centerInParent="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Click the Button" /> <Button android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="Button" android:onClick="sayHello"/> </LinearLayout>
La classe HelloActivity (du fichier HelloActivity.java) définit le point d'entrée de notre application Android (ou plutôt de son activity principale). La compilation génère une classe R.java qui fait référence le layout R.layout.mylayout et ses identifiants comme R.id.mytextview. Notons que tous les éléments visuels comme Button ou TextView hérite de la classe View.
- src/main/java/org/hello/HelloActivity.java
package org.hello; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.view.View; public class HelloActivity extends Activity { private TextView textview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylayout); textview = (TextView) findViewById(R.id.mytextview); } @Override public void onStart() { super.onStart(); } public void sayHello(View view) { textview.setText("Hello World!"); } }
Nota Bene :
- Structure du Projet : https://developer.android.com/studio/projects/index.html
- Version du plugin Gradle : https://developer.android.com/studio/releases/gradle-plugin.html
- Syntaxe du fichier build.gradle : https://developer.android.com/studio/build/index.html
- Intro au fichier AndroidManifest.xml : https://developer.android.com/guide/topics/manifest/manifest-intro.html
Compilation avec Gradle
A la racine du projet, le fichier build.gradle permet à l'outil Gradle de construire votre application Android. Voici donc le fichier minimaliste mis à jour pour utiliser la version du SDK (25), des build-tools (25.0.2) et du plugin Gradle 2.2.3 compatible à la version de Gradle que j'ai installé (3.3) :
- build.gradle
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' } } apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" }
Pour compiler tout ça et le déployer sur un émulateur MyPhone (en supposant que vous avez déjà configuré le device MyPhone grâce à la commande android avd), il faut :
emulator -avd MyPhone gradle installDebug
Il ne reste plus qu'à démarrer l'application HelloWorld sur votre émulateur… Et c'est tout !
Afin de pouvoir compiler l'application sans Gradle installé sur une machine, il est recommandé d'utiliser Gradle Wrapper qui génére un script d'installation portable (gradlew).
gradle wrapper ./gradlew installDebug
Compilation avec Ant
Si l'on préfère utiliser l'outil Ant plutôt que Gradle pour compiler son application Android, il n'y a pas grand chose qui change… En gros, il faut écrire un fichier build.xml pour Ant (à la place de build.gradle) et modifier un peu l'organisation du projet, comme indiqué ci-dessous (helloworldant-v1.zip).
├── AndroidManifest.xml ├── build.xml ├── res │ ├── drawable │ │ └── icon.png │ ├── layout │ │ └── mylayout.xml │ └── values │ └── strings.xml └── src └── org └── hello └── HelloActivity.java
Voici donc un fichier build.xml minimaliste pour notre projet :
- build.xml
<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorldAnt" default="help"> <property name="target" value="android-25" /> <property environment="env" /> <property name="sdk.dir" value="${env.ANDROID_HOME}" /> <import file="${sdk.dir}/tools/ant/build.xml" /> </project>
Et c'est tout… Il ne reste plus qu'à compiler ce projet. Attention à ne pas oublier de positionner la variable d'environnement ANDROID_HOME.
ant debug install