Vous êtes sur la page 1sur 6

Automatisation de configuration de smartphones

Android
Philippe DURAND

Morgan LE GUEN

Dpartement Rseaux Informatiques & Tlcoms


IUT Lannion
Lannion, France
philippe.durand@univ-rennes1.fr

Dpartement Rseaux Informatiques & Tlcoms


IUT Lannion 2012-2014
Lannion, France

RsumL'automatisation du dploiement d'une flotte de


smartphones est un nouvel enjeu pour les administrateurs d'une
entreprise. Elle peut tre ralise pour les smartphones Android
par programmation en langage Java ou Python en utilisant les
outils MonkeyRunner ou AndroidViewClient.
Mots ClsAndroid;AndroidViewClient ; monkeyrunner;
automatisation ; Java; Python; smartphone;

I.

INTRODUCTION

Android est aujourdhui le systme dexploitation mobile le


plus rpandu. Dvelopp et distribu par Google, il est trs
rgulirement mis--jour et est extrmement souple. Tout le
monde peut dvelopper des applications gratuitement. Il est
donc normal que les entreprises sy intressent pour quiper
leurs flottes de smartphones.

Le problme qui se pose alors est celui du dploiement.


Une entreprise qui dploie un parc de smartphones possde
peut-tre des applications spcifiques, des listes de contacts,
etc Peut-tre souhaitera-t-elle y configurer les comptes mails
de ses employs, ou scuriser ses terminaux via code PIN. Pour
ce faire, elle ne peut pas se permettre de configurer
manuellement, un un, chaque smartphone.
Or, on rencontre ici une lacune de Android: labsence
doutils de dploiement. Cependant, comme Android est un
systme trs ouvert, nous pouvons dvelopper un tel dispositif.
Nous nous proposons donc de crer un outil permettant
dautomatiser linstallation et la configuration de divers
services comme la scurisation du smartphone via code PIN ou
la configuration de laccs un rseau WiFi.
II. PRSENTATION DU PROJET
A. Etat des lieux
Chaque tche que lon se propose dautomatiser est en
ralit simple, mais peut faire perdre beaucoup de temps dans
le cas du dploiement dune flotte de smartphones. Voici un
exemple pour mieux situer lintrt du projet.
Pour scuriser le smartphone via code PIN, il faut tout
dabord aller dans les paramtres du tlphone, puis entrer dans
le sous-menu Scurit . Il faut ensuite toucher le bouton
Verrouillage dcran puis choisir le mode PIN . On entre
ensuite deux fois le code que lon souhaite utiliser.
B. Aspect fonctionnel
Les programmes d'automatisation destins tre utiliss par
un professionnel devront effectuer diverses fonctions :
scurisation du tlphone (mot de passe ou code PIN),
configuration d'un accs WiFi, Configuration de comptes
Google, importation de contacts, configuration de comptes
Mail.
Les scripts pourront tre lancs de deux manires
diffrentes en fonction du type de programmation :

soit installer une application qu'il suffira de


dmarrer pour configurer le tlphone
automatiquement,

soit lancer un script en ligne de commande


partir de la machine. Dans les deux cas, le
smartphone devra tre connect la machine
( par une liaison filaire ou non).

C. Aspect architecture
La flotte de smartphones est constitue de Samsung
Galaxy S2 et de Google Nexus. Les mulateurs Android
peuvent aussi convenir pour certains tests. La version
dAndroid la plus rpandue est la version 4.1 (API 16). Elle
sera utilise sur les smartphones et lmulateur.
D. Aspect logiciel
Les scripts pourront tre crits en deux langages : le
langage Java et le langage Python avec les outils Eclipse, le
SDK Android et notamment l'API MonkeyRunner[1] ainsi que
Android View Client dvelopp par Diego Torres Milano[2].
Ce dernier permet d'utiliser des scripts en Python sans avoir
besoin de MonkeyRunner. Dans la suite de l'article, nous
dtaillerons l'installation des outils avec un systme
d'exploitation Windows 7.
III. PRINCIPE DE FONCTIONNEMENT
A. Comment sont ralises les IHM sous Android
Une application est un assemblage de fentres dans
lesquelles il est possible de naviguer. Tout ce que lon voit
dans une fentre (appele interface ) est en ralit un
lment que lon place lendroit dsir. Des lments peuvent
tres les textes, les boutons, les cases cocher, etc qui
possdent des proprits : taille, place dans la fentre, id, etc
B. Comment accder aux IHM sous Android
Une solution consiste crer des scripts qui interagissent
directement avec linterface du tlphone, en appuyant sur des
boutons grce leurs coordonnes sur lcran. Nous crerons
alors une succession dappuis sur le tlphone qui simulera les
appuis dun utilisateur, une vitesse suprieure. Cette approche
est une approche dite statique .
En donnant des coordonnes pour chaque appui, nous
limitons lutilisation de notre programme un seul format de
tlphone. En effet, il existe plusieurs formats dcran et
rsolutions sur le march. Si le programme appuie sur le point
de coordonnes 240-400, il nappuiera pas au mme endroit en
fonction du tlphone.
Pour rgler ce problme, une approche dite dynamique
est possible. Lobjectif est alors de crer un programme qui
envoie un appui, non pas sur des coordonnes prcises, mais
sur un lment prcis. Notre programme pourra alors sadapter
diffrentes rsolutions dcran. Cest ici quinterviennent les
proprits des lments, et plus prcisment lid. Cette
proprit spcifie llment un identifiant unique dans
linterface. Lid permet de distinguer les lments entre eux.
En le rcuprant, nous pourrons spcifier au programme de
faire un appui directement sur llment qui possde lid
souhait. A signaler que si l'interface homme machine est plus
grande que l'cran, seuls les lments visibles sont accessibles.
Pour accder aux autres objets, il faut programmer un
dplacement (scroll) de l'cran.

IV. INSTALLER L'ENVIRONNEMENT DE DEVELOPPEMENT


A. Installer le SDK Android
Il existe diffrentes possibilits pour faire du
dveloppement sous Android, ce qui n'est pas l'objet de cet
article. Il est cependant ncessaire de pouvoir communiquer
avec les smartphones ou les mulateurs pour procder leur
automatisation. Les outils qui permettent de communiquer ou
muler les tlphones sont installs en mme temps que les
outils de dveloppement. On peut citer :

Eclipse IDE avec ADT (Android Developer Tools)[3]

Android Studio [4]

Dans les deux cas, ils intgrent des mulateurs et l'outil qui
va permettre de communiquer avec les smartphones ou les
mulateurs : le logiciel ADB. A signaler l'existence de
l'mulateur trs performant GenyMotion [5] qui peut tre
utilis ds lors que l'on a install le SDK.
B. Android Debug Bridge (ADB)
ADB est un outil en lignes de commande qui permet de
communiquer avec un mulateur ou un smartphone connect
par USB ou WIFI. ADB se compose de trois programmes :

un client (CLI) qui s'excute sur la machine de


dveloppement qui permet de passer des commandes
vers le terminal,

un serveur qui s'excute en arrire plan sur la machine


de dveloppement et qui permet de lier le client au
dmon qui s'excute sur le tlphone,

un demon qui s'excute en arrire plan sur chaque


terminal.

Exemple de commande ADB :


adb devices
List of devices attached
emulator-5554 device
192.168.56.102:5555

device

Le premier mulateur lanc est celui du SDK


Le second mulateur lanc est celui de GenyMotion qui
s'excute en fait dans une machine virtuelle VirtualBox.
C. Langage Python
Python est un langage qui peut s'utiliser dans de nombreux
contextes et s'adapter tout type d'utilisation grce des
bibliothques spcialises. Il est cependant particulirement
utilis comme langage de script pour automatiser des tches
simples mais fastidieuses. On l'utilise galement comme
langage de dveloppement de prototype lorsqu'on a besoin
d'une application fonctionnelle avant de l'optimiser avec un
langage de plus bas niveau. Il est particulirement rpandu
dans le monde scientifique et possde de nombreuses
extensions destines aux applications numriques.

Python en version 2.7 [6] est ncessaire pour excuter les


scripts s'appuyant sur AndroidViewClient.

C:\Appli\Android\Android\sdk\tools\monkeyrunner.bat
d:\testmonkey\script.py.

Par commodit, on peut ajouter le chemin de l'application


dans la variable PATH de la machine afin de pouvoir excuter
les scripts depuis n'importe quel rpertoire. Pour cela ouvrir le
panneau de configuration et aller dans \Systme et
scurit\Systme ,cliquer sur Variables d'environnement et
ajouter par exemple : C:\Appli\Python27 dans la variable
systme PATH.

E. AndroidViewClient
AndroidViewClient permet de rcuprer larbre des
lments prsents lcran du smartphone ou de lmulateur et
est entirement utilisable en Python. Il convient l'approche
dynamique Il fournit les mmes fonctionnalits que
MonkeyRunner et y ajoute des options comme la possibilit
dappuyer sur un bouton en fonction de son id ou son nom. De
plus, tant 100% utilisable en Python, il est bien plus rapide
que MonkeyRunner. Diego Torres Milano a dmontr que cette
solution est 5 fois plus rapide que l'utilisation de
MonkeyRunner [7].

On veillera encoder tous les fichiers de script Python de


version 2.7 avec l'encodage UTF-8. Ce qui suppose d'indiquer
dans l'entte des fichiers la directive :
# -*- coding: utf8 -*Les chanes de caractres devront tre prfixes par le
symbole u, ex : u"cran de verrouillage"
D. API MonkeyRunner
MonkeyRunner est un outil du SDK Android qui permet de
contrler un smartphone ou un mulateur. Il convient
l'approche statique Il apporte des fonctionnalits
supplmentaires aux outils de programmation Android
classiques . Il permet de crer des scripts en langage Python
qui seront interprts, traduits en Java et excuts sur le
smartphone : installer et lancer une application, envoyer des
appuis sur lcran ou les touches , prendre des captures dcran,
etc...
Voici un exemple
MonkeyRunner

de

script

python

lanc

Pour pouvoir utiliser AndroidViewClient, il faut rcuprer


l'archive [8] et la dcompresser sur la machine (ex :
D:\\AndroidViewClient-master ).
Les scripts Python pourront exploiter AndroidViewClient
en le rfrenant ainsi en dbut de script :
sys.path.append('D:\\\\AndroidViewClientmaster\\AndroidViewClient\\src')
from com.dtmilano.android.viewclient import ViewClient
from com.dtmilano.android.adb.adbclient import AdbClient
Dans la suite de cet article, nous nous focaliserons sur
l'utilisation d'AndroidViewClient qui est la fois plus rapide et
permet une approche dynamique.

par

# Importe le module monkeyrunner


from com.android.monkeyrunner import MonkeyRunner,
MonkeyDevice
# Connects to the current device, returning a
MonkeyDevice object
device = MonkeyRunner.waitForConnection(5,'emulator5554')
# Connecte le smartphone,
device = MonkeyRunner.waitForConnection()
# Installation d'une application.

V. EXEMPLES D'APPLICATION
A. Gnralits
1) Se connecter au terminal
# Imports Python ncessaires
import re
import sys
import os
# Ajout du chemin vers les classes python ViewClient et
AdbClient
sys.path.append('CheminAbsolu\\AndroidViewClientmaster\\AndroidViewClient\\src')

device.installPackage('d:/testmonkey/bin/testMonkey.apk')

from com.dtmilano.android.viewclient import ViewClient

# Nom de l'application lancer

from com.dtmilano.android.adb.adbclient import AdbClient

runComponent = 'testmonkey/testmonkey.IhmTestMonkey'
# Lance l'application (ici celle installe)
device.startActivity(component=runComponent)
# Presse le bouton menu
device.press('KEYCODE_MENU',
MonkeyDevice.DOWN_AND_UP)
Pour excuter ce script Python, il est ncessaire de lancer
les commandes avec les chemins absolus, ex :

#Connexion au terminal connect, il existe une autre


mthode permettant de passer le numro de srie et
d'automatiser ainsi les scripts pour plusieurs terminaux
device, serialno =
ViewClient.connectToDeviceOrExit(verbose=True)
if not device:
raise Exception('Cannot connect to device')
# Creation de l'objet ViewClient

vc = ViewClient(device=device, serialno=serialno)
2) Accder aux applications
Pour lancer une application installe sur le terminal, il faut
connatre la fois son package et le nom de sa fentre (activity)
principale (i.e. celle lance au dmarrage). L'exemple suivant
dfinit les informations pour lancer la gestion des paramtres
du tlphone :
package = 'com.android.settings'
activity = '.Settings'
device.startActivity(package + "/" + activity)
La recherche de ces informations est primordiale pour
pouvoir lancer des applications depuis un script. Il faut donc
pralablement identifier toutes les applications qu'elles soient
partie intgrante du systme d'exploitation Android ou qu'elles
soient des applications tierces que l'on souhaite installer sur le
terminal. ADB va permettre de localiser ces informations en
lanant depuis une console la commande suivante lorsqu'un
terminal est connect la machine :
adb logcat ActivityManager:I *:S
ce qui produira un affichage similaire celui-ci
I/ActivityManager( 1190): Displayed
com.android.settings/.Settings:
o nous retrouvons les informations ncessaires savoir le
nom du package (ici com.android.settings ) et le nom de la
fentre (ici .Settings).
3) Accder aux lments d'une application
Afin d'interagir avec les applications du terminal, il faut
connatre soit le nom de l'lment sur lequel on veut agir (il
suffit de le lire, le bon respect de l'encodage prend tout son
sens) ou alors son numro. L'illustration suivante reprsente
une partie d'une IHM qui va tre exploite

Illustration 2: Arbre des lments correspondant


La zone de texte Verrouillage de l'cran sur laquelle
l'utilisateur pourrait cliquer est en fait accessible par un script
python soit en spcifiant son id (ici 21) ou son texte (ici
Verrouillage de l'cran).
La classe ViewClient propose ainsi deux mthodes :

vc.findViewByIdOrRaise("id/no_id/21")

vc.findViewWithText('Verrouillage de l'cran')

Remarque : l'outil monitor du SDK Android permet aussi


d'accder aux lments d'une IHM Android.
4) Mode opratoire pour les scnarios d'automatisation
Les smartphones utilisant le systme d'exploitation Android
peuvent tre personnaliss par le fabricant en ajoutant
notamment une surcouche Android et en proposant un
assistant d'installation au premier lancement du smartphone.
Dans ce qui suit, nous allons nous baser sur l'OS Android natif
qui est install sur les mulateurs et les tlphones Google.
Les scripts suivants sont appliqus un seul terminal. Il
parfaitement possible de complter ces scripts avec des
structures rptitives afin de se connecter successivement
plusieurs terminaux identifis par leur numro de srie.
Les principes de connexion au terminal, le lancement
d'application et l'accs aux lments d'IHM sont maintenant
dfinis, nous allons voir dans ce qui suit diffrents scnarios
d'automatisation.
B. Test de scurisation du tlphone
En utilisant AndroidViewClient lobjectif est de pouvoir
configurer le dverrouillage de lcran en entrant un code PIN.

Illustration 1: Exemple IHM


Le script python dump_simple.py fourni avec
AndroidViewClient permet de rcuprer l'arbre des lments
de l'IHM qui sont prsents l'cran comme le montre
l'illustration suivante.

Cette proprit se trouve dans les paramtres du tlphone.


Dans le menu Scurit Verrouillage dcran PIN. Il faut
ensuite entrer le code PIN, appuyer sur Continuer , lentrer
de nouveau, et appuyer sur OK . Le script partiel suivant
ralise les appuis ncessaires sur le tlphone.
# -*- coding: utf8 -*# Imports necessaires
import re
import sys
import os
import random

sys.path.append('D:\\AndroidViewClient\\src')
from com.dtmilano.android.viewclient import ViewClient
from com.dtmilano.android.adb.adbclient import AdbClient
device, serialno = ViewClient.connectToDeviceOrExit()
if not device:
raise Exception('Cannot connect to device')
# retour la page d'accueil
device.press('KEYCODE_HOME')
# lancement paramtres
package = 'com.android.settings'
activity = '.Settings'
componentName = package + "/" + activity
device.startActivity(componentName)
# Creation de l'objet ViewClient
vc = ViewClient(device=device, serialno=serialno)
# on dfile l'cran pour faire apparatre Scurit
device.drag((100,600),(100,100),1,20)
vc.sleep(0.1) #pause pour charger l'affichage
vc.dump() #dump rcupre l'arbre de l'IHM dans ViewClient
# On choisit "Scurit"
security = vc.findViewWithText(u"Scurit") # utf-8
security.touch() # on declenche l'appui
vc.sleep(0.1) #pause
vc.dump()
#On choisit "Verrouillage de l'cran"
mode = vc.findViewWithText(u"Verrouillage de l'cran")
mode.touch()
vc.sleep(0.2)
vc.dump()
# On choisit "PIN"
pin = vc.findViewWithText('Code PIN')
if pin: # Si il n'y a pas de verrouillage en place :
pin.touch()
vc.sleep(0.2)
vc.dump()
# On choisit la zone de saisie de texte
# choix par id car l'Edit Text n'a pas de nom
password = vc.findViewByIdOrRaise("id/no_id/18")
#Creation d'un code PIN aleatoire
rand = str(random.randint(1000,9999))
print rand # affichage console du code PIN
#Creation/ouverture d'un fichier txt
fichier = open("D:\\WPRT\\Codes PIN.txt", "a")
#Inscription du PIN dans ce fichier txt
fichier.write("PIN"+serialno+" : "+rand+"\n")
fichier.close()
password.type(rand) #criture du mot de passe
vc.sleep(0.1)
vc.dump()
ctn = vc.findViewWithText('Continuer')
ctn.touch() # appui sur Continuer
vc.sleep(0.1)
vc.dump()
password = vc.findViewByIdOrRaise("id/no_id/18")
password.type(rand) # 2me saisie du mot de passe
vc.sleep(0.1)
vc.dump()
ok = vc.findViewWithText('OK')
ok.touch() # confirmation
else:
print "Smartphone dj scuris par code PIN"

C. Se connecter au rseau WIFI


Lobjectif est de pouvoir configurer la connexion
automatique au rseau WIFI de l'entreprise en utilisant
AndroidViewClient.

Le rglage du WIFI se trouve nouveau dans les


paramtres du tlphone. Il faut choisir la zone Wi-Fi pour
lancer la configuration.

Illustration 3: Configurer le WIFI


Deux situations peuvent se prsenter, soit le WIFI est activ
soit il ne l'est pas.

Illustration 4: Activer le WIFI


On va tester pour savoir s'il est activ en cherchant l'tat du
bouton coulissant. L'analyse de l'IHM donne :

Il faut contourner un problme d'encodage non rsolu en


recherchant avec une expression rgulire s'il y a un objet dans
l'IHM qui a son nom dmarrant par 'Activ'.
wifi = vc.findViewWithText(re.compile('Activ.*'))
Si le WIFI est activ, on passe la suite, sinon on l'active.
Pour cela, on accde donc au bouton coulissant qui est l'objet
ayant le message Dsactiv.
Ensuite il faut choisir le rseau de l'entreprise et s'y
connecter (ici projetic4).

Illustration 5: Choisir un SSID


Dans l'illustration prcdente, il faut choisir l'lment
nomm projetic4 et saisir le mot de passe associ ce SSID.

D. Crer / Importer des contacts


L'importation de contacts peut se faire automatiquement
depuis un compte en ligne (Google) existant qu'il faut associer
au terminal. La cration de contacts peut aussi s'effectuer en
agissant directement avec l'IHM de l'application de contacts en
saisissant des contacts. Le mode opratoire est le mme que
prcdemment, il faut que le script excute le scnario voulu
pour interagir avec l'IHM de l'application de gestion de
contacts ou d'association de compte.
Il est aussi possible d'ouvrir une session sur le terminal via
un script et de lancer en lignes de commande des applications
installes sur le tlphone en leur passant des paramtres.
Les commandes peuvent tre testes directement depuis
adb.
Ex : adb shell am start -a android.intent.action.VIEW

L'outil Android am (activity manager) permet de lancer


diffrentes actions systme. Ici on demande le lancement d'un
outil de visualisation.
Un script python connect au terminal peut facilement
lancer l'excution de ce type de commande :

VI. EXPLOITATION PDAGOGIQUE EN R&T


Les tudiants de DUT R&T peuvent mettre en oeuvre
l'automatisation d'installation de smartphones dans le cadre de
cette formation.
Le langage Python peut pralablement avoir t utilis
comme langage support dans le module informatique de
premire anne M1207 Bases de la programmation . Les
tudiants qui ont contribu ce projet n'ont pas rencontr de
difficult particulire pour apprhender ce langage qui tait
nouveau pour eux.
Cette activit peut prendre tout son sens dans le module
M3206: Automatisation des tches d'administration, aprs
avoir prsent dans un premier temps le systme d'exploitation
Android sans pour autant s'intresser au dveloppement
d'applications Android.
On peut aussi signaler que cette activit pdagogique peut
tre conduite sans investissement autre qu'une salle de TP
informatique. Tous les outils cits sont libres et il n'est donc
pas ncessaire de disposer de terminaux rels puisque les
mulateurs sont suffisamment aboutis pour la mise en uvre.

Ex : device.shell(am start -a android.intent.action.VIEW)

Comme nous l'avons vu prcdemment, on peut lancer des


applications directement par leur nom (mode explicite) mais
Android propose aussi de lancer des applications rpondant
un certain savoir-faire (mode implicite). Dans l'exemple
prcdent, l'action recherche tait lie une visualisation.
Android disposant de plusieurs outils de visualisation, il
propose l'utilisateur d'en choisir un pour poursuivre.

REMERCIEMENTS
Je remercie Morgan Le GUEN, tudiant de la promotion
2014 du dpartement R&T de l'IUT de Lannion d'avoir abord
en projet la mise en uvre des classes AndroidViewCLient, et
en amont Damien SCHWINN et Alexandre RIOUALEN de la
promotion 2013 qui avaient dans un premier temps exploit
l'API MonkeyRunner.

Dans notre cas de cration de contact, on peut spcifier que


l'on cherche insrer un lment dans ce cas l'action demande
devient :
android.intent.action.INSERT
En prcisant ensuite le type d'lment que l'on souhaite
insrer :
-t vnd.android.cursor.dir/contact

RFRENCES
[1]
[2]
[3]

on peut interagir avec l'application de gestion de contacts


laquelle on peut passer des paramtres dans la ligne de
commande :

[4]
[5]
[6]
[7]

-e name 'DURAND' -e phone +33296469325 -e email


'philippe.durand@univ-rennes1.fr'

[8]

Il faut valider l'insertion en appuyant sur le bouton OK


prsent sur l'IHM en utilisant la technique prcdemment
expose pour la scurisation et le WIFI.

MonkeyRunner :
http://developer.android.com/tools/help/monkeyrunner_concepts.html
Diego Torres Milano AndroidViewClient : http://dtmilano.blogspot.fr/
Eclipse IDE avec ADT (Android Developer Tools)
http://developer.android.com/sdk/index.html
Android Studio : http://developer.android.com/sdk/installing/studio.html
GenyMotion : http://www.genymotion.com/
Python 2.7 https://www.python.org/download/releases/2.7.8/
Comparaison MonkeyRunner AndroidViewClient :
http://dtmilano.blogspot.fr/2013/09/androidviewclientculebratakesnapshot.html
Obtenir AndroidViewClient :
https://github.com/dtmilano/AndroidViewClient