Hvordan omgå den skjulte API-svartelisten på Android 9+

click fraud protection

Google introduserte begrensninger i Android 9 for hvilke API-er som utviklere kan få tilgang til. Slik omgår du de skjulte API-begrensningene.

Helt tilbake i 2018 ga Google ut Android Pie. Blant UI-endringene og nye funksjoner var det også noen endringer på utviklersiden. Disse endringene inkluderte nye APIer, feilrettinger for eksisterende APIer og også restriksjoner på tilgang til skjulte APIer.

Heldigvis finnes det måter å omgå disse begrensningene på. Før jeg går inn på hvordan jeg kan omgå begrensningene, bør jeg forklare litt om hva skjulte APIer er, hvorfor de ble begrenset i utgangspunktet, og hvorfor du kanskje vil ha tilgang til dem.

Skjulte API-er er API-ene i Android som apputviklere vanligvis ikke kan se. Hvis du tar en titt på AOSPs kode, vil du se en hel haug med klasser, variabler og metoder som har en @hide kommentar inne i en kommentarblokk over dem.

Denne merknaden instruerer uansett hvilket verktøy Google bruker når SDK-en kompileres for å ekskludere varen under den. Denne SDK-en distribueres deretter til utviklere i SDK-ene som er lastet ned gjennom Android Studio. Med mindre du bruker en modifisert SDK, vil Android Studio tro at noen av de skjulte elementene bare ikke eksisterer. Hvis du prøver å bruke en direkte, vil den vise den i rødt og nekte å kompilere.

Det er mange grunner til at en API kan være skjult. Noen ting er kun ment å brukes av interne apper eller systemapper og vil ikke fungere hvis de brukes av en tredjepartsapp. Andre er eksperimentelle eller ustabile, og kan bli fjernet eller endret i fremtiden. Noen er til og med bare APIer Google bare ikke ønsker å bruke den normale avskrivningssyklusen til hvis de noen gang blir fjernet.

Mens standard Android SDK har en mye i det, noen ganger er det ikke nok. Noen ganger er det noe du vil gjøre som allerede eksisterer i Android, men som bare ikke er offentlig.

For eksempel mange av appene jeg lager, inkludert SystemUI-tuner og Låseskjerm-widgeter, bruk en haug med forskjellige skjulte APIer. SystemUI Tuner trenger tilgang til noen for å kunne spore, endre og tilbakestille alternativer. Lockscreen Widgets bruker blant annet noen for å vise bakgrunnen under den.

De fleste utviklere trenger ikke tilgang til skjulte APIer, men noen ganger kan de være ganske nyttige.

Med utgivelsen av Android 9 (Pie) introduserte Google den skjulte API-svartelisten. Ikke alle skjulte APIer var inkludert, og det var forskjellige nivåer av lister. Skjulte APIer på hvitelisten kan nås av alle. Skjulte API-er på lysgrålisten kan nås av alle apper, men kan være utilgjengelige i fremtidige versjoner av Android. Alt på den mørkegrå listen kunne bare nås av apper som målrettet API-nivåer før Pie (dvs. før API-nivå 28). Apper rettet mot Pie og senere vil bli nektet tilgang. Til slutt, skjulte API-er på svartelisten kunne ikke nås av noen apper som ikke er i systemet (eller ikke-hvitelistet), uansett mål-API.

Android 10 endret hvordan listene ble organisert, og forenklet dem litt, men ideen forble den samme. Enkelte skjulte APIer kunne nås av apper mens andre ble blokkert. Android 11 styrket tilgangsdeteksjonen til blokkere en bypass brukt til Pai og 10.

I alle Android-versjoner, hver gang en tredjepartsapp forsøker å få tilgang til en svartelistet skjult API, vil Android gi den aktuelle "ikke funnet"-feilen.

Det er faktisk ganske mange måter å komme forbi den skjulte API-svartelisten. Avhengig av dine behov, kan du velge de som fungerer for alle Android-versjoner, de som fungerer for bare Android 9 og 10, de som bruker innebygd C++-kode, og de som er fullt Java-baserte. Det er til og med en løsning kun for utvikling ved å bruke ADB.

ADB-løsning

Hvis enheten din kjører Android Pie, kjør følgende to ADB-kommandoer for å aktivere skjult API-tilgang.

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

Hvis enheten din kjører Android 10 eller nyere, kjør følgende ADB-kommando for å aktivere skjult API-tilgang.

adb shell settings put global hidden_api_policy 1

For å gå tilbake til standard oppførsel, bare bytt ut put med delete og fjern 1.

Åpenbart er disse kommandoene ikke akkurat nyttige for en produksjonsapp. Jeg kan fortelle deg på egen hånd at det er utrolig vanskelig å instruere brukere på riktig måte om hvordan de bruker ADB. Men de kan være nyttige hvis du trenger å oppdatere en gammel app for å overholde de nye begrensningene.

Native/JNI-løsning

Det er to måter du kan omgå den skjulte API-svartelisten ved å bruke JNI i Android-appen din. Den ene fungerer for Android 9 og 10, og den andre fungerer for Android 9 og nyere.

Android 9 og 10

Hvis du allerede har en innebygd del av appen din, vil dette være enkelt å implementere. Bare bruk JNI_OnLoad() funksjon.

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);
...
}

Vær oppmerksom på at denne metoden bare fungerer på Android 9 og 10.

Android 9 og nyere

For enhver versjon av Android kan du velge mellom to biblioteker for å omgå den skjulte API-begrensningen: FreeReflection og RestrictionBypass.

Begge er enkle å implementere og bruke.

For å implementere FreeReflection, legg til avhengigheten til build.gradle på modulnivå.

implementation 'me.weishu: free_reflection: 3.0.1'

Overstyr deretter attachBaseContext() i søknadsklassen din.

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

Hvis du ikke har en applikasjonsklasse, kan du legge den til ganske enkelt. Opprett en ny klasse som strekker seg Application og pek på den i AndroidManifest.xml.

Eksempel:

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

Reflection.unseal(base);
}
}

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

For å implementere RestrictionBypass, legg til JitPack-depotet til build.gradle på prosjektnivå.

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

Legg deretter til avhengigheten til build.gradle på modulnivå.

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

Og det er det. Dette biblioteket fjerner automatisk svartelisterestriksjonene.

Java-løsning

Selv om JNI-løsningene er effektive, er det tider du kanskje ikke vil bruke innfødt kode. Hvis du ikke allerede gjør ting i C++, kan det legge til unødvendig størrelse, sammen med plattformbegrensninger, til appen din. Heldigvis finnes det måter å omgå den skjulte API-svartelisten ved å bruke bare Java.

Android 9 og 10

I Android 9 og 10 kan du bruke det som kan kalles dobbel-refleksjon eller meta-refleksjon for å omgå den skjulte API-svartelisten. Fordi systemet bare sjekker hvilke tredjepartsapper som kaller, lurer dobbeltrefleksjon det til å tro at systemet foretar de skjulte API-kallene.

Dette trikset kan brukes til å kalle en metode for å gi appen din skjulte API-unntak, passende navn setHiddenApiExemptions(). Bare legg til følgende kode et sted tidlig i appens livssyklus (for eksempel applikasjonens onCreate() metoden), og den vil håndtere omgåelse av svartelisten.

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" } });

Hvis appen din er kompatibel med versjoner av Android lavere enn 9, husk å pakke dette inn i en versjonssjekk.

Android 9 og nyere

For å omgå den skjulte API-svartelisten på Android 9 og senere versjoner, kan du bruke LSPoseds bibliotek. Dette biblioteket bruker Javas Unsafe API, så det er usannsynlig at det noen gang vil gå i stykker.

For å implementere det, bare legg til avhengigheten til build.gradle på modulnivå.

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

Bruk den deretter til å omgå svartelisten.

HiddenApiBypass.addHiddenApiExemptions("L");

Hvis appen din er kompatibel med versjoner av Android lavere enn 9, husk å pakke dette inn i en versjonssjekk.

Konklusjon og mer info

Det er mange alternativer for å omgå den skjulte API-svartelisten på Android, uansett hvilken plattformversjon du målretter mot eller bruker. Hvis du er nysgjerrig på å lære mer om hvordan disse metodene og bibliotekene fungerer, bør du sjekke ut følgende lenker.

  • My Stack Overflow Q&A.
  • LSposeds Hidden API Bypass-bibliotek på GitHub.
  • ChickenHooks RestrictionBypass-bibliotek på GitHub.
  • tianns FreeReflection-bibliotek på GitHub.
  • Googles dokumentasjon på den skjulte API-svartelisten.