Kaip apeiti paslėptą API juodąjį sąrašą 9 ir naujesnėse versijose „Android“.

„Google“ įvedė apribojimus „Android 9“, kuriuose kūrėjai gali pasiekti API. Štai kaip apeiti tuos paslėptus API apribojimus.

Dar 2018 m. „Google“ išleido „Android Pie“. Tarp vartotojo sąsajos pakeitimų ir naujų funkcijų taip pat buvo keletas kūrėjo pusės pakeitimų. Šie pakeitimai apėmė naujas API, esamų API klaidų pataisymus ir taip pat prieigos prie paslėptų API apribojimai.

Laimei, yra būdų, kaip apeiti šiuos apribojimus. Prieš pradėdamas apeiti apribojimus, turėčiau šiek tiek paaiškinti, kas yra paslėptos API, kodėl jos buvo apribotos ir kodėl galbūt norėsite jas pasiekti.

Paslėptos API yra „Android“ API, kurių programų kūrėjai paprastai nemato. Jei pažvelgsite į AOSP kodą, pamatysite daugybę klasių, kintamųjų ir metodų, kurie turi @hide komentarą virš jų esančiame komentarų bloke.

Šis komentaras nurodo, kokį įrankį „Google“ naudoja sudarydama SDK, kad neįtrauktų elemento. Tada šis SDK platinamas kūrėjams SDK, atsisiųstuose iš „Android Studio“. Jei nenaudosite modifikuoto SDK, „Android Studio“ manys, kad bet kurio iš tų paslėptų elementų tiesiog nėra. Jei bandysite jį naudoti tiesiogiai, jis bus rodomas raudonai ir atsisakys kompiliuoti.

Yra daug priežasčių, kodėl API gali būti paslėpta. Kai kurie dalykai skirti naudoti tik vidinėms arba sistemos programoms ir neveiks, jei juos naudos trečiosios šalies programa. Kiti yra eksperimentiniai arba nestabilūs ir gali būti pašalinti arba pakeisti ateityje. Kai kurios yra net tik API, kurių „Google“ tiesiog nenori taikyti įprasto naudojimo nutraukimo ciklo, jei jie kada nors bus pašalinti.

Nors standartinis Android SDK turi a daug joje kartais to neužtenka. Kartais kažkas, ką norite padaryti, jau yra sistemoje „Android“, bet nėra viešai atskleista.

Pavyzdžiui, daugelis mano sukurtų programų, įskaitant SystemUI imtuvas ir Užrakinimo ekrano valdikliai, naudokite daugybę skirtingų paslėptų API. „SystemUI Tuner“ turi pasiekti kai kurias, kad galėtų tinkamai stebėti, keisti ir iš naujo nustatyti parinktis. „Lockscreen Widgets“ kai kuriuos naudoja, kad, be kita ko, būtų rodomas ekrano užsklanda.

Daugumai kūrėjų nereikia pasiekti paslėptų API, tačiau kartais jos gali būti gana naudingos.

Išleisdama Android 9 (Pie), Google pristatė paslėptą API juodąjį sąrašą. Ne kiekviena paslėpta API buvo įtraukta, o sąrašų lygiai buvo skirtingi. Paslėptas API baltajame sąraše galėjo pasiekti bet kas. Paslėptas API šviesiai pilkajame sąraše gali pasiekti bet kuri programa, tačiau jos gali būti nepasiekiamos būsimose „Android“ versijose. Viskas, kas yra tamsiai pilkame sąraše, galėjo būti pasiekiama tik toms programoms, kurios taikomos API lygiams anksčiau nei Pie (t. y. iki 28 API lygio). Programoms, skirtoms „Pie“ ir naujesnėms programoms, būtų uždrausta prieiga. Galiausiai, paslėptų API juodajame sąraše negalėjo pasiekti jokia nesisteminė (arba į baltąjį sąrašą neįtraukta) programa, neatsižvelgiant į tikslinę API.

„Android 10“ pakeitė sąrašų organizavimą ir šiek tiek juos supaprastino, tačiau idėja liko ta pati. Tam tikras paslėptas API galėjo pasiekti programos, o kitos buvo užblokuotos. Android 11 sustiprino prieigos aptikimą į blokuoti aplinkkelį naudojamas pyragui ir 10.

Visose „Android“ versijose, kai trečiosios šalies programa bando pasiekti juodajame sąraše esančią paslėptą API, „Android“ parodys atitinkamą klaidą „nerasta“.

Iš tikrųjų yra keletas būdų, kaip įveikti paslėptą API juodąjį sąrašą. Atsižvelgdami į savo poreikius, galite pasirinkti tuos, kurie tinka visoms „Android“ versijoms, tuos, kurie veikia tik „Android 9“ ir „10“, naudojančius vietinį C++ kodą, ir tuos, kurie yra visiškai „Java“ pagrindu. Yra net tik kūrimo būdas naudojant ADB.

ADB sprendimas

Jei jūsų įrenginyje veikia „Android Pie“, paleiskite šias dvi ADB komandas, kad įgalintumėte paslėptą API prieigą.

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

Jei jūsų įrenginyje veikia „Android 10“ ar naujesnė versija, paleiskite šią ADB komandą, kad įgalintumėte paslėptą API prieigą.

adb shell settings put global hidden_api_policy 1

Norėdami grįžti prie numatytojo veikimo, tiesiog pakeiskite put su delete ir nuimkite 1.

Akivaizdu, kad šios komandos nėra tiksliai naudingos gamybinei programai. Iš pirmų lūpų galiu pasakyti, kad tinkamai instruktuoti vartotojus, kaip naudotis ADB, yra nepaprastai sunku. Tačiau jie gali būti naudingi, jei reikia atnaujinti seną programą, kad ji atitiktų naujus apribojimus.

Gimtasis / JNI sprendimas

Yra du būdai, kaip apeiti paslėptą API juodąjį sąrašą naudodami JNI „Android“ programoje. Vienas tinka „Android 9“ ir „10“, o kitas – „Android 9“ ir naujesnėms versijoms.

Android 9 ir 10

Jei jau turite savąją programos dalį, ją bus lengva įdiegti. Tiesiog naudokite JNI_OnLoad() funkcija.

statinis menas:: Vykdymo laikas* vykdymo laikas = nullptr;

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

Atminkite, kad šis metodas veikia tik „Android 9“ ir „Android 10“.

Android 9 ir naujesnė versija

Bet kurioje „Android“ versijoje galite pasirinkti iš dviejų bibliotekų, kad apeitumėte paslėptą API apribojimą: „FreeReflection“ ir „RestrictionBypass“.

Abu yra lengvai įgyvendinami ir naudojami.

Norėdami įgyvendinti FreeReflection, pridėkite priklausomybę prie modulio lygio build.gradle.

implementation 'me.weishu: free_reflection: 3.0.1'

Tada nepaisykite attachBaseContext() savo programų klasėje.

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

Jei neturite programos klasės, galite ją gana lengvai pridėti. Sukurkite naują klasę, kuri praplečiama Application tada nukreipkite jį į savo AndroidManifest.xml.

Pavyzdys:

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

Reflection.unseal(base);
}
}

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

Norėdami įgyvendinti RestrictionBypass, pridėkite „JitPack“ saugyklą prie projekto lygio build.gradle.

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

Tada pridėkite priklausomybę prie modulio lygio build.gradle.

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

Štai ir viskas. Ši biblioteka automatiškai pašalina juodojo sąrašo apribojimus.

„Java“ sprendimas

Nors JNI sprendimai yra veiksmingi, kartais galbūt nenorėsite naudoti vietinio kodo. Jei dar nedarote dalykų C++, programa gali pridėti nereikalingo dydžio ir platformos apribojimų. Laimei, yra būdų, kaip apeiti paslėptą API juodąjį sąrašą naudojant tik „Java“.

Android 9 ir 10

9 ir 10 versijose „Android“ galite naudoti tai, kas gali būti vadinama dvigubu atspindžiu arba meta atspindžiu, kad apeitumėte paslėptą API juodąjį sąrašą. Kadangi sistema tik tikrina, į kurias trečiųjų šalių programas skambina, dvigubas atspindys priverčia manyti, kad sistema atlieka paslėptus API skambučius.

Šis triukas gali būti naudojamas norint iškviesti metodą, suteikiantį programai paslėptų API išimčių, taikliai pavadintų setHiddenApiExemptions(). Tiesiog pridėkite toliau pateiktą kodą kur nors savo programos gyvavimo ciklo pradžioje (pvz., Programos onCreate() metodas), ir jis apeis juodąjį sąrašą.

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

Jei jūsų programa suderinama su senesnėmis nei 9 versijomis „Android“, nepamirškite tai įtraukti į versijos patikrinimą.

Android 9 ir naujesnė versija

Norėdami apeiti paslėptą API juodąjį sąrašą „Android 9“ ir bet kurioje naujesnėje versijoje, galite naudoti LSPosed biblioteką. Ši biblioteka naudoja „Java“ nesaugią API, todėl mažai tikėtina, kad ji kada nors suges.

Norėdami tai įgyvendinti, tiesiog pridėkite priklausomybę prie modulio lygio build.gradle.

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

Tada naudokite jį norėdami apeiti juodąjį sąrašą.

HiddenApiBypass.addHiddenApiExemptions("L");

Jei jūsų programa suderinama su senesnėmis nei 9 versijomis „Android“, nepamirškite tai įtraukti į versijos patikrinimą.

Išvada ir daugiau informacijos

Yra daugybė parinkčių, kaip apeiti paslėptą API juodąjį sąrašą „Android“, nesvarbu, į kurią platformos versiją taikote arba kurią naudojate. Jei norite sužinoti daugiau apie tai, kaip šie metodai ir bibliotekos veikia, būtinai peržiūrėkite šias nuorodas.

  • Mano Stack Overflow klausimai ir atsakymai.
  • „LSposed“ paslėpta API apėjimo biblioteka „GitHub“..
  • „ChickenHook“ „RestrictionBypass“ biblioteka „GitHub“..
  • tiann FreeReflection biblioteką GitHub.
  • „Google“ dokumentacija apie paslėptą API juodąjį sąrašą.