Développer des applications Android sous linux

J’ai eu une envie subite pour le fun de voir comment programmer une application Android sous linux. En fait ça vient du fait que je suis incapable de trouver une bête application, évidemment gratuite, pour écouter de la musique où on puisse créer une liste de lecture en cochant des titres trouvés sur la carte SD ou dans sa mémoire interne et qu’on puisse trier sur la base de critères assez simples. Alors tant qu’à faire on n’est jamais mieux servi que par soi même.

Je me rends compte que tout est fait pour faciliter ce développement, l’environnement de développement (Software Development Kit SDK) est très simple à installer, y compris sous linux. Ensuite il faut évidemment avoir quelques bases de programmation. On trouve sur internet, un tas de sites qui expliquent comment faire votre propre application, mais ils ne vont vraiment pas loin, ils se contentent d’aller jusqu’au Hello World et puis c’est tout ! J’ai repéré ce site francophone sur OpenClassRooms qui est vraiment excellent en approfondissant de manière très didactique le sujet. Ce post en anglais est également très fouillé et réellement utile.

Niveau programmation ça m’a rappelé ma jeunesse quand je pissais du code en C en utilisant les toolkits Motif/X11 pour construire son interface graphique, ça ne doit pas dire grand chose aux jeunes mais c’est la bibliothèque graphique de la grande époque d’UNIX qui a inspiré GTK+ et Qt, les bibliothèques de base respectives de Gnome et de KDE. On retrouve les mêmes principes, on définit des widgets dans un environnement de développement wysiwig, puis les évènements (callbacks) qui vont avec.

En attendant une page dédiée sous mon site Funix, pour en revenir à l’installation sous linux, on récupèrera le SDK android par , ainsi qu’un moteur JAVA dans sa version 7 par ici. On commence par installer java en tapant

urpmi jdk-7u79-linux-x64.rpm

Pour le SDK on décompresse l’archive zip en tapant

unzip android-studio-ide-141.2456560-linux.zip

cela donne le répertoire android-studio on lance l’exe qui sous bin

./studio.sh

si vous avez cette erreur

Please ensure JAVA_HOME points to JDK rather than JRE

Éditez votre fichier .bashrc et rajoutez (il faut mettre le chemin absolu de JAVA)

export JAVA_HOME=/usr/java/jdk1.7.0_79

et pour prendre en compte la modification on tape source ~/.bashrc

Pour la suite des opérations et de configuration, il y a tout un tas de sites qui décrivent très bien la configuration initiale d’Android Studio par exemple toujours celui d’OpenClassRooms ici. A un moment on se rend compte que pour lancer un périphérique virtuel (Android Virtual Device) il faut disposer de KVM (Kernel-based Virtual Machine) et d’un noyau linux compatible permettant de faire tourner plusieurs systèmes d’exploitation sur la même machine, c’est également ce qu’on appelle de la virtualisation. Pour savoir si votre noyau est compatible, on tape:

egrep ‘^flags.*(vmx|svm)’ /proc/cpuinfo

voilà le résultat avec un noyau compatible

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt

maintenant sous Mageia 5 on installe KVM en tapant simplement urpmi kvm. On relance le PC, ce n’est pas fini ! Il faut aller dans le bios, sur mon portable ThinkPad x220 j’ai une option Virtualization et j’ai mis à enabled les options Intel (R) Virtualization technology et Intel (R) VT-d Feature. Voilà à quoi ressemble l’environnement de développement

Voilà le programme que j’ai tapé, je suis parti des sources du programme Hello World par défaut et je me suis inspiré des sites cités plus haut. Les puristes et ayatollahs de la programmation m’excuseront, mais ça fait des années (pour ne pas dire des décennies) que je n’ai pas programmé et en plus je découvre totalement la programmation Android ! J’ai tout simplement construit une interface qui permet de saisir un chiffre qu’on multiplie par 2 ensuite, c’est tout bête ! Voilà le fichier principal avec l’implantation des callbacks

import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.text.TextWatcher;
import android.text.Editable;

public class MainActivity extends AppCompatActivity {

private final String defaut = « Vous devez cliquer sur le bouton pour obtenir un résultat. »;
Button envoyer = null;
EditText nombre = null;
TextView result = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

// On récupère toutes les vues dont on a besoin
envoyer = (Button)findViewById(R.id.button);
//calcul = (Button)findViewById(R.id.button);
nombre = (EditText)findViewById(R.id.editText);
result = (TextView)findViewById(R.id.textView4);

// On attribue un listener adapté aux vues qui en ont besoin
envoyer.setOnClickListener(envoyerListener);
nombre.addTextChangedListener(textWatcher);

nombre.setOnKeyListener(modificationListener);
}

// Se lance à chaque fois qu’on appuie sur une touche en étant sur un EditText
private OnKeyListener modificationListener = new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// On remet le texte à sa valeur par défaut pour ne pas avoir de résultat incohérent
result.setText(defaut);
return false;
}
};

private TextWatcher textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
result.setText(defaut);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
};

// Uniquement pour le bouton « Calcul »
private OnClickListener envoyerListener = new OnClickListener() {

@Override
public void onClick(View v) {
// On récupère le nombre
String t = nombre.getText().toString();
float tValue = Float.valueOf(t);
// Puis on vérifie que le nombre est pas égal à 0
if (tValue == 0)
Toast.makeText(MainActivity.this, « Hého, pas de zéro ! »,                                                        Toast.LENGTH_SHORT).show();
else {
float resultat = tValue / 2;
result.setText(« Le résultat est  » + String.valueOf(resultat));
}
}
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}

Je vous invite à parcourir OpenClassRooms pour comprendre ces quelques lignes. Maintenant pour tester le programme, il faut créer un périphérique virtuel, j’ai pris par défaut le Nexus 5 avec Android 4.2 Jelly Bean puisque mon téléphone portable physique Acer Z130 fonctionne avec la version 4.2.2.

Sur le screenshot ci-dessus, je n’avais pas encore configuré KVM d’où le message en rouge, cela semble facultatif, sauf que l’émulateur ne se lançait pas sans… Cela donne cela ensuite avec un Nexus 5 virtuel.

Je ne vous cache pas qu’il faut avoir une machine bien puissante, la compilation et la virtualisation demandent pas mal de ressources, et je ne parle pas quand on passe en mode debogage. Maintenant pour pouvoir le faire tourner sur un vrai portable, il y a quelques manips à mener au niveau, dans les options pour les développeurs, il faut activer le débogage USB et passer en mode PTP (appareil photo) et non mass storage. Et voilà le résultat !

Laisser un commentaire