Jei įkeldami naujinį į „Google“ fotoaparato ar įrašymo programas matėte klaidą „nepavyko patvirtinti“, perskaitykite tai, kad sužinotumėte, kodėl.
Kai spalį „Google“ pristatė „Pixel 5“, džiaugiamės galėdami pasinaudoti naujomis jo programomis. (Pats telefonas yra gana kietasTaip pat.) Pristačius „Pixel 5“, pasirodė naujos versijos „Google“ fotoaparatas ir „Google“ įrašymo priemonė programas, kurias bendrinome su bendruomene. Tačiau kai daugelis senesnių „Pixel“ įrenginių naudotojų bandė įkelti naujinimus iš šono, juose įvyko klaida (parodyta aukščiau). Keista, bet ne visi turėjo problemų diegdami naujinimus. Kai kurie galėjo juos įdiegti puikiai, o kiti turėjo atkurti gamyklinius nustatymus, kad galėtų įdiegti naujas versijas. Dėl iš pažiūros atsitiktinio šios problemos pobūdžio daugelis ją įvertino kaip klaidą. Dabar esame gana įsitikinę, kad ši problema kyla ne dėl klaidos, o dėl to, kad „Google“ naudoja naują API 11 versijos „Android“, kad blokuotų šalutinių naujinimų įkėlimą.
Jei bandysite įkelti „Google“ fotoaparato 8.0 ar naujesnę versiją arba „Google Recorder“ 2.0 ar naujesnę versiją į „Pixel“ įrenginį, kuriame veikia „Android 11“, pamatysite klaidos pranešimą, kuriame teigiama, kad patvirtinimas nepavyko. Net jei bandysite įkelti APK naudodami apvalkalo komandą, konkretesnės diegimo nesėkmės priežasties negausite. Diegimo grąžinimo kodas, kuris jums bus suteiktas yra "
INSTALL_FAILED_VERIFICATION_FAILURE“, kuri, deja, nepasako, kodėl nepavyksta patvirtinti. Išnagrinėję logcat, galime tiksliai sužinoti, kodėl patvirtinimas nepavyksta: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]
Pagal šį pranešimą nepavyko patikrinti „Google“ fotoaparato diegimo vientisumo, nes „INSTALLER_NAME“ neatitiko „com.android.vending“, „Google Play“ parduotuvės paketo pavadinimo. (Bandžiau įdiegti „Google Camera 8.0“ naudodamas „APKMirror Installer“ programą, ko verta.) Šį pranešimą į sistemos žurnalą įtraukė „AppIntegrityManagerServiceImpl“, kuri yra naujos „Android“ funkcijos „App Integrity“ dalis. Pagal AOSP kodą, programos vientisumas sukurtas taip, kad būtų papildomai tikrinama paketo tvarkytuvėje esanti APK parašo patikra. Atrodo, kad programos vientisumo API naudoja rinkinį Taisyklės nuspręsti, ar leisti ar neleisti diegti. Taisyklės pateikiamos sistemos programoje, kuri, mūsų manymu, yra „Google Play“ paslaugos, ir yra saugomi faile.
Be to, programos vientisumas taip pat skambina paskambino kita klasė SourceStampVerifier jei „šaltinio antspaudas“ yra įdėtas į manifesto metaduomenis. Pavyzdžiui, štai kas, mūsų manymu, yra „šaltinio antspaudas“ iš „Google“ fotoaparato programos manifesto:
<meta-dataandroid: name="com.android.stamp.source"android: value="https://play.google.com/store"/>
Iš to, ką galime pasakyti, šaltinio antspaudas naudojamas paketo diegimo programos parašui patikrinti. Taigi, pavyzdžiui, negalite apgauti „AppIntegrity“ ir leisti įdiegti, net jei jūs suklastojo „Play“ parduotuvę kaip montuotojas.
Be to, mums nepavyko tiksliai sužinoti, kaip „Google“ naudoja „AppIntegrity“ ir susijusias API, kad blokuotų „Google“ fotoaparato ir „Google Recorder“ programų naujinimus. Greitai išnagrinėjus „Google Play“ paslaugų APK, paaiškėja, kad jame naudojamos šios API, tačiau kodas yra per daug užmaskuotas, kad iš tikrųjų viską suprastų. Netgi radome katalogą, kuriame saugomos vientisumo taisyklės – /data/system/integrity_rules – bet iš jo buvo mažai naudos, nes jame yra tik nuoseklūs duomenys. Taip pat neradome būdo, kaip išjungti vientisumo patvirtinimą (atrodo, kad tai nėra taip paprasta pakeisti nustatymą). „Logcat“ pranešimas ir šių naujų API įvedimas „Android 11“ aiškiai rodo, kad visa tai yra sukurta, o ne klaida.
„Google“ viešai nekomentavo šių API naudojimo (ir mes nesitikime, kad jie to padarys) ir jie neatsakė, kai buvo susisiekta su komentarais. Tačiau turime keletą teorijų, kodėl jie blokuoja įkeltus naujinimus. Pirma, jie gali apsaugoti žmones nuo netinkamos programos versijos įdiegimo savo įrenginyje. „Google“ pateikia konkrečias savo programų versijas į konkrečius „Pixel“ įrenginius. Pavyzdžiui, internete galima rasti kelias Įrenginio personalizavimo paslaugų programos versijas. Nors juos visus galima įdiegti „Pixel“ įrenginiuose, vienu metu tai buvo įmanoma prarasti tiesioginių subtitrų funkciją „Pixel 4“ atsisiųsdami versiją, sukurtą senesniam „Pixel“ įrenginiui. Kita priežastis gali būti „pagerinti programų atsekamumą neteisėto platinimo atžvilgiu“, kaip paaiškino „Google“ „SourceStampVerifier“ klasėje.
Kol kas tik kelios „Google“ programos, naudojančios programų paketo formatą (pvz., „Google“ fotoaparatas ir „Google Recorder“), yra blokuoja ne „Play“ parduotuvės diegimus, tačiau nežinome, ar įmonė išplės šį elgesį kitoms savo programoms kai jie visi persijungs į AAB formatą. Taip pat svarstėme, ar perėjus prie programų paketų reikėjo įdiegti programos vientisumą, bet nustatėme, kad „Google“ jau turi sprendimą tvarkyti, kai naudotojai bando įdiegti programą, kurioje nėra visų reikiamų dalių. Kad ir kaip būtų, nemanome, kad „Google“ ketina blokuoti bet kokį savo programų įkėlimą iš šono, nors šie įrankiai tikrai leidžia tai padaryti.
Dėkojame kūrėjams vvb2060, aviraxp ir Quinny899 už pagalbą šiame straipsnyje ir tdėkojame PNF programinei įrangai, kuri suteikė mums naudojimosi licenciją JEB dekompiliatorius, profesionalaus lygio atvirkštinės inžinerijos įrankis, skirtas „Android“ programoms.