Kuinka ohittaa piilotetun API-mustan listan Android 9+ -käyttöjärjestelmässä

Google otti käyttöön Android 9:ssä rajoituksia, joissa kehittäjät voivat käyttää sovellusliittymiä. Näin voit ohittaa piilotetut API-rajoitukset.

Jo vuonna 2018 Google julkaisi Android Pien. Käyttöliittymämuutosten ja uusien ominaisuuksien joukossa oli myös joitain kehittäjäpuolen muutoksia. Muutokset sisälsivät uusia sovellusliittymiä, virheenkorjauksia olemassa oleviin sovellusliittymiin ja myös piilotettuihin sovellusliittymiin pääsyn rajoituksia.

Onneksi on kuitenkin tapoja kiertää nämä rajoitukset. Ennen kuin käsittelen rajoitusten ohittamista, minun pitäisi selittää hieman, mitä piilotetut API: t ovat, miksi niitä alun perin rajoitettiin ja miksi saatat haluta käyttää niitä.

Piilotetut sovellusliittymät ovat Androidin sovellusliittymiä, joita sovelluskehittäjät eivät yleensä näe. Jos katsot AOSP: n koodia, näet koko joukon luokkia, muuttujia ja menetelmiä, joilla on @hide huomautus niiden yläpuolella olevassa kommenttilohkossa.

Tämä merkintä opastaa mitä tahansa työkalua, jota Google käyttää SDK: ta kääntäessään sulkemaan pois sen alaisen kohteen. Tämä SDK jaetaan sitten kehittäjille Android Studion kautta ladattujen SDK: iden sisällä. Ellet käytä muokattua SDK: ta, Android Studio luulee, ettei mitään näistä piilotetuista kohteista ole olemassa. Jos yrität käyttää sitä suoraan, se näyttää sen punaisena ja kieltäytyy kääntämästä.

On monia syitä, miksi API voi olla piilotettu. Jotkut asiat on tarkoitettu vain sisäisten tai järjestelmäsovellusten käyttöön, eivätkä ne toimi, jos niitä käyttävät kolmannen osapuolen sovellus. Toiset ovat kokeellisia tai epävakaita, ja ne voidaan poistaa tai muuttaa tulevaisuudessa. Jotkut ovat jopa vain sovellusliittymiä, joihin Google ei vain halua soveltaa normaalia poistumisjaksoa, jos ne koskaan poistetaan.

Vaikka tavallisessa Android SDK: ssa on a paljon siinä joskus se ei riitä. Joskus haluat tehdä jotain, joka on jo olemassa Androidissa, mutta joka ei vain ole julkisesti esillä.

Esimerkiksi monet tekemäni sovellukset, mukaan lukien SystemUI-viritin ja Lukitusnäytön widgetit, käytä erilaisia ​​piilotettuja API-liittymiä. SystemUI Tuner tarvitsee pääsyn joihinkin, jotta se voi seurata, muuttaa ja nollata asetuksia oikein. Lockscreen Widgets käyttää joitain näyttääkseen taustakuvan muun muassa sen alla.

Useimpien kehittäjien ei tarvitse käyttää piilotettuja sovellusliittymiä, mutta joskus ne voivat olla melko hyödyllisiä.

Android 9:n (Pie) julkaisun myötä Google esitteli piilotetun API: n mustan listan. Kaikkia piilotettuja sovellusliittymiä ei ollut mukana, ja luetteloita oli eri tasoilla. Sallittujen luettelon piilotettuja sovellusliittymiä voi käyttää kuka tahansa. Vaaleanharmaalla listalla olevia piilotettuja sovellusliittymiä voi käyttää mikä tahansa sovellus, mutta ne eivät ehkä ole käytettävissä Androidin tulevissa versioissa. Kaikkeen tummanharmaalla listalla oli pääsy vain sovelluksilla, jotka kohdistavat API-tasoille ennen Pie: tä (eli ennen API-tasoa 28). Pie-sovellukseen ja sitä uudempaan kohdistavien sovellusten käyttö estetään. Lopuksi, mustalla listalla olevia piilotettuja sovellusliittymiä ei voinut käyttää millään muulla kuin järjestelmällä (tai ei-sallitulla) sovelluksella kohde-API: sta riippumatta.

Android 10 muutti luetteloiden järjestystä ja yksinkertaisti niitä hieman, mutta idea pysyi samana. Sovellukset voivat käyttää tiettyjä piilotettuja sovellusliittymiä, kun taas toiset estettiin. Android 11 vahvisti pääsyntunnistusta to estää ohituksen käytetään Pie ja 10.

Kaikissa Android-versioissa aina kun kolmannen osapuolen sovellus yrittää käyttää mustalla listalla olevaa piilotettua sovellusliittymää, Android antaa asianmukaisen "ei löydy" -virheen.

Piilotetun API: n mustan listan ohittamiseksi on itse asiassa melko monia tapoja. Tarpeittesi mukaan voit valita versiot, jotka toimivat kaikissa Android-versioissa, sellaisia, jotka toimivat vain Android 9:ssä ja 10:ssä, jotka käyttävät alkuperäistä C++-koodia, ja sellaisia, jotka ovat täysin Java-pohjaisia. ADB: tä käyttämällä on jopa vain kehitystä koskeva kiertotapa.

ADB-kiertotapa

Jos laitteessasi on Android Pie, suorita seuraavat kaksi ADB-komentoa salliaksesi piilotetun API-käytön.

adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1

Jos laitteessasi on Android 10 tai uudempi, suorita seuraava ADB-komento ottaaksesi piilotetun API-käytön käyttöön.

adb shell settings put global hidden_api_policy 1

Jos haluat palauttaa oletuskäytön, vaihda se put kanssa delete ja poista 1.

Ilmeisesti nämä komennot eivät ole aivan hyödyllisiä tuotantosovellukselle. Voin kertoa sinulle ensi käden, että käyttäjien oikea ohjeistus ADB: n käytössä on uskomattoman vaikeaa. Ne voivat kuitenkin olla hyödyllisiä, jos sinun on päivitettävä vanha sovellus uusien rajoitusten mukaiseksi.

Alkuperäinen/JNI-kiertotapa

Voit ohittaa piilotetun API: n mustan listan kahdella tavalla käyttämällä JNI: tä Android-sovelluksessasi. Toinen toimii Android 9:ssä ja 10:ssä ja toinen Android 9:ssä ja uudemmissa.

Android 9 ja 10

Jos sinulla on jo sovelluksesi alkuperäinen osa, sen käyttöönotto on helppoa. Käytä vain JNI_OnLoad() toiminto.

static art:: Runtime* runtime = nullptr;

extern "C"jint JNI_OnLoad(JavaVM *vm, void *reserved){
...
runtime = reinterpret_cast<: javavmext>(vm)->GetRuntime();
runtime->SetHiddenApiEnforcementPolicy(art:: hiddenapi:: EnforcementPolicy:: kNoChecks);
...
}

Huomaa, että tämä menetelmä toimii vain Android 9:ssä ja 10:ssä.

Android 9 ja uudemmat

Missä tahansa Android-versiossa voit valita kahdesta kirjastosta piilotetun API-rajoituksen ohittamiseksi: FreeReflection ja RestrictionBypass.

Molemmat ovat helppoja toteuttaa ja käyttää.

FreeReflectionin toteuttamiseen, lisää riippuvuus moduulitason build.gradle-tiedostoon.

implementation 'me.weishu: free_reflection: 3.0.1'

Ohita sitten attachBaseContext() sovellusluokassasi.

@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}

Jos sinulla ei ole Sovellusluokkaa, voit lisätä sen melko helposti. Luo uusi luokka, joka laajenee Application ja osoita sitä AndroidManifest.xml-tiedostossa.

Esimerkki:

publicclassAppextendsApplication{
...
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);

Reflection.unseal(base);
}
}

<manifest>
...
...
name=".App">
...
application>
manifest>

RestrictionBypassin toteuttaminen, lisää JitPack-arkisto projektitason build.gradle-tiedostoon.

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Lisää sitten riippuvuus moduulitason build.gradle-tiedostoon.

implementation 'com.github.ChickenHook: RestrictionBypass: 2.2'

Ja siinä se. Tämä kirjasto poistaa automaattisesti mustan listan rajoitukset.

Java-kiertotapa

Vaikka JNI-ratkaisut ovat tehokkaita, joskus et ehkä halua käyttää alkuperäistä koodia. Jos et vielä tee asioita C++:ssa, se voi lisätä sovellukseesi tarpeetonta kokoa ja alustarajoituksia. Onneksi on olemassa tapoja ohittaa piilotettu API musta lista käyttämällä vain Javaa.

Android 9 ja 10

Android 9:ssä ja 10:ssä voit käyttää niin kutsuttua kaksoisheijastusta tai metaheijastusta ohittaaksesi piilotetun API-mustan listan. Koska järjestelmä tarkistaa vain, mitä kolmannen osapuolen sovellukset kutsuvat, kaksoisreflektio huijaa sen ajattelemaan, että järjestelmä tekee piilotetut API-kutsut.

Tätä temppua voidaan käyttää kutsumaan menetelmää, jolla sovelluksellesi annetaan osuvasti nimettyjä piilotettuja API-vapautuksia setHiddenApiExemptions(). Lisää vain seuraava koodi jonnekin sovelluksesi elinkaaren alkuvaiheessa (kuten Sovelluksen onCreate() menetelmä), ja se käsittelee mustan listan ohituksen.

Method forName = Class.class.getDeclaredMethod("forName", String.class);
Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);

Class vmRuntimeClass = (Class) forName.invoke(null, "dalvik.system.VMRuntime");
Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null);
Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", newClass[] { String[].class} );

Object vmRuntime = getRuntime.invoke(null);
setHiddenApiExemptions.invoke(vmRuntime, newString[][] { newString[] { "L" } });

Jos sovelluksesi on yhteensopiva Android 9:tä vanhempien versioiden kanssa, muista kääriä tämä versiontarkistukseen.

Android 9 ja uudemmat

Voit ohittaa piilotetun API-mustan listan Android 9:ssä ja kaikissa myöhemmissä versioissa käyttämällä LSPosedin kirjastoa. Tämä kirjasto käyttää Javan Unsafe API: ta, joten se ei todennäköisesti koskaan hajoa.

Ota se käyttöön lisäämällä riippuvuus moduulitason build.gradle-tiedostoon.

implementation 'org.lsposed.hiddenapibypass: hiddenapibypass: 2.0'

Käytä sitä sitten mustan listan ohittamiseen.

HiddenApiBypass.addHiddenApiExemptions("L");

Jos sovelluksesi on yhteensopiva Android 9:tä vanhempien versioiden kanssa, muista kääriä tämä versiontarkistukseen.

Johtopäätös ja lisätiedot

Androidissa on paljon vaihtoehtoja piilotetun API-mustan listan ohittamiseksi riippumatta siitä, mihin alustaversioon kohdistat tai käytät. Jos haluat tietää lisää näiden menetelmien ja kirjastojen toiminnasta, muista tutustua seuraaviin linkkeihin.

  • My Stack Overflow Q&A.
  • LSposedin Hidden API Bypass -kirjasto GitHubissa.
  • ChickenHook's RestrictionBypass-kirjasto GitHubissa.
  • tiannin FreeReflection-kirjasto GitHubissa.
  • Googlen dokumentaatio piilotetun API: n mustasta listasta.