Αυτός είναι ο λόγος για τον οποίο δεν μπορείτε να φορτώσετε ενημερώσεις στο Google Camera and Recorder

Εάν έχετε δει ένα σφάλμα "αποτυχία επαλήθευσης" κατά την παράπλευρη φόρτωση μιας ενημέρωσης στις εφαρμογές Google Camera ή Recorder, διαβάστε αυτό για να μάθετε γιατί.

Όταν η Google παρουσίασε το Pixel 5 τον Οκτώβριο, ήμασταν ενθουσιασμένοι που πήραμε στα χέρια μας τις νέες εφαρμογές της. (Το ίδιο το τηλέφωνο είναι αρκετά κουλ, επίσης.) Με την κυκλοφορία του Pixel 5 ήρθαν νέες εκδόσεις του την κάμερα Google και Google Recorder εφαρμογές που μοιραστήκαμε με την κοινότητα. Ωστόσο, όταν πολλοί χρήστες παλαιότερων συσκευών Pixel προσπάθησαν να φορτώσουν τις ενημερώσεις, αντιμετώπισαν ένα σφάλμα (που φαίνεται παραπάνω). Παραδόξως, δεν είχαν όλοι προβλήματα με την εγκατάσταση των ενημερώσεων. Κάποιοι μπόρεσαν να τα εγκαταστήσουν μια χαρά, ενώ άλλοι έπρεπε να κάνουν επαναφορά εργοστασιακών ρυθμίσεων μόνο για να μπορέσουν να εγκαταστήσουν τις νέες εκδόσεις. Λόγω της φαινομενικά τυχαίας φύσης αυτού του ζητήματος, πολλοί το αποκάλυψαν ως σφάλμα. Είμαστε πολύ σίγουροι τώρα ότι αυτό το ζήτημα δεν προέρχεται από κάποιο σφάλμα, αλλά μάλλον από τη χρήση ενός νέου API από την Google στο Android 11 για τον αποκλεισμό των ενημερώσεων πλευρικής φόρτωσης.

Εάν προσπαθήσετε να φορτώσετε το Google Camera 8.0 ή νεότερη έκδοση ή το Google Recorder 2.0 ή νεότερη έκδοση σε μια συσκευή Pixel με Android 11, θα δείτε ένα μήνυμα σφάλματος που λέει ότι η επαλήθευση δεν ήταν επιτυχής. Ακόμα κι αν προσπαθήσετε να φορτώσετε το APK χρησιμοποιώντας μια εντολή κελύφους, δεν θα λάβετε πιο συγκεκριμένο λόγο για την αποτυχία εγκατάστασης. Ο κωδικός επιστροφής εγκατάστασης που θα σας δοθεί είναι "INSTALL_FAILED_VERIFICATION_FAILURE», το οποίο δυστυχώς δεν σας λέει γιατί η επαλήθευση δεν είναι επιτυχής. Εξετάζοντας το logcat, μπορούμε να μάθουμε ακριβώς γιατί αποτυγχάνει η επαλήθευση:

AppIntegrityManagerServiceImpl: Integritycheckofcom.google.android.GoogleCameraresult: DENYdueto[Rule: (PACKAGE_NAME EQ com.google.android.GoogleCamera) AND (VERSION_CODE GTE 32045130) AND (APP_CERTIFICATE EQ F0FD6C5B410F25CB25C3B53346C8972FAE30F8EE7411DF910480AD6B2D60DB83) AND NOT (INSTALLER_NAME EQ com.android.vending), DENY]

Σύμφωνα με αυτό το μήνυμα, ένας έλεγχος ακεραιότητας της εγκατάστασης της Κάμερας Google απέτυχε επειδή το "INSTALLER_NAME" δεν ταιριάζει με το "com.android.vending", το όνομα πακέτου για το Google Play Store. (Προσπαθούσα να εγκαταστήσω το Google Camera 8.0 χρησιμοποιώντας την εφαρμογή APKMirror Installer, για όσο αξίζει.) Αυτό το μήνυμα προστέθηκε στο αρχείο καταγραφής συστήματος από τον χρήστη "AppIntegrityManagerServiceImpl", το οποίο αποτελεί μέρος της νέας δυνατότητας "Ακεραιότητα εφαρμογής" του Android. Σύμφωνα με τον κώδικα στο AOSP, το App Integrity έχει σχεδιαστεί για να παρέχει ένα επιπλέον επίπεδο ελέγχων πάνω από την υπάρχουσα επαλήθευση υπογραφής APK του διαχειριστή πακέτων. Το App Integrity API φαίνεται να χρησιμοποιεί ένα σύνολο από Κανόνες για να αποφασίσετε εάν θα επιτρέψετε ή όχι την εγκατάσταση. Οι κανόνες παρέχονται από μια εφαρμογή συστήματος — που πιστεύουμε ότι είναι Υπηρεσίες Google Play — και παρέχονται αποθηκευμένο σε ένα αρχείο.

Επιπλέον, App Integrity επίσης καλεί κάλεσε μια άλλη τάξη SourceStampVerifier εάν μια "σφραγίδα πηγής" είναι ενσωματωμένη στα μεταδεδομένα του Manifest. Για παράδειγμα, εδώ πιστεύουμε ότι είναι η "σφραγίδα πηγής" από το Manifest της εφαρμογής Google Camera:

<meta-dataandroid: name="com.android.stamp.source"android: value="https://play.google.com/store"/>

Από ό, τι μπορούμε να πούμε, η σφραγίδα πηγής χρησιμοποιείται για την επαλήθευση της υπογραφής του προγράμματος εγκατάστασης του πακέτου. Έτσι, για παράδειγμα, δεν μπορείτε να εξαπατήσετε το AppIntegrity για να επιτρέψετε την εγκατάσταση ακόμα κι αν το κάνετε παραπλάνησε το Play Store ως εγκαταστάτης.

Πέρα από αυτό, δεν μπορέσαμε να μάθουμε ακριβώς πώς η Google χρησιμοποιεί το AppIntegrity και τα σχετικά API για να αποκλείσει τις ενημερώσεις πλευρικής φόρτωσης στις εφαρμογές Google Camera και Google Recorder. Μια γρήγορη εξέταση του APK των Υπηρεσιών Google Play αποκαλύπτει ότι χρησιμοποιεί αυτά τα API, αλλά ο κώδικας είναι πολύ συγκεχυμένος για να έχει πραγματικά νόημα για τα πάντα. Βρήκαμε ακόμη και τον κατάλογο όπου αποθηκεύονται οι κανόνες ακεραιότητας — /data/system/integrity_rules — αλλά ήταν ελάχιστα χρήσιμος επειδή περιέχει μόνο σειριακά δεδομένα. Επίσης, δεν βρήκαμε τρόπο να απενεργοποιήσουμε την επαλήθευση ακεραιότητας (δεν φαίνεται να είναι τόσο εύκολο όσο απλά αλλαγή μιας ρύθμισης), αν και πιστεύουμε ότι ο λόγος που η επαναφορά εργοστασιακών ρυθμίσεων λειτουργεί για ορισμένους είναι ότι οι Υπηρεσίες Google Play δεν έχουν την ευκαιρία να αρχικοποιήσουν το σύνολο κανόνων τους για να αποκλείσουν την εγκατάσταση. Το μήνυμα logcat και η εισαγωγή αυτών των νέων API στο Android 11 υποδηλώνουν έντονα ότι όλα αυτά είναι σχεδιαστικά και όχι σφάλμα.

Η Google δεν έχει σχολιάσει δημόσια σχετικά με τη χρήση αυτών των API (ούτε περιμένουμε να το κάνουν) και δεν απάντησε όταν τους ζητήθηκε σχόλιο. Ωστόσο, έχουμε μερικές θεωρίες γιατί μπλοκάρουν τις πλευρικές ενημερώσεις. Πρώτον, θα μπορούσαν να προστατεύουν τους ανθρώπους από την εγκατάσταση της λάθος έκδοσης της εφαρμογής για τη συσκευή τους. Η Google παρέχει συγκεκριμένες εκδόσεις των εφαρμογών της σε συγκεκριμένες συσκευές Pixel. Για παράδειγμα, πολλές εκδόσεις της εφαρμογής Υπηρεσίες εξατομίκευσης συσκευών μπορούν να βρεθούν στο διαδίκτυο. Παρόλο που όλα μπορούν να εγκατασταθούν σε συσκευές Pixel, ήταν δυνατό σε ένα σημείο χάσετε τη δυνατότητα Ζωντανοί υπότιτλοι στο Pixel 4 κατεβάζοντας μια έκδοση που έχει σχεδιαστεί για μια παλαιότερη συσκευή Pixel. Ένας άλλος λόγος θα μπορούσε να είναι η "βελτίωση της ιχνηλασιμότητας των εφαρμογών σε σχέση με τη μη εξουσιοδοτημένη διανομή", όπως εξηγείται από την Google στην κατηγορία SourceStampVerifier.

Μέχρι στιγμής, μόνο μερικές από τις εφαρμογές της Google που χρησιμοποιούν τη μορφή πακέτου εφαρμογών (όπως η Κάμερα Google και το Google Recorder) είναι αποκλεισμός εγκαταστάσεων εκτός του Play Store, αλλά δεν γνωρίζουμε αν η εταιρεία θα επεκτείνει αυτήν τη συμπεριφορά και στις άλλες εφαρμογές της μόλις μεταβούν όλοι στη μορφή AAB. Εξετάσαμε επίσης εάν η μετάβαση σε πακέτα εφαρμογών απαιτούσε την εφαρμογή της ακεραιότητας εφαρμογών, αλλά διαπιστώσαμε ότι η Google ήδη έχει λύση για να χειριστεί πότε οι χρήστες προσπαθούν να εγκαταστήσουν μια εφαρμογή που δεν έχει όλες τις απαιτούμενες διαιρέσεις. Όποια και αν είναι η περίπτωση, δεν πιστεύουμε ότι η Google σκοπεύει να αποκλείσει κάθε παράπλευρη φόρτωση των εφαρμογών της, αν και αυτά τα εργαλεία σίγουρα τους επιτρέπουν να το κάνουν.

Ευχαριστούμε τους προγραμματιστές vvb2060, aviraxp και Quinny899 για τη βοήθειά τους σε αυτό το άρθρο και tευχαριστούμε το PNF Software που μας παρείχε άδεια χρήσης JEB Decompiler, ένα εργαλείο αντίστροφης μηχανικής επαγγελματικής ποιότητας για εφαρμογές Android.