Ако сте виждали грешка „неуспешна проверка“ при странично зареждане на актуализация на приложенията 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 „App Integrity“. Според кода в AOSP, App Integrity е проектиран да предоставя допълнителен слой проверки върху съществуващата проверка на подписа на APK на мениджъра на пакети. API за целостта на приложението изглежда използва набор от правила за да решите дали да разрешите или откажете инсталирането. Правилата се предоставят от системно приложение — което смятаме, че е Google Play Services — и е така съхранявани във файл.
В допълнение, App Integrity също се обажда друг клас се обади SourceStampVerifier ако в метаданните на манифеста е вграден "печат на източника". Например, ето какво според нас е „печатът на източника“ от манифеста на приложението 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 Services разкрива, че той използва тези API, но кодът е твърде объркан, за да има смисъл във всичко. Дори открихме директорията, в която се съхраняват правилата за интегритет — /data/system/integrity_rules — но тя беше малко полезна, защото съдържа само сериализирани данни. Също така не намерихме начин да деактивираме проверката на целостта (изглежда не е толкова лесно, колкото просто промяна на настройка), въпреки че смятаме, че причината възстановяването на фабричните настройки да работи за някои е, че услугите на Google Play не получават шанс да инициализират своя набор от правила, за да блокират инсталирането. Съобщението logcat и въвеждането на тези нови API в Android 11 силно подсказват, че всичко това е проектирано, а не грешка.
Google не е коментирал публично използването на тези API (нито очакваме от тях) и те не са отговорили, когато са потърсени за коментар. Все пак имаме няколко теории защо те блокират странично заредени актуализации. Първо, те може да предпазват хората от инсталиране на грешна версия на приложението за тяхното устройство. Google доставя конкретни версии на своите приложения на конкретни устройства Pixel. Например, няколко версии на приложението Device Personalization Services могат да бъдат намерени онлайн. Въпреки че всички те могат да се инсталират на устройства Pixel, в един момент беше възможно загубите функцията Надписи на живо на Pixel 4, като изтеглите версия, създадена за по-старо устройство Pixel. Друга причина може да бъде „подобряване на проследимостта на приложенията по отношение на неоторизирано разпространение“, както е обяснено от Google в класа SourceStampVerifier.
Досега само няколко от приложенията на Google, използващи формата на пакета приложения (като Google Камера и Google Рекордер), са блокиране на инсталации извън Play Store, но не знаем дали компанията ще разшири това поведение към другите си приложения след като всички преминат към AAB формат. Също така обмислихме дали преминаването към пакети приложения налага прилагането на App Integrity, но открихме, че Google вече има решение за справяне, когато потребителите се опитват да инсталират приложение, което няма всички необходими раздели. Какъвто и да е случаят, ние не смятаме, че Google възнамерява да блокира цялото странично зареждане на своите приложения, въпреки че тези инструменти със сигурност им позволяват да го направят.
Благодаря на разработчиците vvb2060, aviraxp и Quinny899 за тяхната помощ в тази статия и тблагодарим на PNF Software за предоставянето на лиценз за използване JEB декомпилатор, професионален инструмент за обратно инженерство за приложения за Android.