Σάββατο, 25 Σεπτεμβρίου 2010

Διαχείριση μνήμης στο λειτουργικό Android και χρήση Task manager στο Samsung Galaxy S I-9000 (Tyxerakias - www.myphone.gr)

Το παρακάτω είναι γραμμένο απο τον φίλο και συμφορουμίτη Αλέξανδρο με το ψευδώνυμο "Tyxerakias" απο το www.myphone.gr και τον ευχαριστούμε πολυ !!!!

===========================================================

Για όσους έχουν κάνει root και αναρωτιούνται αν πρέπει να χρησιμοποιούν task manager με autokill ή όχι, και γιατί όχι, να πω κάποια πραγματάκια που ελπίζω ότι θα ξεκαθαρίσουν τη σύγχυση, αν και πολλοί από δω τα ξέρουν ήδη.


Πατήστε παρακάτω στο "Read more - Διαβάστε περισσότερα" για να διαβάσετε ολόκληρο το άρθρο.


Διαχείριση μνήμης στο λειτουργικό Android

To android είναι θεωρητικά φτιαγμένο για multitasking. Έτσι, όταν κλείνεις μια εφαρμογή, το σύστημα δε συμπεριφέρεται όπως τα άλλα λειτουργικά συστήματα (π.χ. windows), δηλαδή δεν κλείνει τελείως όλες τις διεργασίες (processes) που είχε ανοίξει η εφαρμογή, αλλά τις βάζει στο background, και τις σκοτώνει όταν νομίζει ότι χρειάζεται. Συγκεκριμένα, τις σκοτώνει όταν η μνήμη του συστήματος πέσει κάτω από ένα όριο. Η ιδέα είναι ότι αυτές οι ανενεργές διεργασίες δε βλάπτουν τη συνολική απόδοση του συστήματος, και αν χρειαστείς να ξανανοίξεις την εφαρμογή όσο τρέχουν στο υπόβαθρο, θα ανοίξει πιο γρήγορα, με αποτέλεσμα ένα γρήγορο και αποδοτικό λειτουργικό. Οι διεργασίες σκοτώνονται με σειρά παλαιότητας, όταν η μνήμη πέσει κάτω από το όριο.

Περισσότερες πληροφορίες;

O εσωτερικός διαχειριστής μνήμης στο android διαχωρίζει τις εφαρμογές/διεργασίες που τρέχουν στο τηλέφωνο σε 6 καταστάσεις, από Empty App (νεκρή διεργασία, δεν κάνει απολύτως τίποτα και περιμένει να διαγραφεί ή να ξανανοιξεις την εφαρμογή που την καλεί), μέχρι Foreground App (που τρέχει εκείνη τη στιγμή). Όταν σταματήσεις να βλέπεις μια εφαρμογή, είτε την βάλεις στο background με το home button είτε την κλείσεις με το back button, σταματάει αυτόματα να είναι σε κατάσταση Foreground App (προφανώς), και ανάλογα με τη λειτουργία της και τον τρόπο που έχει κωδικοποιηθεί, μπαίνει στο υπόβαθρο σε μια άλλη κατάσταση. Eπαναλαμβάνω ότι αυτό δεν είναι κακό, και είναι βασική λειτουργία του android.

Ωραία, και πού είναι το πρόβλημα;

Το πρόβλημα δυστυχώς είναι ότι η ιδέα δε δουλεύει τέλεια, γιατί προϋποθέτει καλά κωδικοποιημένες εφαρμογές (πράγμα που δυστυχώς δεν ισχύει από τη στιγμή που ο οποισδήποτε μπορεί να ανεβάσει την εφαρμογή του στο market), και εξαρτάται επίσης από τις δυνατότητες της συσκευής. To default όριο μνήμης για να κλείσει μια EMPTY_APP διεργασία είναι χαμηλό, συγκεκριμένα στο Galaxy S είναι 48 ΜΒ (σε άλλες συσκευές είναι ακόμα λιγότερο, μέχρι και 24 ΜΒ). Δηλαδή το τηλέφωνο αρχίζει να σκοτώνει apps που βρίσκονται σε κατάσταση empty, όταν η μνήμη πέσει κάτω από 48 MB. Αυτό το όριο είναι πολύ χαμηλό για τα τελευταίας κατηγορίας κινητά, που τρέχουν με 150-200mb ελεύθερα. Μέχρι να πέσει η μνήμη στα 48 MB, το υπόβαθρο γεμίζει με νεκρές διεργασίες και καθυστερεί επειδή δεν έχει αρκετή ελεύθερη μνήμη, χωρίς λόγο. Πιστεύεται ότι το όριο αυτό θα ανέβει στο Froyo.

Επίσης η μπαταρία, η οποία ΔΕΝ επηρεάζεται από την ελεύθερη μνήμη (κάτι που πιστεύουν λανθασμένα πολλοί), επηρεάζεται από το αν λειτουργεί ο επεξεργαστής ή όχι. Αν οι (άσχημα κωδικοποιημένες) διεργασίες στο υπόβαθρο ζητάνε ακόμα υπολογιστική ισχύ, από κει χάνεται και μπαταρία.

Σ'αυτά ακριβώς πατάνε οι task managers.

Ποιά είναι η λύση;

Υπάρχουν 2 κοινά διαδεδομένες λύσεις, η πρώτη άκομψη και ενάντια στη φιλοσοφία του android, και η δεύτερη σαφώς καλύτερη.

1. Task manager/Task killer. Ένας καλός task manager μπορεί να δεί τις διεργασίες που βρίσκονται και στις 6 καταστάσεις, και ειδικά τις Empty (ενας βλακεία manager όπως της Samsung δεν τις αναφέρει) Και όπως στα Windows (ctrl-alt-del), σου δινει τη δύνατότητα να σκοτώσεις όλα τα apps που έχουν διεργασίες που τρέχουν στο background. Αυτό δεν είναι πάντα καλό, τις περισσότερες φορές μάλιστα είναι κακό, γιατί με το να κλείνεις διεργασίες που το android δε σκόπευε να κλείσει, μπορεί να δημιουργήσεις πρόβλημα, και μάλιστα να κάνεις το τηλέφωνό σου πιο αργό, γιατί πρέπει να τα ξαναρχίζει όλα απ'την αρχή. Μερικοι task managers έχουν τη δυνατότητα να σκοτώνουν αυτόματα τις διεργασίες στο background μετά από ορισμένη ώρα. Υπάρχουν task managers που σε προστατεύουν από λάθη έχοντας safe modes και τέτοια, και μπορείς να αποκλείσεις κάποιες εφαρμογές από το να δολοφονούνται αν ξέρεις ότι δημιουργείται πρόβλημα (ένα παράδειγμα ενός ολοκληρωμένου task manager είναι ο Advanced Task Killer Pro). Παρ'όλα αυτά παραμένει μια βασικά λάθος λύση, και τελείως λάθος λογική στον κόσμο Αndroid.

2. Το καλό με το android είναι ότι τα όρια που λέγαμε παραπάνω μπορούν να αλλάξουν. Τα default όρια για τις 6 καταστάσεις, κατώ από τα οποία σκοτώνονται αυτόματα οι εφαρμογές, βρίσκονται αποθηκευμένα στο αρχείο /sys/module/lowmemorykiller/parameters/minfree . Αυτές οι τιμές λοιπόν μπορούν να αλλάξουν, και έτσι αντί το σύστημα να περιμένει να φτάσει η μνήμη στα 48ΜΒ για να κλείσει τα EMPTY_APPS, να τα σκοτώνει ας πουμε όταν πέφτει κάτω από 100 ΜΒ. Με αυτόν τον τρόπο ακολουθείται η λογική του android, και υπάρχει πάντα ελεύθερη μνήμη για ένα κινητό δυνατοτήτων όπως το Galaxy.
Μια εφαρμογή που το κάνει αυτό είναι το Autokiller (που δεν είναι task killer αν και πολλοί το μπερδεύουν, απλά άστοχο όνομα). Η εφαρμογή αυτή σου δίνει κάποιες προεπιλεγμένες τιμές για τα παραπάνω όρια, και για το Galaxy προτείνω το Strict ή το Αggressive, εγώ το έχω στο Aggresive (όριο 98ΜΒ). Μην διαλέξεις δικές σου τιμές, εκτός αν ξέρεις πραγματικά τί κάνεις. Μόλις τις διαλέξεις, αλλάζει το minfree αρχείο. Τίποτα περισσότερο. Δεν κάνει κάτι μόνη της, δεν τρέχει συνεχώς στο υπόβαθρο, και αφήνει το kernel του android να κάνει τη δουλειά του όπως αυτό νομίζει. Φορτώνει απλά στην εκκίνηση, γιατί τα settings αλλιώς χάνονται.
Tο lagfix του RyanZA περιέχει έναν παρόμοιο manager.

H 2η λύση είναι η πιο σωστή, και θα δεις ότι το τηλέφωνο θα δουλεύει τέλεια χωρίς να σκοτώσεις τίποτα. Φυσικά το minfree αρχείο είναι αρχείο συστήματος, έτσι χρειάζεται root για να εγκαταστήσεις τον autokiller. Σε συνδυασμό με ένα προγραμματάκι σαν το autostarts, με το οποίο μπορείς να ελέγξεις αν κάποιες εφαρμογές ανοίγουν όταν δεν πρέπει και να τις σταματήσεις, το τηλέφωνο θα λειτουργεί όπως ακριβώς πρέπει.

Δηλαδή δε χρειάζομαι καθόλου task manager?

Θεωρητικά όχι. Πρακτικά, λόγω των άσχημα κωδικοποιημένων εφαρμογών που προανέφερα, είναι καλό να υπάρχει κι ένας task manager που να μην τρέχει συνέχεια και φυσικά χωρίς αυτόματο kill, για να σκοτωνεις εσύ καμιά εφαρμογή όταν βλέπεις και δημιουργεί πρόβλημα. To autokiller περιέχει έναν task manager. Και δυστυχώς, η λύση του task manager παραμένει η μόνη λύση για τηλέφωνα που δεν έχουν δικαιώματα root.

Nαι, αλλά το τηλέφωνο πάει πιο γρήγορα με το lagfix.

Μα δεν είπα τίποτα για το lagfix εγώ (λεπτομέρειες ίσως σε κάποιο μελλοντικό οδηγό!). To lagfix δεν έχει καμία απολύτως σχέση με τη μνήμη και τις εφαρμογές. Το lagfix για το Galaxy S είναι άλλη ιστορία τελείως, και βασιζεται στο ότι η Samsung διάλεξε ένα άσχημο σύστημα αρχείων (filesystem), το RFS. Για το λόγο αυτό, η εγγραφή/ανάγνωση δεδομένων είναι αργή και αναποτελεσματική. Το lagfix αλλάζει το filesystem σε ένα πολύ καλύτερο, του linux (ext2 ή ext4 ανάλογα με την έκδοση), και έτσι βελτιώνει απίστευτα τη διαδικασία εγγραφής/ανάγνωσης (Ι/Ο) στο Galaxy S, με αποτέλεσμα να αντιδρά το τηλέφωνο πολύ γρηγορότερα. Aυτό όμως δεν αλλάζει από μόνο του τη διαχείρηση μνήμης, το πρόβλημα παραμένει (γι'αυτό και ο RyanZA έβαλε έναν memory manager σαν το autokiller στην τελευταία έκδοση του one-click).
Για το αν θα αλλάξει το filesystem η Samsung με το Froyo, ή αν θα έχουμε καλύτερο FPU για να αναδειχτουν πλήρως οι ικανότητες του επεξεργαστή μας χωρίς χακιές, μόνο να ελπίζουμε μπορούμε.