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 l'Application Launcher du smartphone (“android.intent.category.LAUNCHER”).
<?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>
<?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.
<?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.
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 :
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) :
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
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 :
<?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