Ako ste vidjeli pogrešku "neuspješna provjera" prilikom bočnog učitavanja ažuriranja za aplikacije Google kamera ili snimač, pročitajte ovo da biste saznali zašto.
Kad je Google lansirao Pixel 5 u listopadu, bili smo uzbuđeni što smo se dočepali njegovih novih aplikacija. (Sam telefon je prilično cool, također.) S lansiranjem Pixela 5 stigle su i nove verzije Google fotoaparat i Google snimač aplikacije koje smo podijelili sa zajednicom. Međutim, kada su mnogi korisnici starijih Pixel uređaja pokušali sa strane učitati ažuriranja, naišli su na pogrešku (prikazano gore). Bizarno, nisu svi imali problema s instaliranjem ažuriranja. Neki su ih uspjeli sasvim dobro instalirati, dok su drugi morali vratiti tvorničke postavke samo kako bi mogli instalirati nove verzije. Zbog naizgled nasumične prirode ovog problema, mnogi su ga pripisali bugu. Sada smo prilično uvjereni da ovaj problem ne proizlazi iz greške, već Googleove upotrebe novog API-ja u Androidu 11 za blokiranje bočnog učitavanja ažuriranja.
Ako pokušate učitati Google Camera 8.0 ili noviju verziju ili Google Recorder 2.0 ili noviju verziju na Pixel uređaju s Androidom 11, vidjet ćete poruku o pogrešci koja kaže da provjera nije uspjela. Čak i ako pokušate bočno učitati APK pomoću naredbe ljuske, nećete dobiti precizniji razlog neuspjeha instalacije. Povratni kod instalacije koji ćete dobiti je "INSTALL_FAILED_VERIFICATION_FAILURE“, što vam nažalost ne govori zašto provjera ne uspijeva. Ispitivanjem logcat-a možemo točno saznati zašto provjera ne uspijeva:
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]
Prema ovoj poruci, provjera integriteta instalacije Google kamere nije uspjela jer "INSTALLER_NAME" ne odgovara "com.android.vending", nazivu paketa za Google Play Store. (Pokušavao sam instalirati Google Camera 8.0 pomoću aplikacije APKMirror Installer, koliko god to vrijedi.) Ovu je poruku u zapisnik sustava dodao "AppIntegrityManagerServiceImpl", koji je dio Androidove nove značajke "App Integrity". Prema kodu u AOSP-u, App Integrity dizajniran je za pružanje dodatnog sloja provjera povrh postojeće provjere APK potpisa upravitelja paketa. Čini se da App Integrity API koristi skup Pravila kako biste odlučili hoćete li dopustiti ili odbiti instalaciju. Pravila osigurava aplikacija sustava — za koju vjerujemo da su Google Play usluge — i jesu pohranjeni u datoteku.
Osim toga, Integritet aplikacije također poziva zove se drugi razred SourceStampVerifier ako je "izvorni pečat" ugrađen u metapodatke Manifesta. Na primjer, evo za što vjerujemo da je "izvorni pečat" iz Manifesta aplikacije Google Camera:
<meta-dataandroid: name="com.android.stamp.source"android: value="https://play.google.com/store"/>
Koliko možemo reći, izvorni pečat se koristi za provjeru potpisa instalacijskog paketa. Tako, na primjer, ne možete prevariti AppIntegrity da dopusti instalaciju čak i ako lažirao Trgovinu Play kao instalater.
Osim toga, nismo uspjeli točno saznati kako Google koristi AppIntegrity i povezane API-je za blokiranje bočnog učitavanja ažuriranja za aplikacije Google Camera i Google Recorder. Brzi pregled Google Play Services APK-a otkriva da koristi ove API-je, ali kod je previše zamagljen da bi stvarno imao smisla za sve. Čak smo pronašli direktorij u kojem su pohranjena pravila integriteta — /data/system/integrity_rules — ali nije bio od velike koristi jer sadrži samo serijalizirane podatke. Također nismo pronašli način da onemogućimo provjeru integriteta (ne čini se da je tako jednostavno kao mijenjanje postavke), iako vjerujemo da je razlog zašto vraćanje na tvorničke postavke funkcionira za neke taj što usluge Google Play nemaju priliku pokrenuti svoj skup pravila za blokiranje instalacije. Logcat poruka i uvođenje ovih novih API-ja u Androidu 11 snažno sugeriraju da je sve ovo samo po sebi, a ne pogreška.
Google nije javno komentirao svoju upotrebu ovih API-ja (niti to očekujemo od njih), a nisu odgovorili ni kada su zatražili komentar. No, imamo nekoliko teorija zašto blokiraju bočno učitana ažuriranja. Prvo, mogli bi štititi ljude od instaliranja pogrešne verzije aplikacije za njihov uređaj. Google isporučuje određene verzije svojih aplikacija na određene Pixel uređaje. Na primjer, nekoliko verzija aplikacije Device Personalization Services može se pronaći na internetu. Iako ih je sve moguće instalirati na Pixel uređaje, u jednom je trenutku bilo moguće izgubiti značajku Live Captions na Pixelu 4 preuzimanjem verzije izgrađene za stariji Pixel uređaj. Drugi razlog mogao bi biti "poboljšanje sljedivosti aplikacija s obzirom na neovlaštenu distribuciju", kako je objasnio Google u klasi SourceStampVerifier.
Do sada je samo nekoliko Googleovih aplikacija koje koriste format paketa aplikacija (kao što su Google kamera i Google snimač) blokiranje instaliranja izvan Trgovine Play, ali ne znamo hoće li tvrtka proširiti ovo ponašanje na svoje druge aplikacije nakon što svi prijeđu na AAB format. Također smo razmotrili je li prelazak na pakete aplikacija zahtijevao implementaciju App Integrityja, ali smo otkrili da Google već ima rješenje rješavati kada korisnici pokušaju instalirati aplikaciju koja nema sve potrebne podjele. Bez obzira na slučaj, ne mislimo da Google namjerava blokirati svako bočno učitavanje svojih aplikacija, iako im ovi alati to svakako dopuštaju.
Zahvaljujemo programerima vvb2060, aviraxp i Quinny899 na njihovoj pomoći u ovom članku i thvala PNF Software-u što nam je dao licencu za korištenje JEB Decompiler, profesionalni alat za obrnuti inženjering za Android aplikacije.