Google kehtestas Android 9-s piirangud, mille puhul arendajad saavad API-dele juurde pääseda. Siit saate teada, kuidas neist peidetud API piirangutest mööda minna.
Aastal 2018 andis Google välja Android Pie. Kasutajaliidese muudatuste ja uute funktsioonide hulgas olid ka mõned arendajapoolsed muudatused. Need muudatused hõlmasid uusi API-sid, olemasolevate API-de veaparandusi ja ka piirangud juurdepääsul peidetud API-dele.
Õnneks on siiski viise, kuidas neist piirangutest mööda hiilida. Enne kui hakkan piirangutest mööda hiilima, peaksin veidi selgitama, mis on peidetud API-d, miks neid üldse piirati ja miks võiksite neile juurde pääseda.
Varjatud API-d on Androidi API-d, mida rakenduste arendajad tavaliselt ei näe. Kui vaatate AOSP koodi, näete tervet hulka klasse, muutujaid ja meetodeid, millel on @hide
märkus nende kohal olevas kommentaariplokis.
See märkus juhendab mis tahes tööriista, mida Google SDK koostamisel kasutab, et üksus selle all välja jätta. Seejärel levitatakse seda SDK-d arendajatele Android Studio kaudu alla laaditud SDK-des. Kui te ei kasuta muudetud SDK-d, arvab Android Studio, et neid peidetud üksusi lihtsalt pole. Kui proovite seda otse kasutada, kuvatakse see punaselt ja keeldub kompileerimisest.
Põhjuseid, miks API võib olla peidetud, on palju. Mõned asjad on mõeldud kasutamiseks ainult sisemiste või süsteemirakenduste jaoks ja ei tööta, kui neid kasutab kolmanda osapoole rakendus. Teised on eksperimentaalsed või ebastabiilsed ning neid võidakse tulevikus eemaldada või muuta. Mõned neist on isegi lihtsalt API-liidesed, millele Google lihtsalt ei soovi tavalist amortisatsioonitsüklit rakendada, kui need kunagi eemaldatakse.
Kuigi standardsel Android SDK-l on a palju selles mõnikord ei piisa. Mõnikord on midagi, mida soovite teha, mis on Androidis juba olemas, kuid mida lihtsalt ei avalikustata.
Näiteks paljud minu loodud rakendused, sealhulgas SystemUI tuuner ja Lukustusekraani vidinad, kasutage erinevaid peidetud API-sid. SystemUI Tuner peab mõnele juurde pääsema, et suvandeid õigesti jälgida, muuta ja lähtestada. Lockscreen Widgets kasutab mõnda muu hulgas taustapildi kuvamiseks selle all.
Enamikul arendajatel pole vaja juurdepääsu peidetud API-dele, kuid mõnikord võivad need olla üsna kasulikud.
Android 9 (Pie) väljalaskmisega tutvustas Google peidetud API musta nimekirja. Kõiki peidetud API-sid ei lisatud ja loendeid oli erineval tasemel. Valges nimekirjas olevatele peidetud API-dele pääsevad juurde kõik. Helehallis loendis olevatele peidetud API-dele pääseb juurde mis tahes rakendus, kuid Androidi tulevastes versioonides ei pruugi need olla juurdepääsetavad. Kõikidele tumehallis loendis olevatele asjadele pääsesid juurde ainult rakendused, mis sihivad API tasemeid enne Pie (st enne API taset 28). Rakendustele, mis sihivad Pie ja hilisemaid, keelatakse juurdepääs. Lõpuks ei pääsenud mustas nimekirjas olevatele peidetud API-dele juurde ükski süsteemne (või valgesse loendisse kantud) rakendus, olenemata siht-API-st.
Android 10 muutis loendite korraldust ja lihtsustas neid veidi, kuid idee jäi samaks. Rakendused pääsesid juurde teatud peidetud API-dele, samas kui teised olid blokeeritud. Android 11 tugevdas juurdepääsu tuvastamist juurde blokeerida möödaviigu kasutatakse Pie ja 10 jaoks.
Kõikides Androidi versioonides annab Android iga kord, kui kolmanda osapoole rakendus üritab pääseda juurde musta nimekirja kantud peidetud API-le, vastava veateate "ei leitud".
Peidetud API mustast nimekirjast pääsemiseks on tegelikult üsna palju võimalusi. Sõltuvalt teie vajadustest saate valida need, mis töötavad kõigi Androidi versioonide jaoks, need, mis töötavad ainult operatsioonisüsteemidega Android 9 ja 10, need, mis kasutavad natiivset C++ koodi, ja need, mis on täielikult Java-põhised. ADB-d kasutades on isegi ainult arenduspõhine lahendus.
ADB lahendus
Kui teie seadmes töötab Android Pie, käivitage peidetud API-juurdepääsu lubamiseks järgmised kaks ADB-käsku.
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
Kui teie seadmes töötab Android 10 või uuem, käivitage peidetud API-juurdepääsu lubamiseks järgmine ADB-käsk.
adb shell settings put global hidden_api_policy 1
Vaikekäitumise naasmiseks lihtsalt asendage put
koos delete
ja eemaldage 1
.
Ilmselgelt pole need käsud tootmisrakenduse jaoks kasulikud. Võin teile kohe öelda, et kasutajate õige juhendamine ADB kasutamise kohta on uskumatult keeruline. Kuid need võivad olla kasulikud, kui peate uute piirangute järgimiseks värskendama vana rakendust.
Native/JNI lahendus
Peidetud API mustast nimekirjast saab mööda minna kahel viisil, kasutades oma Androidi rakenduses JNI-d. Üks töötab Android 9 ja 10 ning teine Android 9 ja uuemate versioonide jaoks.
Android 9 ja 10
Kui teil on rakenduse algosa juba olemas, on seda lihtne rakendada. Kasutage lihtsalt JNI_OnLoad()
funktsiooni.
staatiline kunst:: Käitusaeg* käitusaeg = nullptr;
extern "C"jint JNI_OnLoad(JavaVM *vm, void *reserved){
...
runtime = reinterpret_cast<: javavmext>(vm)->GetRuntime();
runtime->SetHiddenApiEnforcementPolicy(art:: hiddenapi:: EnforcementPolicy:: kNoChecks);
...
}
Pidage meeles, et see meetod töötab ainult operatsioonisüsteemides Android 9 ja 10.
Android 9 ja uuemad
Iga Androidi versiooni puhul saate peidetud API piirangust mööda minna kahe teegi vahel: FreeReflection ja RestrictionBypass.
Mõlemat on lihtne rakendada ja kasutada.
FreeReflectioni rakendamiseks, lisage sõltuvus oma moodulitasemele build.gradle.
implementation 'me.weishu: free_reflection: 3.0.1'
Seejärel tühista attachBaseContext()
oma rakenduste klassis.
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}
Kui teil pole rakendusklassi, saate selle üsna lihtsalt lisada. Looge uus klass, mis laieneb Application
ja osutage sellele failis AndroidManifest.xml.
Näide:
publicclassAppextendsApplication{
...
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}
}
<manifest>
...
...
name=".App">
...
application>
manifest>
RestrictionBypassi rakendamiseks, lisage JitPacki hoidla oma projektitasemele build.gradle.
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Seejärel lisage sõltuvus oma moodulitasemele build.gradle.
implementation 'com.github.ChickenHook: RestrictionBypass: 2.2'
Ja see ongi kõik. See teek eemaldab automaatselt musta nimekirja piirangud.
Java lahendus
Kuigi JNI-lahendused on tõhusad, võib juhtuda, et te ei soovi omakoodi kasutada. Kui te veel C++-s asju ei tee, võib see teie rakendusele lisada tarbetut suurust koos platvormipiirangutega. Õnneks on võimalusi peidetud API mustast nimekirjast mööda minna, kasutades ainult Java.
Android 9 ja 10
Android 9 ja 10 puhul saate peidetud API mustast nimekirjast mööda hiilimiseks kasutada seda, mida võib nimetada topeltpeegelduseks või metapeegelduseks. Kuna süsteem kontrollib ainult seda, mida kolmanda osapoole rakendused helistavad, paneb topeltpeegeldus seda arvama, et süsteem teeb peidetud API-kõnesid.
Seda trikki saab kasutada meetodi kutsumiseks, et anda teie rakendusele peidetud API erandid, millel on tabav nimi setHiddenApiExemptions()
. Lihtsalt lisage järgmine kood kuskil oma rakenduse elutsükli alguses (nt rakenduse oma onCreate()
meetod) ja see tegeleb mustast nimekirjast möödahiilimisega.
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" } });
Kui teie rakendus ühildub Androidi versioonidega, mis on vanemad kui 9, ärge unustage seda versioonikontrolliga mässida.
Android 9 ja uuemad
Varjatud API mustast nimekirjast kõrvalehoidmiseks operatsioonisüsteemis Android 9 ja mis tahes hilisemas versioonis saate kasutada LSPosedi teeki. See teek kasutab Java Unsafe API-t, seega on ebatõenäoline, et see kunagi puruneb.
Selle rakendamiseks lisage lihtsalt sõltuvus oma mooduli tasemel faili build.gradle.
implementation 'org.lsposed.hiddenapibypass: hiddenapibypass: 2.0'
Seejärel kasutage seda mustast nimekirjast möödahiilimiseks.
HiddenApiBypass.addHiddenApiExemptions("L");
Kui teie rakendus ühildub Androidi versioonidega, mis on vanemad kui 9, ärge unustage seda versioonikontrolliga mässida.
Järeldus ja lisateave
Androidis on peidetud API mustast nimekirjast möödahiilimiseks palju võimalusi, olenemata sellest, millist platvormi versiooni sihite või kasutate. Kui soovite nende meetodite ja teekide toimimise kohta lisateavet, vaadake kindlasti järgmisi linke.
- Minu Stack Overflow küsimused ja vastused.
- LSposedi peidetud API möödaviigu teek GitHubis.
- ChickenHooki RestrictionBypassi teek GitHubis.
- tianni FreeReflectioni teek GitHubis.
- Google'i dokumentatsioon peidetud API musta nimekirja kohta.