Professional Documents
Culture Documents
Android
Philippe DURAND
Morgan LE GUEN
I.
INTRODUCTION
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.
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 :
device
C:\Appli\Android\Android\sdk\tools\monkeyrunner.bat
d:\testmonkey\script.py.
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].
de
script
python
lanc
par
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')
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 :
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
vc.findViewByIdOrRaise("id/no_id/21")
vc.findViewWithText('Verrouillage de l'cran')
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"
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.
RFRENCES
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
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