2. 02
SHOWCASE
GERER UN PARC DE TELEPHONES
QUI SOMMES NOUS ?
Mais qui est Sidereo ? Que faisons-nous ?
LES COMPOSANTS
d’une solution mobile
NOTRE CLIENT
COMMENT MODIFIER
Android pour ces besoins ?
PRINCIPALES DIFFICULTES
Et nos conclusions !
3. 03
QUI
SOMMES NOUS ?
Besoin d'une stratégie mobile ?
Attention à la marche !
Sidereo vous aidera à concevoir, développer et
mettre en marché votre solution mobile.
Nos sujets
Nos compétences
Applicatif métier mobile
Étude, conseil et analyse
Gestion de parc
Gestion de projet
Gestion applicative
Développement et recueil des retours
Objets connectés
OS embarqués
utilisateur
Déploiement
Mise en marché
6. 06
LES COMPOSANTS
App. Signature
Mobile Application Management (MAM)
Mobile Device Management (MDM)
FrameWork Android
Dalvik Virtual Machine (ou Android RunTime)
Librairies natives et noyau
GSM
WiFi
Sécurité
App. Système
Configuration
App. Utilisateur
Authentification
D’UNE SOLUTION MOBILE
7. 06
LES COMPOSANTS
App. Signature
Mobile Application Management (MAM)
Mobile Device Management (MDM)
FrameWork Android
Dalvik Virtual Machine (ou Android RunTime)
Librairies natives et noyau
GSM
WiFi
Sécurité
App. Système
Configuration
App. Utilisateur
Authentification
D’UNE SOLUTION MOBILE
8. 06
LES COMPOSANTS
App. Signature
Mobile Application Management (MAM)
Mobile Device Management (MDM)
FrameWork Android
Dalvik Virtual Machine (ou Android RunTime)
Librairies natives et noyau
GSM
WiFi
Sécurité
App. Système
Configuration
App. Utilisateur
Authentification
D’UNE SOLUTION MOBILE
9. 06
LES COMPOSANTS
App. Signature
Mobile Application Management (MAM)
Mobile Device Management (MDM)
FrameWork Android
Dalvik Virtual Machine (ou Android RunTime)
Librairies natives et noyau
GSM
WiFi
Sécurité
App. Système
Configuration
App. Utilisateur
Authentification
D’UNE SOLUTION MOBILE
10. 06
LES COMPOSANTS
App. Signature
Mobile Application Management (MAM)
Mobile Device Management (MDM)
FrameWork Android
Dalvik Virtual Machine (ou Android RunTime)
Librairies natives et noyau
GSM
WiFi
Sécurité
App. Système
Configuration
App. Utilisateur
Authentification
D’UNE SOLUTION MOBILE
11. ETUDE DE CAS
07
• Location de terminaux mobiles à court terme
• Calcul de la consommation voix et data
• Pas de SMS
• Localisation des terminaux, gestion des dégâts, etc.
• Environnement contraint pour l’utilisateur
• Embarquer des applications
12. 08
ETUDE DE CAS
LES COMPOSANTS D’UNE
App. Signature
Mobile Application Management (MAM)
Mobile Device Management (MDM)
FrameWork Android
Dalvik Virtual Machine (ou Android RunTime)
Librairies natives et noyau
GSM
WiFi
Sécurité
App. Système
Configuration
App. Utilisateur
Authentification
SOLUTION MOBILE
13. 09
COMMENT MODIFIER
ANDROID ?
INTRODUCTION : LE SERVEUR
- Base utilisateurs
- Tarifs & Consommation
Smartphone en
location
- Paiement
- Gestion des dommages
- Applications
- Contacts
- Numéros bloqués
- Push
Serveur
14. COMMENT MODIFIER
ANDROID ?
DIFFÉRENTS TYPES D’APPLICATION
Application utilisateur :
!
- Utilisation standard du
framework Android
- Peut remplacer des
briques de bases telles
que le launcher, le
composer, le clavier
10
15. COMMENT MODIFIER
ANDROID ?
DIFFÉRENTS TYPES D’APPLICATION
Application utilisateur :
!
- Utilisation standard du
framework Android
- Peut remplacer des
briques de bases telles
que le launcher, le
composer, le clavier
Application système :
!
- Peut utiliser certaines
permissions particulières
(reboot, installation
silencieuse d’application,
…)
- Non désinstallable
10
16. 10
COMMENT MODIFIER
ANDROID ?
DIFFÉRENTS TYPES D’APPLICATION
Application utilisateur :
!
- Utilisation standard du
framework Android
- Peut remplacer des
briques de bases telles
que le launcher, le
composer, le clavier
Application système :
!
- Peut utiliser certaines
permissions particulières
(reboot, installation
silencieuse d’application,
…)
- Non désinstallable
Application signature :
!
- Non désactivable par
l’utilisateur
18. COMMENT MODIFIER
ANDROID ?
PRÉEMBARQUER DES APPLICATIONS
• Avec le code source via un Makefile Android classique (Android.mk) :
!
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
!
LOCAL_SRC_FILES := $(call all-java-files-under, src)
!
LOCAL_PACKAGE_NAME := CityGuide
LOCAL_CERTIFICATE := platform
!
include $(BUILD_PACKAGE)
!
!
• Au format APK (dont on n’a pas le code source) :
!
PRODUCT_COPY_FILES +=
somewhere/ToiletsInParis.apk:system/app/ToiletsInParis.apk (< 4.4)
somewhere/ToiletsInParis.apk:system/priv-app/ToiletsInParis.apk (>= 4.4)
11
19. COMMENT MODIFIER
ANDROID ?
PRÉEMBARQUER DES APPLICATIONS
• Avec le code source via un Makefile Android classique (Android.mk) :
!
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
!
LOCAL_SRC_FILES := $(call all-java-files-under, src)
!
LOCAL_PACKAGE_NAME := CityGuide
LOCAL_CERTIFICATE := platform
!
include $(BUILD_PACKAGE)
!
!
• Au format APK (dont on n’a pas le code source) :
!
PRODUCT_COPY_FILES +=
somewhere/ToiletsInParis.apk:system/app/ToiletsInParis.apk (< 4.4)
somewhere/ToiletsInParis.apk:system/priv-app/ToiletsInParis.apk (>= 4.4)
11
20. COMMENT MODIFIER
ANDROID ?
Application “Découverte et paiement” :
• Impassable sans paiement
• Aucune fonctionnalité du téléphone accessible
• Lancée à chaque démarrage tant que le paiement n’est pas fait
12
21. COMMENT MODIFIER
13
ANDROID ?
DÉVELOPPER UNE APPLICATION DE DÉMARRAGE
BLOQUANTE
• C’est simple !
• Rajouter sur une Activity de l’AndroidManifest.xml :
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="android.intent.action.DEVICE_INITIALIZATION_WIZARD"/>
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
22. COMMENT MODIFIER
14
ANDROID ?
DÉVELOPPER UNE APPLICATION DE DÉMARRAGE
BLOQUANTE
• Mais il faut penser à désactiver l’application :
PackageManager packageManager = context.getPackageManager();
!
packageManager.setComponentEnabledSetting(
new ComponentName(“com.helloworld.app”, HelloWorldActivity.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
23. COMMENT MODIFIER
15
ANDROID ?
DESCENTE D’APPLICATION SILENCIEUSE
• Pour provoquer l’installation d’une
application sans demande de permission, il
faut être système
public final static String PM_UPDATE = "pm install -r";
!
public static String executeCommand(String command, String param) {
BufferedReader in = null;
try {
Process process = Runtime.getRuntime().exec(String.format("%s %s", command,
param));
} […]
24. COMMENT MODIFIER
ANDROID ?
MODIFIER LES APNS
• Il ne faut pas modifier le fichier dans le
framework, mais en créer un autre.
!
• Chez CyanogenMod, il est situé dans vendor/cm/
prebuild/common/etc :
<apns version="xx">
<apn carrier="xxx" mcc="xxx" mnc="xxx" apn="xxx" user="xxx" password="xx"
type=“xxx" … />
</apns>
16
25. COMMENT MODIFIER
ANDROID ?
Application “Rendu du téléphone” :
• Authentification distributeur
• Formulaire de vérification du téléphone à remplir par le distributeur
• Reset complet du téléphone
• Redémarrage avec optimisation des applications
17
28. COMMENT MODIFIER
ANDROID ?
COMMENT FAIRE UN RESET ?
• Il faut demander la permission système
android.permission.MASTER_CLEAR
!
!
• Et appeler cet Intent :
sendBroadcast(
new Intent(“android.intent.action.MASTER_CLEAR"));
19
29. COMMENT MODIFIER
ANDROID ?
GÉRER LES COMMUNICATIONS
• SMS en modifiant le framework
!
• Appels : plusieurs choix
– Directement dans le framework
– En interceptant l’Intent dans une application
!
• Internet via des règles iptables
20
30. COMMENT MODIFIER
21
ANDROID ?
COUPER LES SMS
• Les applications tierces utilisent le SmsManager
pour envoyer un message, qui lui même utilise le
IccSmsInterfaceManager.
public void sendTextMessage(String destinationAddress, String scAddress, String text,
PendingIntent sentIntent, PendingIntent deliveryIntent) {
[…]
ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
if (iccISms != null) {
iccISms.sendText(ActivityThread.currentPackageName(), destinationAddress,
scAddress, text, sentIntent, deliveryIntent);
} […]
31. COMMENT MODIFIER
ANDROID ?
COUPER LES SMS
• On note plus particulièrement ces
méthodes :
!
• sendData(…)
• sendText(…)
• sendTextWithPriority(…)
• …
22
35. COMMENT MODIFIER
ANDROID ?
COUPER LES APPELS
• Application interceptant l’intent
!
<intent-filter>
<action android:name="android.intent.action.ANSWER"/>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
!
!
• Mais ne la rendant pas au système
setResultData(null);
!
!
• Inconvénient : priorité d’interception
• Solution : modifier le framework pour changer l’intent levée par un appel
24
36. COMMENT MODIFIER
ANDROID ?
COUPER LES APPELS
• Application interceptant l’intent
!
<intent-filter priority=“xx”>
<action android:name="android.intent.action.ANSWER"/>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
!
!
• Mais ne la rendant pas au système
setResultData(null);
!
!
• Inconvénient : priorité d’interception
• Solution : modifier le framework pour changer l’intent levée par un appel
24
37. COMMENT MODIFIER
ANDROID ?
FACTURER LES APPELS
• On enregistre un BroadcastReceiver pour qu’il reçoive les événements relatifs
aux appels :
!
<intent-filter android:priority=“0">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
!
• Un appel suit forcément cette séquence, sinon il n’a pas abouti/l’utilisateur l’a
annulé avant :
• Action de l’Intent vaut Intent.ACTION_NEW_OUTGOING_CALL
• Puis en fonction du CallState du TelephonyManager
• TelephonyManager.CALL_STATE_OFFHOOK
• TelephonyManager.CALL_STATE_IDLE
25
38. COMMENT MODIFIER
ANDROID ?
COUPER INTERNET
• Règles iptables
!
• Problème : on filtre par IP mais ici la gestion du
Push pose un problème :
!
– Soit on coupe tout, mais on ne reçoit plus de
communication du SI
– Soit on whitelist les serveurs de GCM mais dans ce
cas, on reçoit tous les pushs, pas juste les notres
• Solution : filtrer par application
26
39. COMMENT MODIFIER
ANDROID ?
COUPER INTERNET
Maps
Uid : 1
GoogleServices
Framework
Uid : 2
TrafficManager
Uid : 3
Paris City Guide
Uid : 4
27
40. COMMENT MODIFIER
ANDROID ?
COUPER INTERNET
Maps
Uid : 1
GoogleServices
Framework
Uid : 2
TrafficManager
Uid : 3
Paris City Guide
Uid : 4
27
41. COMMENT MODIFIER
28
ANDROID ?
COUPER INTERNET
• 1) On initialise iptables
!
iptables --flush
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT DROP
-A : ajouter une règle en fin de liste
-P : indiquer une policy
-j : indiquer une décision
-m : règle/correspondance
--sport : port source
--dport : port de destination
42. 28
COMMENT MODIFIER
ANDROID ?
COUPER INTERNET
-A : ajouter une règle en fin de liste
-P : indiquer une policy
-j : indiquer une décision
-m : règle/correspondance
--sport : port source
--dport : port de destination
• 2) On crée des meta-interfaces
!
iptables -N mtm
!
iptables -N mtm-wifi
iptables -N mtm-3g
43. 28
COMMENT MODIFIER
ANDROID ?
COUPER INTERNET
-A : ajouter une règle en fin de liste
-P : indiquer une policy
-j : indiquer une décision
-m : règle/correspondance
--sport : port source
--dport : port de destination
• 3) On associe ces metas-interfaces aux
interfaces réseau
!
iptables -A mtm -o wlan+ -j mtm-wifi
iptables -A mtm -o tiwlan+ -j mtm-wifi…
!
iptables -A mtm -o rmnet+ -j mtm-3g…
44. 28
COMMENT MODIFIER
ANDROID ?
COUPER INTERNET
-A : ajouter une règle en fin de liste
-P : indiquer une policy
-j : indiquer une décision
-m : règle/correspondance
--sport : port source
--dport : port de destination
• 4) On définit les exceptions
!
iptables -A mtm-wifi -m owner --uid-owner uid -j RETURN
iptables -A mtm-3g -m owner --uid-owner uid -j RETURN
45. COMMENT MODIFIER
28
ANDROID ?
COUPER INTERNET
• 5) On termine par
!
iptables -P OUTPUT ACCEPT
-A : ajouter une règle en fin de liste
-P : indiquer une policy
-j : indiquer une décision
-m : règle/correspondance
--sport : port source
--dport : port de destination
46. COMMENT MODIFIER
ANDROID ?
PRINCIPALES DIFFICULTÉS
• Choisir une bonne base (AOSP ?
CyanogenMod ?)
• Modifier le moins de choses possibles
• Gérer les sources d’Android
• Faible documentation
• Temps pour tester
• Samsung ;)
29