PAUG 03/05/2016 : Rechercher et analyser les fuites mémoires dans une application Android

Analyser les fuites de
mémoire dans une
application Android
Smart&Soft
Smart&Soft conçoit, réalise et pilote des applications mobiles pour smartphones,
tablettes, montres et TV connectées.
Nos références clients dans tous les secteurs d’activité
Centré utilisateur
Des applications performantes
et de qualité
Orienté performance
Assurer la pérennité de vos
applications avec des outils dédiés
2
Qui suis-je ?
Ludovic Roland
Responsable du pôle Android
Ingénieur en développement logiciel
Android, Windows Phone / Store et
Windows 10.
ludovic@smartnsoft.com
@ludovicroland
@smartnsoft
3
Introduction
➜ Des fuites de mémoire en Java ?
➜ Des conséquences bien présentes...
4
5
1. Les fausses solutions
2. Les requêtes OQL
3. L’histogramme
4. La bibliothèque LeakCanary
Plan Plan
1.
Les fausses
solutions
6
Les fausses solutions
➜ Le manifest
➜ try / catch tous les blocs de code qui peuvent être à l’origine d’une exception de type
OutOfMemoryError
<application
...
android:largeHeap= "true"
...
>
<!-- -->
</application >
7
Trouver une vraie
solution avec MAT
8
Le logiciel indispensable...
➜ Eclipse Memory Analyzer (MAT)
➜ http://www.eclipse.org/mat/
9
Le processus de création du fichier hprof
1. Création d’un fichier hprof via Android Studio
a. Compilation de l’application
b. On navigue dans l’application (l’empreinte mémoire est visible dans l’onglet Android Monitor)
c. On ferme l’application (bouton retour du téléphone)
Ne pas tuer l’application !
d. On force le passage du Garbage Collector ( )
10
Le processus de création du fichier hprof (suite)
1. Création d’un fichier hprof via Android Studio (suite)
e. Génération du fichier hprof ( )
11
Le processus de création du fichier hprof (suite)
1. Création d’un fichier hprof via Android Studio (suite)
f. Transformation du fichier hprof dans un format “standard”
g. Ouvrir le nouveau fichier hprof dans MAT
12
Présentation de la fuite de mémoire
public final class MainFragment
extends Fragment
{
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
//TODO
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
final View view = inflater.inflate(R.layout.fragment_main, container, false);
final IntentFilter intentFilter = new IntentFilter("TEST");
LocalBroadcastManager.getInstance(getContext()).registerReceiver(broadcastReceiver, intentFilter);
return view;
}
}
13
2.
Les requêtes OQL
14
OQL (Object Query Language) est une extension du
langage SQL pour base de données orientées objet
[...]
Wikipedia,
https://fr.wikipedia.org/wiki/Object_Query_Language
15
A la recherche de la fuite de mémoire
1. Saisir la requête OQL et observer le résultat
2. Compter les fuites mémoire !
16
Comprendre la fuite de mémoire
1. Afficher le détail de la fuite mémoire
2. Observer, comprendre et interpréter le résultat :
17
Il faut savoir ce que l’on recherche !
18
Un langage complet
➜ SELECT * FROM com.smartnsoft.droid4me.app.Droid4mizer
➜ SELECT * FROM INSTANCEOF android.app.Activity a WHERE a.mDestroyed = true
➜ SELECT s.getValueAt(2) FROM int[] s WHERE (s.@length > 2)
19
3.
L’histogramme
20
A la recherche de la fuite de mémoire
1. Cliquer sur l’icône Histogram ( )
2. Filtrer avec le nom de package de votre application :
21
Comprendre la fuite de mémoire
1. Afficher le détail de la fuite mémoire
2. Observer, comprendre et interpréter le résultat :
22
Vérifier la disparition de la fuite de mémoire
1. Filtrer avec le nom de package de votre application :
23
4.
La bibliothèque
LeakCanary
24
Présentation de la bibliothèque
➜ Bibliothèque permettant de détecter des fuites de mémoire lorsqu’un utilisateur navigue au sein d’une
application
➜ Open-source
➜ Créée par Square
➜ https://github.com/square/leakcanary
25
Intégration de la bibliothèque
➜ Une dépendance dans le build.gradle :
➜ Dans l’application :
dependencies
{
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
}
public final class CustomApplication
extends Application
{
@Override
public void onCreate ()
{
super.onCreate() ;
LeakCanary. install(this);
}
} 26
LeakCanary se manifeste de lui même...
➜ Affichage d’une notification en cas de
comportement suspect
➜ Affichage d’une trace
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: In fr.
rolandl.myapplication:1.0:1.
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * fr.
rolandl.myapplication.MainActivity has leaked:
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * GC
ROOT static android.support.v4.content.LocalBroadcastManager.mInstance
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: *
references android.support.v4.content.LocalBroadcastManager.mReceivers
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: *
references java.util.HashMap.table
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: *
references array java.util.HashMap$HashMapEntry[].[5]
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: *
references java.util.HashMap$HashMapEntry.key
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: *
references fr.rolandl.myapplication.MainActivity$1.this$0 (anonymous subclass
of android.content.BroadcastReceiver)
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * leaks
fr.rolandl.myapplication.MainActivity instance
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: *
Retaining: 4,3 Ko.
04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: *
Reference Key: 605c2fc0-77e1-4027-8999-5014c3cc9215
...
27
LeakCanary affiche les détails...
➜ Il convient de cliquer sur la notification pour
ouvrir le détail de la potentielle fuite
mémoire.
ou
➜ ouvrir l’écran dédié
28
LeakCanary affiche les détails… (suite)
29
Des questions ?
Plus d’informations sur notre blog :
https://medium.com/smart-soft
30
31
Ludovic Roland
Responsable du pôle Android
Ingénieur en développement logiciel
Android, Windows Phone / Store et
Windows 10.
ludovic@smartnsoft.com
@ludovicroland
@smartnsoft
Smart&Soft
Siège social : 69, rue Saint Lazare – 75 009 - Paris
Bureaux : 45, rue Jean Jaurès – 92 300 - Levallois
contact@smartnsoft.com
01 41 06 15 26
32
1 sur 32

Recommandé

Java scripting api par
Java scripting apiJava scripting api
Java scripting apiFranck SIMON
2.3K vues96 diapositives
Android NDK par
Android   NDKAndroid   NDK
Android NDKFranck SIMON
1.7K vues97 diapositives
Android Input Method Editor par
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method EditorFranck SIMON
3.9K vues44 diapositives
Outils de gestion de projets par
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projetsECAM Brussels Engineering School
1.2K vues61 diapositives
L’environnement de programmation fonctionnelle DrRacket par
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketStéphane Legrand
2K vues26 diapositives
Travailler avec git et eclipse par
Travailler avec git et eclipseTravailler avec git et eclipse
Travailler avec git et eclipseFrancois ANDRE
2.3K vues104 diapositives

Contenu connexe

En vedette

Doctrina par
DoctrinaDoctrina
Doctrinamathiasgisse
166 vues3 diapositives
Mobile Banking Student Presentation par
Mobile Banking Student PresentationMobile Banking Student Presentation
Mobile Banking Student PresentationRalf Waubke
602 vues15 diapositives
Buyer'sGuideIssuu par
Buyer'sGuideIssuuBuyer'sGuideIssuu
Buyer'sGuideIssuuSusan Horak
400 vues8 diapositives
Aplikasi Gallery Pengetahuan par
Aplikasi Gallery PengetahuanAplikasi Gallery Pengetahuan
Aplikasi Gallery Pengetahuanrohmatulk
259 vues45 diapositives
Resume par
ResumeResume
ResumeDARSHANA ARADHYE
248 vues4 diapositives
Latihan par
LatihanLatihan
Latihanbintangbb
101 vues4 diapositives

En vedette(20)

Mobile Banking Student Presentation par Ralf Waubke
Mobile Banking Student PresentationMobile Banking Student Presentation
Mobile Banking Student Presentation
Ralf Waubke602 vues
Aplikasi Gallery Pengetahuan par rohmatulk
Aplikasi Gallery PengetahuanAplikasi Gallery Pengetahuan
Aplikasi Gallery Pengetahuan
rohmatulk259 vues
González valentín presentación_competic2 par antonigau
González valentín presentación_competic2González valentín presentación_competic2
González valentín presentación_competic2
antonigau591 vues
WindEnergyFinal-2-2 par Danny Farr
WindEnergyFinal-2-2WindEnergyFinal-2-2
WindEnergyFinal-2-2
Danny Farr560 vues
White Paper Organizational Design par Pablo Borrero
White Paper Organizational DesignWhite Paper Organizational Design
White Paper Organizational Design
Pablo Borrero412 vues
Lamont Jones Marketing Porfolio 2017 par Lamont Jones
Lamont Jones Marketing Porfolio 2017Lamont Jones Marketing Porfolio 2017
Lamont Jones Marketing Porfolio 2017
Lamont Jones258 vues
newmarketingplan_04-14-WEB par Susan Horak
newmarketingplan_04-14-WEBnewmarketingplan_04-14-WEB
newmarketingplan_04-14-WEB
Susan Horak215 vues
Deep Dive Training Energy Efficiency in Industrial Processes par Christoph Emde
Deep Dive TrainingEnergy Efficiency in Industrial ProcessesDeep Dive TrainingEnergy Efficiency in Industrial Processes
Deep Dive Training Energy Efficiency in Industrial Processes
Christoph Emde522 vues
CVTemplate_en_GB europass zugravu par zugravu adrian
CVTemplate_en_GB europass zugravuCVTemplate_en_GB europass zugravu
CVTemplate_en_GB europass zugravu
zugravu adrian853 vues
12 najpiękniejszych planerów wg Przedsiebiorcza.com par Joanna Długa
12 najpiękniejszych planerów wg Przedsiebiorcza.com12 najpiękniejszych planerów wg Przedsiebiorcza.com
12 najpiękniejszych planerów wg Przedsiebiorcza.com
Joanna Długa2K vues
Desenvolvendo aplicações Cross-Platform com Xamarin par Júnior Porfirio
Desenvolvendo aplicações Cross-Platform com XamarinDesenvolvendo aplicações Cross-Platform com Xamarin
Desenvolvendo aplicações Cross-Platform com Xamarin
Júnior Porfirio308 vues
González valentin annex_competic2 par antonigau
González valentin annex_competic2González valentin annex_competic2
González valentin annex_competic2
antonigau166 vues

Similaire à PAUG 03/05/2016 : Rechercher et analyser les fuites mémoires dans une application Android

Développer une application android en 2015 par
Développer une application android  en 2015Développer une application android  en 2015
Développer une application android en 2015Florent Champigny
1.1K vues46 diapositives
cours-android.pdf par
cours-android.pdfcours-android.pdf
cours-android.pdfmed_univ78
8 vues101 diapositives
Android introvf par
Android introvfAndroid introvf
Android introvfAnne-Marie Pinna-Dery
3K vues48 diapositives
Présentation GWT et HTML 5 pour l'Offline par
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflineDNG Consulting
2.2K vues20 diapositives
De la chaîne de production au SI géré par des logiciels par
De la chaîne de production au SI géré par des logicielsDe la chaîne de production au SI géré par des logiciels
De la chaîne de production au SI géré par des logicielsJohan Moreau
662 vues48 diapositives
Cours android par
Cours androidCours android
Cours androidAd Hafsa
800 vues107 diapositives

Similaire à PAUG 03/05/2016 : Rechercher et analyser les fuites mémoires dans une application Android(20)

Développer une application android en 2015 par Florent Champigny
Développer une application android  en 2015Développer une application android  en 2015
Développer une application android en 2015
Florent Champigny1.1K vues
Présentation GWT et HTML 5 pour l'Offline par DNG Consulting
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
DNG Consulting2.2K vues
De la chaîne de production au SI géré par des logiciels par Johan Moreau
De la chaîne de production au SI géré par des logicielsDe la chaîne de production au SI géré par des logiciels
De la chaîne de production au SI géré par des logiciels
Johan Moreau662 vues
Cours android par Ad Hafsa
Cours androidCours android
Cours android
Ad Hafsa800 vues
cours Android.pptx par YaminaGh1
cours Android.pptxcours Android.pptx
cours Android.pptx
YaminaGh1141 vues
Débuter avec phonegap (APACHE CORDOVA) dans eclipse pour android par Bosco Basabana
Débuter avec phonegap (APACHE CORDOVA) dans eclipse pour androidDébuter avec phonegap (APACHE CORDOVA) dans eclipse pour android
Débuter avec phonegap (APACHE CORDOVA) dans eclipse pour android
Bosco Basabana5.4K vues
FelixDroid: Application de gestion du framework Felix pour Android par OSGi User Group France
FelixDroid: Application de gestion du framework Felix pour AndroidFelixDroid: Application de gestion du framework Felix pour Android
FelixDroid: Application de gestion du framework Felix pour Android
Introduction_Android_-_Complet.pdf par med_univ78
Introduction_Android_-_Complet.pdfIntroduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdf
med_univ788 vues
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha... par Cyber Security Alliance
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
À La découverte de flow3 - t3con12 par mguermazi
À La découverte de flow3 -  t3con12À La découverte de flow3 -  t3con12
À La découverte de flow3 - t3con12
mguermazi504 vues

PAUG 03/05/2016 : Rechercher et analyser les fuites mémoires dans une application Android

  • 1. Analyser les fuites de mémoire dans une application Android
  • 2. Smart&Soft Smart&Soft conçoit, réalise et pilote des applications mobiles pour smartphones, tablettes, montres et TV connectées. Nos références clients dans tous les secteurs d’activité Centré utilisateur Des applications performantes et de qualité Orienté performance Assurer la pérennité de vos applications avec des outils dédiés 2
  • 3. Qui suis-je ? Ludovic Roland Responsable du pôle Android Ingénieur en développement logiciel Android, Windows Phone / Store et Windows 10. ludovic@smartnsoft.com @ludovicroland @smartnsoft 3
  • 4. Introduction ➜ Des fuites de mémoire en Java ? ➜ Des conséquences bien présentes... 4
  • 5. 5 1. Les fausses solutions 2. Les requêtes OQL 3. L’histogramme 4. La bibliothèque LeakCanary Plan Plan
  • 7. Les fausses solutions ➜ Le manifest ➜ try / catch tous les blocs de code qui peuvent être à l’origine d’une exception de type OutOfMemoryError <application ... android:largeHeap= "true" ... > <!-- --> </application > 7
  • 9. Le logiciel indispensable... ➜ Eclipse Memory Analyzer (MAT) ➜ http://www.eclipse.org/mat/ 9
  • 10. Le processus de création du fichier hprof 1. Création d’un fichier hprof via Android Studio a. Compilation de l’application b. On navigue dans l’application (l’empreinte mémoire est visible dans l’onglet Android Monitor) c. On ferme l’application (bouton retour du téléphone) Ne pas tuer l’application ! d. On force le passage du Garbage Collector ( ) 10
  • 11. Le processus de création du fichier hprof (suite) 1. Création d’un fichier hprof via Android Studio (suite) e. Génération du fichier hprof ( ) 11
  • 12. Le processus de création du fichier hprof (suite) 1. Création d’un fichier hprof via Android Studio (suite) f. Transformation du fichier hprof dans un format “standard” g. Ouvrir le nouveau fichier hprof dans MAT 12
  • 13. Présentation de la fuite de mémoire public final class MainFragment extends Fragment { private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //TODO } }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_main, container, false); final IntentFilter intentFilter = new IntentFilter("TEST"); LocalBroadcastManager.getInstance(getContext()).registerReceiver(broadcastReceiver, intentFilter); return view; } } 13
  • 15. OQL (Object Query Language) est une extension du langage SQL pour base de données orientées objet [...] Wikipedia, https://fr.wikipedia.org/wiki/Object_Query_Language 15
  • 16. A la recherche de la fuite de mémoire 1. Saisir la requête OQL et observer le résultat 2. Compter les fuites mémoire ! 16
  • 17. Comprendre la fuite de mémoire 1. Afficher le détail de la fuite mémoire 2. Observer, comprendre et interpréter le résultat : 17
  • 18. Il faut savoir ce que l’on recherche ! 18
  • 19. Un langage complet ➜ SELECT * FROM com.smartnsoft.droid4me.app.Droid4mizer ➜ SELECT * FROM INSTANCEOF android.app.Activity a WHERE a.mDestroyed = true ➜ SELECT s.getValueAt(2) FROM int[] s WHERE (s.@length > 2) 19
  • 21. A la recherche de la fuite de mémoire 1. Cliquer sur l’icône Histogram ( ) 2. Filtrer avec le nom de package de votre application : 21
  • 22. Comprendre la fuite de mémoire 1. Afficher le détail de la fuite mémoire 2. Observer, comprendre et interpréter le résultat : 22
  • 23. Vérifier la disparition de la fuite de mémoire 1. Filtrer avec le nom de package de votre application : 23
  • 25. Présentation de la bibliothèque ➜ Bibliothèque permettant de détecter des fuites de mémoire lorsqu’un utilisateur navigue au sein d’une application ➜ Open-source ➜ Créée par Square ➜ https://github.com/square/leakcanary 25
  • 26. Intégration de la bibliothèque ➜ Une dépendance dans le build.gradle : ➜ Dans l’application : dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:design:23.2.1' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' } public final class CustomApplication extends Application { @Override public void onCreate () { super.onCreate() ; LeakCanary. install(this); } } 26
  • 27. LeakCanary se manifeste de lui même... ➜ Affichage d’une notification en cas de comportement suspect ➜ Affichage d’une trace 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: In fr. rolandl.myapplication:1.0:1. 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * fr. rolandl.myapplication.MainActivity has leaked: 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * GC ROOT static android.support.v4.content.LocalBroadcastManager.mInstance 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * references android.support.v4.content.LocalBroadcastManager.mReceivers 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * references java.util.HashMap.table 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * references array java.util.HashMap$HashMapEntry[].[5] 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * references java.util.HashMap$HashMapEntry.key 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * references fr.rolandl.myapplication.MainActivity$1.this$0 (anonymous subclass of android.content.BroadcastReceiver) 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * leaks fr.rolandl.myapplication.MainActivity instance 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * Retaining: 4,3 Ko. 04-13 14:22:00.864 16128-17526/fr.rolandl.myapplication D/LeakCanary: * Reference Key: 605c2fc0-77e1-4027-8999-5014c3cc9215 ... 27
  • 28. LeakCanary affiche les détails... ➜ Il convient de cliquer sur la notification pour ouvrir le détail de la potentielle fuite mémoire. ou ➜ ouvrir l’écran dédié 28
  • 29. LeakCanary affiche les détails… (suite) 29
  • 30. Des questions ? Plus d’informations sur notre blog : https://medium.com/smart-soft 30
  • 31. 31 Ludovic Roland Responsable du pôle Android Ingénieur en développement logiciel Android, Windows Phone / Store et Windows 10. ludovic@smartnsoft.com @ludovicroland @smartnsoft
  • 32. Smart&Soft Siège social : 69, rue Saint Lazare – 75 009 - Paris Bureaux : 45, rue Jean Jaurès – 92 300 - Levallois contact@smartnsoft.com 01 41 06 15 26 32