-
Ecran noir sous android
Bonjour,
Je développe actuellement une app sous android studio / libgdx et j'ai un soucis assez hard à résoudre :
Lorsque je lance l'app sous android 6, aucun soucis, on peut l'utiliser des heures.
Lorsque je la lance sous android 4.3, on joue 5 ou 10 minutes et l'app quitte avec un écran noir.
Je ne pense qu'il s'agisse d'une incompatibilité du code par rapport à l'API, puisque si c'était le cas, l'app planterait dès le début, au pire peu après.
J'ai vérifier les courbes mémoire/cpu via android studio, aucun soucis, tout se passe parfaitement bien.
Je ne vois pas du tout
de plus si je touche pas à l'app, elle ne plante jamais...
Etrange...
Merci si vous avez une idée =)
-
Tu n'as pas un log quelconque ?
Dans le LogCat, pas d'exception ou de message lorsque ton application "freeze" ?
-
Bonjour Hizin,
Merci pour ton intervention,
Aucune information, l'app crash sans écrire la moindre ligne dans le logcat.
Une petite infos, j'ai utilisé l'app pendant 20 minutes sur ma tablette (celle avec android 6), l'app crash au bout de ce temps (à peu près),
mais je supposes que ça a un lien avec la mémoire, puisque la tablette possède 2 gigas de ram alors que mon mobile, 1 giga.
Mais j'ai un doute car la courbe mémoire jusqu'au crash est plate, et au fur et à mesure de l'utilisation de l'app, je vérifiais
la mémoire occupée, et celle-ci n'évaluait pas jusqu'au crash.
Je continue à faire tests...
-
Si tu as des soucis de mémoire, ceux-ci devraient être visibles dans le LogCat.
Exemples de lignes :
01-13 14:37:54.538: D/dalvikvm(27390): GC_CONCURRENT freed 393K, 47% free 3377K/6279K, external 2003K/2199K, paused 2ms+3ms
01-13 14:38:11.495: D/dalvikvm(27390): GC_EXTERNAL_ALLOC freed 145K, 46% free 4154K/7559K, external 5739K/5920K, paused 29ms
Avec en prime une grosse ligne en error disant que l'application prend trop de mémoire.
Je te conseille donc de le regarder avec plus d'attention, ainsi que de faire attention à ses filtres.
Bon, je n'ai jamais utilisé la libgdx non plus, mais ça m'étonnerait qu'une application crash silencieusement sur Android.
-
Merci pour ton retour Hizin,
Je fais bien attention à ce genre de ligne.
Il s'agit apparemment d'une fuite mémoire, je vais essayer de voir d'où elle peut provenir
-
C'est bien une fuite mémoire, voici la ligne :
10-24 13:54:06.755 16023-16071/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed <1K, 19% free 10494K/12940K, paused 29ms, total 29ms
Plus qu'à chercher ^^
Ce qui m'étonne c'est qu'au lancement de l'app j'ai aussi cette ligne :
10-24 13:58:42.275 18896-18934/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed <1K, 15% free 10290K/12096K, paused 30ms, total 30ms
-
Alors non :)
Ce genre de ligne indique uniquement que tu fais de "grosses" opérations en mémoire. Elles ne sont pas indicateurs de fuite mémoire ou de problème de mémoire. Je ne dis pas que tu n'en a pas, mais que se baser uniquement sur ces logs n'est pas suffisant pour déduire un problème de mémoire :)
Typiquement, les voir en lancement d'application n'est pas étonnant vu qu'il y a le chargement de beaucoup de données en général.
Sinon... je vais regretter ce que je vais demander mais bon... copie-colle nous le LogCat non filtré au moment du crash, histoire qu'on voit s'il y a quelque chose d'exploitable dedans.
-
Voici le log au lancement
10-24 16:33:53.765 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 468K, 21% free 9825K/12412K, paused 18ms, total 18ms
10-24 16:33:55.080 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 460K, 21% free 9867K/12412K, paused 17ms, total 18ms
10-24 16:33:56.105 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 377K, 21% free 9922K/12412K, paused 15ms, total 15ms
10-24 16:33:56.170 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 454K, 21% free 9923K/12412K, paused 16ms, total 16ms
10-24 16:33:56.235 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 440K, 21% free 9925K/12412K, paused 15ms, total 15ms
10-24 16:33:56.295 15005-15049/com.code.lanme I/AndroidGraphics: resumed
10-24 16:34:02.390 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 981K, 20% free 9956K/12412K, paused 29ms, total 29ms
10-24 16:34:06.355 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 478K, 20% free 9959K/12412K, paused 31ms, total 31ms
10-24 16:34:11.490 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 444K, 20% free 10027K/12412K, paused 28ms, total 28ms
et juste au moment du crash :
10-24 16:36:03.290 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 516K, 23% free 10163K/13060K, paused 25ms, total 25ms
10-24 16:36:05.080 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 505K, 23% free 10168K/13060K, paused 17ms, total 17ms
10-24 16:36:06.955 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 509K, 23% free 10170K/13060K, paused 35ms, total 36ms
10-24 16:36:11.605 15005-15049/com.code.lanme V/MediaPlayer-JNI: stop
10-24 16:36:11.605 15005-15049/com.code.lanme V/MediaPlayer: stop
10-24 16:36:11.605 15005-15049/com.code.lanme V/MediaPlayer-JNI: stop
10-24 16:36:11.605 15005-15049/com.code.lanme V/MediaPlayer: stop
10-24 16:36:11.650 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 587K, 24% free 10040K/13060K, paused 31ms, total 31ms
10-24 16:36:12.455 15005-15049/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 427K, 24% free 10041K/13060K, paused 16ms, total 16ms
Je peux utiliser l'app pendant 2 ou 3 minutes, la laisser tourner, elle ne plante pas, puis je peux reprendre 30 minutes plus tard, et... crash
Et apparemment, oui, tu as raison, ce n'est pas une fuite mémoire puisque j'ai plus de mémoire libre au crash qu'au début, à moins que ce soit la libération de la mémoire occupée
Le GC fait bien son job, j'ai bien fait attention de ne pas avoir d'instances qui ne soit pas "libérées"
merci =)
-
J'aurai préféré le log complet plutôt que les seuls appels GC ^^'
Tu n'as rien d'autre, niveau log général lors de ton crash ?
-
A part ça :
10-24 17:24:58.516 20797-20845/com.code.lanme V/MediaPlayer-JNI: seekTo: 0(msec)
10-24 17:24:58.516 20797-20845/com.code.lanme V/MediaPlayer: seekTo 0
10-24 17:24:58.516 20797-20854/com.code.lanme V/MediaPlayer: message received msg=4, ext1=0, ext2=0
10-24 17:24:58.516 20797-20854/com.code.lanme V/MediaPlayer: Received seek complete
10-24 17:24:58.516 20797-20854/com.code.lanme V/MediaPlayer: All seeks complete - return to regularly scheduled program
10-24 17:24:58.516 20797-20854/com.code.lanme V/MediaPlayer: callback application
10-24 17:24:58.516 20797-20854/com.code.lanme V/MediaPlayer: back from callback
10-24 17:24:58.516 20797-20845/com.code.lanme V/MediaPlayer-JNI: stop
10-24 17:24:58.546 20797-20845/com.code.lanme V/MediaPlayer: stop
10-24 17:24:58.546 20797-20797/com.code.lanme D/dalvikvm: GC_FOR_ALLOC freed 551K, 19% free 10043K/12380K, paused 30ms, total 30ms
10-24 17:24:58.546 20797-20845/com.code.lanme V/MediaPlayer-JNI: seekTo: 0(msec)
10-24 17:24:58.546 20797-20845/com.code.lanme V/MediaPlayer: seekTo 0
10-24 17:24:58.546 20797-20810/com.code.lanme V/MediaPlayer: message received msg=4, ext1=0, ext2=0
10-24 17:24:58.551 20797-20810/com.code.lanme V/MediaPlayer: Received seek complete
10-24 17:24:58.551 20797-20810/com.code.lanme V/MediaPlayer: All seeks complete - return to regularly scheduled program
10-24 17:24:58.551 20797-20845/com.code.lanme V/MediaPlayer-JNI: stop
10-24 17:24:58.551 20797-20845/com.code.lanme V/MediaPlayer: stop
10-24 17:24:58.551 20797-20810/com.code.lanme V/MediaPlayer: callback application
10-24 17:24:58.551 20797-20810/com.code.lanme V/MediaPlayer: back from callback
juste avant le crash
-
Ah oui, j'ai oublié de préciser, parfois, lors du dev, l'appli plante et aucune infos, pas de log, page blanche, ça aide beaucoup,
je ne sais pas si c'est android studio, mais c'est pas top, alors je tatonne pour trouver -_____-'
-
À titre personnel, je n'ai jamais constaté de crash sans stacktrace sur Android, que je développe avec Android Studio ou IDEA.
Tu peux aussi accéder au LogCat directement sans passer par l'IDE. Fais un adb logcat dans un terminal et tu l'auras directement.
J'ai plutôt l'impression que l'absence d'infos est à imputer à la libgdx... mais même ça m'étonnerai :/
-
Bonjour Hizin,
Je vais faire des tests plus sérieux pour voir, mais à mon avis, il s'agit bien d'une fuite.
Au bout de 3 ou 4 minutes, la mémoire allouée monte de 0.20MB et le GC ne s'en occupe pas.
Et au bout 30 minutes, la mémoire ne revient pas au niveau du début, elle est bel et bien pas restituée
-
Autre test plus long (j(en profite pour faire remonter le post ^^)
J'ai laissé l'appli tourner pendant 1 heure 30
Allocated memory au démarrage 1.24MB
Allocated memory après 1h30 : 5,99MB !
-
Bon, j'ai bien bossé, j'vais bien raison sur la fuite mémoire, elle était sournoise mais j'ai réussi à en venir à bout,
Maintenant au lancement j'ai 10,34MB, et 2h00 plus tard j'ai toujours 10,34MB,
avec des fluctuations pendant son utilisation, c'est normal.
Ceci après avoir bien trituré l'appli dans tout les sens avant de la laisser tourner 2h00...
MAIS, crash quand même au bout d'un certain temps -____-' pendant une utilisation de 5 minutes d'affilée,
je continue à faire des tests, mais ça devient chaud, je ne sais plus où chercher :/
Voici un adb logcat tout frais, incomplet, il est trop long,
mais j'ai fait ressortir les 2 lignes qui indique que l'app est morte :
V/AudioCache( 1947): open(44100, 2, 0x0, 1, 4)
V/AwesomePlayer( 1947): addBatteryData
V/MediaPlayerService( 1947): wait for playback complete
I/OMXCodec( 1947): [OMX.google.vorbis.decoder] End Of Stream
V/AwesomePlayer( 1947): postAudioEOS delayUs (0)
V/AwesomePlayer( 1947): onCheckAudioStatus
V/AwesomePlayer( 1947): onCheckAudioStatus() set AUDIO_AT_EOS flag
V/AwesomePlayer( 1947): onStreamDone
V/AwesomePlayer( 1947): MEDIA_PLAYBACK_COMPLETE
V/AwesomePlayer( 1947): notifyListner_l() msg (2-MEDIA_PLAYBACK_COMPLETE), ext1 (0), ext2 (0)
V/AudioCache( 1947): notify(0x42c29e78, 2, 0, 0)
V/AudioCache( 1947): playback complete - thread will wake up later
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=1)
V/AwesomePlayer( 1947): addBatteryData
V/AudioCache( 1947): wait - success
V/StagefrightPlayer( 1947): reset
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
I/OMXCodec( 1947): [OMX.google.vorbis.decoder] stop() sendCommand(0x72, OMX_CommandStateSet, OMX_StateIdle)
I/AudioPlayer( 1947): reset out
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
I/SecMediaClock( 1947): SecMediaClock destructor
V/AwesomePlayer( 1947): mSecMediaClock clear
V/StagefrightPlayer( 1947): ~StagefrightPlayer
V/StagefrightPlayer( 1947): reset
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
V/AwesomePlayer( 1947): mSecMediaClock clear
V/AwesomePlayer( 1947): destructor
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
V/AwesomePlayer( 1947): mSecMediaClock clear
D/SensorService( 2357): -0.5 1.1 9.4
D/SensorService( 2357): -0.6 1.0 9.5
D/SensorService( 2357): SensorDevice::activating sensor handle=0 ns=200000000
D/iNemoSensor( 2357): setDelay(): handle(0), en(200000000)
I/iNemoSensor( 2357): skip update_delay wanted_accel = 20000000 current delay = 20000000
-------------------------------------------------------------------------------------------------------------------> I/ActivityManager( 2357): Process com.code.lanme (pid 26614) (adj 0) has died.
V/MediaPlayerService( 1947): Client(38) destructor pid = 26614
V/MediaPlayerService( 1947): Client(40) destructor pid = 26614
V/MediaPlayerService( 1947): disconnect(38) from pid 26614
V/MediaPlayerService( 1947): disconnect(40) from pid 26614
V/StagefrightPlayer( 1947): reset
V/StagefrightPlayer( 1947): reset
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AudioPolicyManagerBase( 1947): releaseOutput() 2
V/AwesomePlayer( 1947): reset_l() stop AudioSource since AudioPlayer not exist
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
I/SecMediaClock( 1947): SecMediaClock destructor
V/AwesomePlayer( 1947): mSecMediaClock clear
V/StagefrightPlayer( 1947): ~StagefrightPlayer
V/StagefrightPlayer( 1947): reset
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
V/AwesomePlayer( 1947): mSecMediaClock clear
V/AwesomePlayer( 1947): destructor
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AudioPolicyManagerBase( 1947): releaseOutput() 2
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
V/AwesomePlayer( 1947): mSecMediaClock clear
V/AudioSink( 1947): +++ close
V/AudioSink( 1947): --- close
V/AwesomePlayer( 1947): reset_l() stop AudioSource since AudioPlayer not exist
V/AudioPolicyManagerBase( 1947): releaseOutput() 2
I/OMXCodec( 1947): [OMX.SEC.MP3.Decoder] stop() sendCommand(0x6c, OMX_CommandStateSet, OMX_StateIdle)
V/AudioPolicyManagerBase( 1947): releaseOutput() 2
V/AudioPolicyManagerBase( 1947): releaseOutput() 2
V/AudioPolicyManagerBase( 1947): releaseOutput() 2
V/AudioPolicyManagerBase( 1947): releaseOutput() 2
I/OMXCodec( 1947): OMXCodec::AudioConfigDelete 0
D/AudioSystem( 1947): AudioSystem::setConfigCallback+++
I/OMXCodec( 1947): RESET mIsALPrunning
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
I/SecMediaClock( 1947): SecMediaClock destructor
V/AwesomePlayer( 1947): mSecMediaClock clear
V/StagefrightPlayer( 1947): ~StagefrightPlayer
V/StagefrightPlayer( 1947): reset
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
V/AwesomePlayer( 1947): mSecMediaClock clear
V/AwesomePlayer( 1947): destructor
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
V/AwesomePlayer( 1947): mSecMediaClock clear
V/AudioSink( 1947): +++ close
V/AudioSink( 1947): --- close
V/MediaPlayerService( 1947): Client(39) destructor pid = 26614
V/MediaPlayerService( 1947): disconnect(39) from pid 26614
V/StagefrightPlayer( 1947): reset
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): reset_l() stop AudioSource since AudioPlayer not exist
I/OMXCodec( 1947): [OMX.SEC.mp3.dec] stop() sendCommand(0x6d, OMX_CommandStateSet, OMX_StateIdle)
I/SEC_BASE_COMP( 1947): SEC_OMX_ComponentStateSet: Cur(3) -> Dest(2)
I/SEC_BASE_COMP( 1947): SEC_OMX_ComponentStateSet: Cur(2) -> Dest(1)
I/OMXCodec( 1947): OMXCodec::AudioConfigDelete 0
D/AudioSystem( 1947): AudioSystem::setConfigCallback+++
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
I/SecMediaClock( 1947): SecMediaClock destructor
V/AwesomePlayer( 1947): mSecMediaClock clear
V/StagefrightPlayer( 1947): ~StagefrightPlayer
V/StagefrightPlayer( 1947): reset
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
V/AwesomePlayer( 1947): mSecMediaClock clear
V/AwesomePlayer( 1947): destructor
V/AwesomePlayer( 1947): reset_l()
V/AwesomePlayer( 1947): cancelPlayerEvents (keepNotifications=0)
V/AwesomePlayer( 1947): mAudioTrackVector clear
V/AwesomePlayer( 1947): reset_l() mAudioPlayer successfully deleted
V/AwesomePlayer( 1947): mSecMediaClock clear
V/AudioSink( 1947): +++ close
V/AudioSink( 1947): --- close
I/iNemoSensor( 2357): enable(): handle(1), en(0), what(2)
D/iNemoSensor( 2357): enable(): MASK_ACC (1) MASK_MAG (0) MASK_GYR (0), MASK_UMAG(0)
D/iNemoSensor( 2357): enable(): mEnAcc(1) mEnMag(0) mEnGyr(0), mEUMag(0)
I/iNemoSensor( 2357): update_delay wanted_accel = 200000000
D/SensorService( 2357): SensorDevice::activating sensor handle=1 ns=20000000
D/iNemoSensor( 2357): setDelay(): handle(1), en(20000000)
I/iNemoSensor( 2357): skip update_delay wanted_accel = 200000000 current delay = 200000000
D/AkmSensor( 2357): MeasureSNGLoop: interval.interval = 200000000, doze_max = 196000, prms->enabled = 2
W/InputDispatcher( 2357): channel ~ Consumer closed input channel or an error occurred. events=0x9
E/InputDispatcher( 2357): channel ~ Channel is unrecoverably broken and will be disposed!
I/SurfaceFlinger( 1944): id=361 Removed TurfaceView (1/5)
I/SurfaceFlinger( 1944): id=361 Removed TurfaceView (-2/5)
-------------------------------------------------------------------------------------------------------------------> W/ActivityManager( 2357): Force removing ActivityRecord{43052f10 u0 com.code.lanme/.AndroidLauncher}: app died, no saved state
W/InputDispatcher( 2357): Attempted to unregister already unregistered input channel
V/WindowManager( 2357): Window{42f1e0e8 u0 Keyguard}mOrientationRequetedFromKeyguard=false
I/SurfaceFlinger( 1944): id=360 Removed BndroidLaun (2/4)
I/SurfaceFlinger( 1944): id=360 Removed BndroidLaun (-2/4)
V/WindowManager( 2357): Window{42f1e0e8 u0 Keyguard}mOrientationRequetedFromKeyguard=false
W/ActivityManager( 2357): mDVFSHelper.acquire()
D/STATUSBAR-NetworkController( 2595): onSignalStrengthsChanged signalStrength=SignalStrength: 2 -1 -1 -1 -1 -1 -1 99 -140 -20 -200 -1 2147483647 gsm|lte 0x1 level=1
V/WindowManager( 2357): rotationForOrientationLw(orient=5, last=1); user=0 sensorRotation=-1 isCoverOpen=true mLidState=-1 mDockMode=0 mHdmiPlugged=false mAccelerometerDefault=false
-
J'imagine que "com.code.lanme" est ton application.
OK, merci pour la preuve, je n'avais encore jamais rencontré ce cas (que j'attribue à la libgdx, vu que je n'ai rien fait de sérieux avec et que je n'ai pas rencontré (personnellement ou au travers de retours d'expérience) ce cas ailleurs).
BON. Le crash viendrait de la partie native, ce qui expliquerait la pauvreté des retours.
Je te suggère de regarder de ce côté-là, donc de comment récupérer des retours/logs bas niveau. N'étant pas expérimenté avec le NDK (et n'ayant pas de projet sous la main pour expérimenter), je ne peux pas beaucoup t'aiguiller.
-
Ok, merci quand même d'avoir pris le temps de jeter un œil ^^
Mais ce soucis m'a quand même permis de résoudre celui de la fuite ! :mrgreen: