Tuto: une appli simple Android sans Studio

L’objectif de ce tutoriel est de vous apprendre à développer une première application Android simplement avec les outils de bases et sans installer Visual Studio. Avec quelques modifications, ce procédé peut même être utilisé pour compiler une application Android depuis le smartphone lui-même, via termux. Mais nous supposerons ici que vous disposez d’un PC sous linux, d’une distribution dérivée de debian (comme Ubuntu, antiX, MX17…).

Pourquoi ne pas utiliser Visual Studio ?

Parce que Visual Studio est un très bon outil, mais c’est aussi un outil extrèmement lourd et qui ne convient pas à toutes les configurations. En comparaison, le procédé proposé ci-dessous est très léger et surtout la compilation est très rapide. Il vous permet également d’utiliser votre éditeur de texte préféré, comme Vim par exemple :-) Enfin, la plupart des autres tutos de développement android s’appuient sur Vistual Studio; il est donc bienvenue de montrer des solutions alternatives.

Pourquoi un tuto en Français ?

Parce qu’il existe déjà de nombreux tutos en anglais, et que les tutos en français favorisent le renforcement de la communauté francophone de développement.

Pré-requis

Vous devez disposer d’un ordinateur sous Linux, si possible d’une distribution dérivée de debian (Ubuntu, AntiX, MX17…) et d’un smartphone/tablette sous Android pour tester votre programme.

  • Installer le SDK Android:
sudo apt-get update
sudo apt-get install android-sdk
sudo apt-get install default-jdk # il faut la jdk-7 ou plus

Vérifiez que les commandes javac et jar fonctionnent bien.

  • Créez un répertoire pour votre appli:
mkdir monapp
cd monapp
  • Créez la structure dont vous aurez besoin:
mkdir src # fichiers source java
mkdir res # icons, layout XML
  • Choisissez un nom de package; supposions que vous vous appeliez Toto et que nous appelions notre app “unbouton”, alors le package est typiquement fr.toto.unbouton
mkdir -p src/fr/toto/unbouton
  • Créez le fichier ./AndroidManifest.xml qui décrit votre application:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="fr.toto.unbouton"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />
    <application android:label="Unbouton"
        android:icon="@drawable/monappicon" >
        <activity android:name="Unbouton"
                  android:configChanges="orientation"
                  android:label="Unbouton">
		<intent-filter>
			<action android:name="android.intent.action.MAIN"/>
			<category android:name="android.intent.category.LAUNCHER"/>
		</intent-filter>
        </activity>
    </application>
</manifest>

Notez dans ce fichier que vous devez indiquer le package choisi, puis le nom de l’application deux fois dans activity. Vous pourrez y ajouter les permissions dont vous aurez besoin, si vous voulez par exemple accéder à internet, etc.

On y trouve aussi le nom de l’icone qui représentera votre programme. Il nous faut donc aussi créer cette icone. Pour faire vite, vous pouvez simplement créer (avec gimp par exemple) un fichier image PNG de 144x144 pixels et le recopier dans:

res/drawable-xxhdpi/monappicon.png
res/drawable-xhdpi/monappicon.png
res/drawable-hdpi/monappicon.png
res/drawable-mdpi/monappicon.png
  • Créez ensuite la fenêtre principale de votre application, dans res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" >

	<Button
	  android:layout_height="wrap_content"
	  android:layout_width="wrap_content"
	  android:text="Quit"
	  android:onClick="quitte" />
</LinearLayout>
  • Maintenant, le programme principal, dans src/fr/toto/unbouton/Unbouton.java
package fr.toto.unbouton;

import android.os.Bundle;
import android.view.View;
import android.app.Activity;

public class Unbouton extends Activity {

	@Override
	public void onCreate(Bundle s) {
		super.onCreate(s);
		setContentView(R.layout.main);
	}

	public void quitte(View v) {
		System.exit(1);
	}
}
  • Bien ! Il ne reste plus qu’à écrire le script de compilation dans ./build.sh
#!/bin/bash

# put your keystore password in this (uncommited) file:
signerpass=$(cat jarsigner.password)

export ANDBIN=/usr/lib/android-sdk/build-tools/debian/
export ANDJAR=/usr/lib/android-sdk/platforms/android-23/android.jar

rm -rf out
mkdir gen out

$ANDBIN/aapt package -f \
    -M AndroidManifest.xml \
    -I $ANDJAR \
    -S res/ \
    -J gen/ \
    -m

GENFILES=$(find gen -name "*.java" | awk '{a=a" "$1}END{print a}')
SRCFILES=$(find src -name "*.java" | awk '{a=a" "$1}END{print a}')
LIBS=$(ls libs/*.jar | awk '{a=a":"$1}END{print a}')

mkdir out
javac -bootclasspath $ANDJAR -source 1.7 -target 1.7 -cp "$ANDJAR""$LIBS" -d out $SRCFILES $GENFILES
JARS=$(ls $PWD/libs/*.jar | awk '{a=a" "$1}END{print a}')
cd out
$ANDBIN/dx --dex --output classes.dex $JARS .
cd ..
$ANDBIN/aapt package -f -M AndroidManifest.xml -I $ANDJAR -S res/ -F out/app.apk

find assets -type f -exec $ANDBIN/aapt add -v out/app.apk {} \;
cd out
$ANDBIN/aapt add app.apk classes.dex
jarsigner -verbose -keystore $HOME/maclef.keystore -storepass $signerpass -keypass $signerpass -sigalg SHA1withRSA -digestalg SHA1 app.apk toto

Avant d’exécuter ce script, il vous faut le modifier et réaliser une petite opération supplémentaire.

D’abord, pour le modifier, vous voyez au début du script les 2 variables ANDBIN et ANDJAR pointent respectivement vers le répertoire contenant les exécutables du android-sdk, et le .jar contenant le système android. Vous devez mettre à jour ces 2 variables en:

  • cherchant où se trouvent les programmes aapt et dx: ils se trouvent typiquement à une adresse semblable à celle indiquée ci-dessus si vous avez installé android-sdk avec apt-get, mais vous devez le vérifier, et s’ils n’y sont pas, chercher dans les répertoires /usr/lib/android-sdk. Si vous ne trouvez rien, regardez où pointe le lien du programme adb, qui doit être accessible par défaut sinon votre installation de android-sdk n’est pas correcte:
which adb
ls -l /usr/bin/adb

puis fouillez où indique le lien.

  • cherchant où se trouve android.jar: typiquement au même endroit que aapt et dx, mais en remplaçant build-tools par platforms/…

Une fois que vous avez configuré ces 2 variables, ce script devrait fonctionner pour n’importe quelle application android simple.

Il reste toutefois une chose à faire: toute application doit être signée avec une clef qui vous indentifie. Pour cela, il vous faut créer votre clef, en lançant une et une seule fois (pour toutes vos applications !) la commande suivante dans votre HOME:

keytool -genkey -v -keystore maclef.keystore -alias toto -keyalg RSA -keysize 2048 -validity 10000

Cette commande vous demandera un mot de passe pour protéger votre clef: sauvez ensuite (en clair, tant pis…) ce mot de passe dans le répertoire de votre application dans le fichier jarsigner.password. Ce fichier est lu au début du script pour pouvoir signer automatiquement votre apk à la fin.

Il ne vous reste plus qu’à compiler votre application avec

bash ./build.sh

Si tout se passe bien, le résultat est dans app/out.apk

Vous pouvez alors l’installer, après avoir connecté votre smartphone à votre PC, avoir activé le débuggage USB sur votre smartphone, ainsi que autoriser l’installation d’apk provenant de sources “inconnues”, avec:

adb install -r out/app.apk

Résolution de problèmes

  • Si adb ne reconnaît pas votre smartphone, vous pouvez récupérer le numéro de vendor de votre smartphone avec lsusb: c’est la première séquence de 4 chiffres. Vous ajoutez alors cette séquence dans ~/.android/adb_usb.ini sous la forme:

0x45f1

  • Si le nom du smartphone est remplacé par des ?????????, vous devez ajouter dans /etc/udev/rules.d/51-android-rules
SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", ATTR{idProduct}=="xxxx", MODE="0600", OWNER="<username>"

Dans tous les cas, il faut à chaque fois tuer le server adb, déconnecter le smartphone, et le relancer

adb kill-server
adb devices -l

Si adb ne se connecte toujours pas, tuez encore le server, et essayer de relancer en mode sudo:

sudo adb devices -l

Avec toutes ces astuces, il est normalement toujours possible de connecter un smartphone à votre PC; en tout cas, j’y suis toujours parvenu quelque soit le smartphone.

Bon développement android !

Written on August 7, 2018