Η λυπηρή κατάσταση του κατακερματισμού του Android: Ένα παράδειγμα για να κατανοήσετε την κατάσταση των προγραμματιστών

Ο μέσος χρήστης Android μάλλον έχει πάψει εδώ και καιρό να ενδιαφέρεται για το «πρόβλημα κατακερματισμού» του Android. Αλλά το θέμα εξακολουθεί να στοιχειώνει τους προγραμματιστές.

Ο κατακερματισμός είναι ένα αμφιλεγόμενο ζήτημα στο Android κυριολεκτικά από τότε που ανακοινώθηκε το λειτουργικό σύστημα για κινητά.

Εκτός από το ότι είναι ένα κουκούλι για τα τρολ που μπορούν να χρησιμοποιήσουν σε διαδικτυακούς πολέμους φλόγας, η ποικιλομορφία που συνοδεύει τον κατακερματισμό θεωρείται πλέον σε μεγάλο βαθμό ως καθαρά θετική για τους καταναλωτές των συσκευών Android. Τελικά, μας δίνεται τόση ελευθερία στην επιλογή του είδους της συσκευής με το είδος του λογισμικού που θέλουμε, που είναι δύσκολο για τον μέσο καταναλωτή να ενδιαφέρεται για τον κατακερματισμό. Η οπτικοποίηση της απίστευτης ποικιλίας συσκευών Android δημιουργεί ένα όμορφο μωσαϊκό της ποικίλης αναπαράστασης του Android.

Ένα παράδειγμα κατακερματισμού συσκευής Android με βάση τις εγκαταστάσεις εφαρμογών της εφαρμογής του OpenSignal. Πηγή: OpenSignal

Αλλά ο κατακερματισμός υλικού και λογισμικού δεν κάνει έναν χαρούμενο προγραμματιστή λογισμικού. Στην πραγματικότητα, ακριβώς το αντίθετο. Η ανάπτυξη μιας εφαρμογής σε τόσες πολλές διαφορετικές διαμορφώσεις υλικού και λογισμικού μπορεί να αποδειχθεί μεγάλη ενόχληση κατά τον εντοπισμό σφαλμάτων. Οι OEM μπορούν να κάνουν σημαντικές ή ανεπαίσθητες αλλαγές που πρέπει να ληφθούν υπόψη κατά την ανάπτυξη μιας εφαρμογής, αλλά στην πραγματικότητα δεν υπάρχει εύκολος τρόπος για τον μεμονωμένο προγραμματιστή να διασφαλίσει ότι η εφαρμογή του θα λειτουργεί καθολικά. Ενώ ο μέσος καταναλωτής έχει ξεχάσει εδώ και καιρό τη συζήτηση για τον κατακερματισμό, το ζήτημα εξακολουθεί να στοιχειώνει το Android προγραμματιστές εφαρμογών και φαινομενικά δεν υπάρχει τίποτα να κάνουμε γι 'αυτό εκτός από το να το απορροφήσουν και να αντιμετωπίσουν τα σφάλματα καθώς εμφανίζομαι.


The Sorry State of Fragmentation

Ειδικά ένας OEM δέχεται μεγάλο μίσος για τους πονοκεφάλους που προκαλούν κατά την ανάπτυξη μιας εφαρμογής -- Samsung. Οι προγραμματιστές διαλαλούν για τη Samsung εδώ και χρόνια, μερικοί μάλιστα γράφουν τόσο καυστικά κομμάτια όπως "Υπάρχει ένα ειδικό μέρος για τη Samsung στο Android Hell" το οποίο περιγράφει ένα ιδιαίτερα απογοητευτικό σφάλμα που προέρχεται από Συσκευές Samsung και η βιβλιοθήκη υποστήριξης appcompat. Θα ήθελα να επιστήσω την προσοχή σε μια παράγραφο ειδικότερα από τη φασαρία του κ. Ambri, η οποία περιγράφει εξαιρετικά γιατί οι προγραμματιστές εξακολουθούν να ενδιαφέρονται για τον κατακερματισμό:

Εάν είστε προγραμματιστής Android, το μίσος σας για τις συσκευές Samsung είναι πιθανώς απεριόριστο. Περισσότερο από έναν μέσο χρήστη, για τον οποίο η Samsung είναι συνώνυμη ανόητο Touchwiz και υπερβολικό bloatware, περιφρονείτε τη Samsung επειδή δεν έχετε επιλογή. Λόγω της Samsung τεράστιο μερίδιο αγοράς, απλά δεν μπορείτε να επιλέξετε να μην υποστηρίζετε συσκευές Samsung. Και αυτό είναι που πονάει περισσότερο. το γεγονός ότι αυτή η επιλογή σου αφαιρείται!

Ούτε αυτό είναι μια ατάκα από τα παλιά χρόνια ύπαρξης του Android - αυτή η ανάρτηση δημοσιεύτηκε στα μέσα Δεκεμβρίου του περασμένου έτους. Θα είμαι εκ των προτέρων και θα δηλώσω ότι δεν είμαι βέβαιος εάν αυτό το ζήτημα έχει επίσημα επιδιορθωθεί ακόμη, ωστόσο, ο κ. Ο Ambri έδωσε μια διόρθωση στην ανάρτησή του για όποιον συναντήσει την ατάκα του μέσω μιας αναζήτησης στο Google για το έντομο. Το μόνο που έχετε να κάνετε είναι να χρησιμοποιήσετε ProGuard με την ακόλουθη ενιαία γραμμή κώδικα:

# Samsung ruining all nice things-keep class !android.support.v7.view.menu.**, !android.support.design.internal.NavigationMenu, !android.support.design.internal.NavigationMenuPresenter, !android.support.design.internal.NavigationSubMenu, android.support.** {*;}

Δεν είναι τόσο κακό, τώρα είναι; Το πρόβλημα, ωστόσο, είναι ότι αυτή η επιδιόρθωση αποσύρθηκε από το Stack Overflow. Μην με παρεξηγείτε, το Stack Overflow είναι ένας εξαιρετικός ιστότοπος. Αλλά δεν είναι πραγματικά μια ιδανική πηγή για να ανακαλύψετε διορθώσεις για τις εφαρμογές σας. Η εύρεση κάτι στο Stack Overflow συχνά περιλαμβάνει μια βαθιά κατάδυση μέσω συνδέσμων μετά από πολλές δοκιμές και λάθη αναζητήσεις στο Google. Μερικές φορές, θα βρείτε ακόμη και έναν άλλο χρήστη να αναφέρει το ίδιο σφάλμα που είχατε, αλλά χωρίς να φαίνεται κάποια επιδιόρθωση. Ή ακόμη πιο απογοητευτικές είναι οι στιγμές που βρίσκετε ένα νήμα όπου η αρχική αφίσα ισχυρίστηκε έχουν βρει μια λύση, αλλά έχουν εγκαταλείψει εδώ και πολύ καιρό το νήμα τους χωρίς να δώσουν οδηγίες σε άλλους πώς να διορθώσουν το θέμα.

Πηγή: XKCD

Ένα παράδειγμα ενός ζητήματος λεπτής κατακερματισμού

Δεν είμαι προγραμματιστής ο ίδιος, αλλά είμαι αρκετά εξοικειωμένος με τις δυνατότητες του Android μετά από πολλά χρόνια στο Tasker, ώστε άρχισα να ψευτοπρογραμματίζω τις δικές μου λύσεις σε προβλήματα που έχω αντιμετωπίσει. Και όταν δεν μπορώ να καταλάβω κάτι, το ψάχνω στο Google, όπως κάνουν όλοι. Ενώ ήμουν στη διαδικασία να γράψω το προηγούμενο άρθρο μου για σκάβοντας γύρω από την εφαρμογή Ρυθμίσεις του τηλεφώνου σας για κρυφές δραστηριότητες, συνάντησα ένα μάλλον περίεργο σφάλμα που δεν μπορούσα να εξηγήσω. Ένα σφάλμα μοναδικό για τις συσκευές Huawei.

Κάθε φορά που προσπαθούσα να ξεκινήσω ορισμένες δραστηριότητες (όπως το μενού "Δοκιμή" που περιέχει στατιστικά στοιχεία χρήσης της εφαρμογής) εντός της εφαρμογής "Ρυθμίσεις", πάντα αντιμετώπιζα ένα σφάλμα άδειας. Συγκεκριμένα, η εφαρμογή που χρησιμοποιούσα για την έναρξη της δραστηριότητας δεν είχε άδεια huawei.android.permission. HW_SIGNATURE_OR_SYSTEM. Καμία άλλη συσκευή που δοκίμασα δεν απαιτούσε μοναδικά δικαιώματα για την εκκίνηση αυτών των δραστηριοτήτων Ρυθμίσεων, μόνο τα τηλέφωνα που εκτελούν την έκδοση Android (EMUI) της Huawei. Μια ανάλυση του com.android.settings αποκάλυψε ότι ορισμένες δραστηριότητες εντός της εφαρμογής Ρυθμίσεις ήταν πράγματι σε επίπεδο προστασίας που απαιτούσε είτε το υπογραφή ή άδεια συστήματος.

Δυστυχώς για μένα, αυτό σημαίνει ότι μόνο εφαρμογές που είναι εγκατεστημένες στο /system ή εφαρμογές υπογεγραμμένες με το ίδιο υπογραφή καθώς η εφαρμογή Ρυθμίσεις θα μπορούσε να ανοίξει αυτές τις δραστηριότητες χρησιμοποιώντας τη μέθοδο που ήμουν εγώ προσπαθώντας. Όταν έψαξα στο Google αυτό το σφάλμα για μια απάντηση, (το μαντέψατε) βρήκα ένα Νήμα υπερχείλισης στοίβας. Ο προγραμματιστής που ανάρτησε το πρόβλημά του αντιμετώπισε το ίδιο πρόβλημα που αντιμετώπισα κι εγώ (αν και ο ίδιος ήταν στη διαδικασία ανάπτυξης μιας εφαρμογής). Το πρόβλημά του προέκυψε όταν προσπάθησε να εκτελέσει τον ακόλουθο κώδικα:

<span >Intentspan><span > mainIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_MAINspan><span >,span><span >nullspan><span >);span><span >mainIntentspan><span >.span><span >addCategoryspan><span >(span><span >Intentspan><span >.span><span >CATEGORY_LAUNCHERspan><span >);span><span >Intentspan><span > pickIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_PICK_ACTIVITYspan><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_TITLEspan><span >,span><span >"Pick App to Play in"span><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_INTENTspan><span >,span><span > mainIntentspan><span >);span><span >thisspan><span >.span><span >startActivityForResultspan><span >(span><span >pickIntentspan><span >,span><span > REQUEST_PICK_APPLICATIONspan><span >);span>

Κρίνοντας από τις συμβολοσειρές στην πρόθεση και την ιστοσελίδα του προγραμματιστή, πιθανότατα προσπαθούσε να επιτρέψει στον χρήστη να επιλέξει μια εφαρμογή τρίτου κατασκευαστή για αναπαραγωγή κάποιων μέσων. Η επιδιόρθωση, παρέχεται από βετεράνο προγραμματιστή CommonsWare, ήταν αρκετά απλό: χρήση Πρόθεση. CreateChooser αντί ACTION_PICK_ACTIVITY. Ωστόσο, Γιατί πρέπει να εφαρμόσουμε αυτήν την επιδιόρθωση; Γιατί η Huawei απαιτεί εξαρχής αυτήν την άδεια; Γιατί χρειάστηκε να βρούμε μια απάντηση στο StackOverflow χρησιμοποιώντας μια πολύ συγκεκριμένη αναζήτηση Google;


Το παράδοξο της επιλογής

Για να βρείτε μια απάντηση, Το CommonsWare υπέβαλε μια αναφορά σφαλμάτων στο πρόγραμμα παρακολούθησης σφαλμάτων Android που ζητά από την Google να εξετάσει το ζήτημα. Συγκεκριμένα, ο προγραμματιστής ζήτησε από την Google να αποκλείσει τις μη τεκμηριωμένες απαιτήσεις άδειας από τον περιορισμό της πρόσβασης σε εφαρμογές τρίτων μερών στο ACTION_PICK_ACTIVITY. Γράφοντας σε αυτές τις απαιτήσεις στο CTS, η Huawei θα αναγκαστεί να συμμορφωθεί με αυτές τις αλλαγές.

Για να είμαι ειλικρινής, όμως, αυτό το ίδιο το σφάλμα δεν είναι πραγματικά μεγάλο θέμα. Παρόλο που καμία άλλη εφαρμογή που έχω δοκιμάσει (όπως το Tasker) δεν μπόρεσε να παρακάμψει αυτήν την άδεια απαίτηση και έναρξη ορισμένων δραστηριοτήτων εντός της εφαρμογής Ρυθμίσεις, δεν με απογοήτευσε ακριβώς το αποτέλεσμα. Αλλά όταν θυμήθηκα τη φασαρία του κ. Ambri, συνειδητοποίησα ότι μικρές αλλαγές όπως αυτές πρέπει να είναι πολύ απογοητευτικές για να τις αντιμετωπίσω, ειδικά γιατί όσο μικροσκοπικά κι αν είναι, αναμφίβολαπροσθέτω, μερικές φορές αρκετά για να προκαλέσει πονοκέφαλο. Μια μικροσκοπική αλλαγή στην εφαρμογή Ρυθμίσεις θα μπορούσε να οδηγήσει σε μια αρνητική κριτική που δεν άξιζε έναντι ενός προγραμματιστή. Μια μικροσκοπική αλλαγή που είναι μάλλον ανεπαρκώς τεκμηριωμένη και μου ζήτησε να ψάξω στο Διαδίκτυο για ένα νήμα υπερχείλισης στοίβας. Πόσα άλλα μικρά σφάλματα υπάρχουν σε άλλες συσκευές;

Ο αυξημένος ανταγωνισμός στον χώρο των κινητών έχει αποδειχθεί εξαιρετικός για τον καταναλωτή, αλλά αφού είδαμε πώς αυτές οι λεπτές αλλαγές σε τόσες πολλές διαφορετικές σειρές προϊόντων μπορεί να επηρεάσει τους προγραμματιστές, έχω αρχίσει να εκτιμώ την άποψη των προγραμματιστών θρυμματισμός. Δεν είναι ότι η ίδια η επιλογή είναι το πρόβλημα, αλλά μάλλον ότι η κοινότητα δεν κάνει αρκετά για να καταγράψει αυτά τα ζητήματα. Όπως πρότεινε ο κ. Ambri στο άρθρο του, ίσως οι προγραμματιστές Android χρειάζονται τη δική τους έκδοση caniuse.com ή sdkcritic.com να συγκεντρώσει όλα τα σκοτεινά σφάλματα σε μια βάση δεδομένων. Η μόνη άλλη εναλλακτική είναι να πείσουμε τους OEM είτε να τεκμηριώσουν σωστά αυτές τις αλλαγές είτε να σταματήσουν να τις κάνουν εξαρχής, αλλά καλή τύχη με αυτό.

Πιστώσεις χαρακτηριστικών εικόνων: OpenSignal