Kā apiet slēpto API melno sarakstu operētājsistēmā Android 9+

Google ieviesa ierobežojumus operētājsistēmā Android 9, kuros izstrādātāji var piekļūt API. Lūk, kā apiet šos slēptos API ierobežojumus.

2018. gadā Google izlaida Android Pie. Starp lietotāja saskarnes izmaiņām un jaunajām funkcijām bija arī dažas izstrādātāja puses izmaiņas. Šīs izmaiņas ietvēra jaunas API, esošo API kļūdu labojumus un arī ierobežojumi piekļuvei slēptajām API.

Par laimi, tomēr ir veidi, kā apiet šos ierobežojumus. Pirms iedziļināties ierobežojumu apiešanā, man vajadzētu nedaudz paskaidrot par to, kas ir slēptās API, kāpēc tās vispirms tika ierobežotas un kāpēc jūs varētu vēlēties tiem piekļūt.

Slēptās API ir Android saskarnes API, kuras lietotņu izstrādātāji parasti nevar redzēt. Ja apskatīsit AOSP kodu, jūs redzēsit veselu virkni klašu, mainīgo un metožu, kuriem ir @hide anotācija komentāru blokā virs tiem.

Šī anotācija norāda uz jebkuru rīku, ko Google izmanto, kompilējot SDK, lai izslēgtu tajā esošo vienumu. Pēc tam šis SDK tiek izplatīts izstrādātājiem SDK, kas lejupielādēti, izmantojot Android Studio. Ja vien neizmantojat modificētu SDK, Android Studio uzskatīs, ka neviena no šiem slēptajiem vienumiem vienkārši nepastāv. Ja mēģināsit to izmantot tieši, tas tiks parādīts sarkanā krāsā un atsakās kompilēt.

Ir daudz iemeslu, kāpēc API var būt paslēpta. Dažas lietas ir paredzētas lietošanai tikai iekšējām vai sistēmas lietotnēm, un tās nedarbosies, ja tās izmantos trešās puses lietotne. Citi ir eksperimentāli vai nestabili, un nākotnē tie var tikt noņemti vai mainīti. Dažas no tām pat ir tikai API, kuras Google vienkārši nevēlas izmantot parasto nolietojuma ciklu, ja tās kādreiz tiek noņemtas.

Lai gan standarta Android SDK ir a daudz tajā dažreiz nepietiek. Dažreiz ir kaut kas, ko vēlaties darīt, kas jau pastāv operētājsistēmā Android, taču tas vienkārši nav publiski pieejams.

Piemēram, daudzas manis izveidotās lietotnes, tostarp SystemUI uztvērējs un Bloķēšanas ekrāna logrīki, izmantojiet dažādas slēptās API. SystemUI Tuner ir jāpiekļūst dažām, lai pareizi izsekotu, mainītu un atiestatītu opcijas. Bloķēšanas ekrāna logrīki izmanto dažus, lai cita starpā parādītu fonu zem tā.

Lielākajai daļai izstrādātāju nav jāpiekļūst slēptām API, taču dažreiz tās var būt diezgan noderīgas.

Izlaižot operētājsistēmu Android 9 (Pie), Google ieviesa slēpto API melno sarakstu. Ne katra slēptā API tika iekļauta, un bija dažādi sarakstu līmeņi. Baltajā sarakstā iekļautajām slēptajām API var piekļūt ikviens. Slēptajām API gaiši pelēkajā sarakstā var piekļūt jebkura lietotne, taču nākamajās Android versijās tās var nebūt pieejamas. Visam, kas norādīts tumši pelēkajā sarakstā, varēja piekļūt tikai tās lietotnes, kuru mērķauditorija ir API līmeņi pirms Pie (t.i., pirms API 28. līmeņa). Tiks liegta piekļuve lietotnēm, kuru mērķauditorija ir Pie un vēlāk. Visbeidzot, melnajā sarakstā iekļautajām slēptajām API nevarēja piekļūt neviena nesistēmas (vai baltajā sarakstā neiekļautā) lietotne neatkarīgi no mērķa API.

Android 10 mainīja sarakstu organizēšanu un nedaudz vienkāršoja tos, taču ideja palika nemainīga. Lietotnes varēja piekļūt noteiktām slēptajām API, bet citas tika bloķētas. Android 11 pastiprināja piekļuves noteikšanu uz bloķēt apvedceļu izmanto pīrāgam un 10.

Visās Android versijās ikreiz, kad trešās puses lietotne mēģina piekļūt melnajā sarakstā iekļautajai slēptajai API, Android parādīs atbilstošu kļūdu “nav atrasts”.

Patiesībā ir diezgan daudz veidu, kā pārvarēt slēpto API melno sarakstu. Atkarībā no jūsu vajadzībām varat izvēlēties tādus, kas darbojas visās Android versijās, tādas, kas darbojas tikai operētājsistēmā Android 9 un 10, kuras izmanto vietējo C++ kodu, un tādas, kuras ir pilnībā balstītas uz Java. Ir pat risinājums, kas paredzēts tikai izstrādei, izmantojot ADB.

ADB risinājums

Ja jūsu ierīcē darbojas Android Pie, palaidiet tālāk norādītās divas ADB komandas, lai iespējotu slēpto API piekļuvi.

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

Ja jūsu ierīcē darbojas operētājsistēma Android 10 vai jaunāka versija, palaidiet šo ADB komandu, lai iespējotu slēpto API piekļuvi.

adb shell settings put global hidden_api_policy 1

Lai atgrieztos pie noklusējuma darbības, vienkārši nomainiet put ar delete un noņemiet 1.

Acīmredzot šīs komandas nav īsti noderīgas ražošanas lietotnei. Es varu jums uzreiz pateikt, ka pareizi instruēt lietotājus par ADB lietošanu ir neticami grūti. Taču tie var būt noderīgi, ja ir jāatjaunina veca lietotne, lai tā atbilstu jaunajiem ierobežojumiem.

Vietējais/JNI risinājums

Ir divi veidi, kā varat apiet slēpto API melno sarakstu, izmantojot JNI savā Android lietotnē. Viens darbojas operētājsistēmām Android 9 un 10, bet otrs darbojas operētājsistēmā Android 9 un jaunākās versijās.

Android 9 un 10

Ja jums jau ir lietotnes vietējā daļa, to būs viegli ieviest. Vienkārši izmantojiet JNI_OnLoad() funkciju.

statiskā māksla:: izpildlaiks* izpildlaiks = nullptr;

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

Ņemiet vērā, ka šī metode darbojas tikai operētājsistēmās Android 9 un 10.

Android 9 un jaunākas versijas

Jebkurai Android versijai varat izvēlēties divas bibliotēkas, lai apietu slēpto API ierobežojumu: FreeReflection un RestrictionBypass.

Abus ir viegli ieviest un lietot.

Lai ieviestu FreeReflection, pievienojiet atkarību savam moduļa līmeņa failam build.gradle.

implementation 'me.weishu: free_reflection: 3.0.1'

Pēc tam ignorējiet attachBaseContext() savā Pieteikumu klasē.

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

Ja jums nav lietojumprogrammu klases, varat to pievienot diezgan vienkārši. Izveidojiet jaunu klasi, kas tiek paplašināta Application un pēc tam norādiet uz to savā AndroidManifest.xml.

Piemērs:

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

Reflection.unseal(base);
}
}

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

Lai ieviestu RestrictionBypass, pievienojiet JitPack repozitoriju savam projekta līmeņa build.gradle.

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

Pēc tam pievienojiet atkarību savam moduļa līmeņa failam build.gradle.

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

Un viss. Šī bibliotēka automātiski noņem melnā saraksta ierobežojumus.

Java risinājums

Lai gan JNI risinājumi ir efektīvi, dažkārt, iespējams, nevēlaties izmantot vietējo kodu. Ja jūs vēl neveicat C++, tas var pievienot jūsu lietotnei nevajadzīgu izmēru, kā arī platformas ierobežojumus. Par laimi, ir veidi, kā apiet slēpto API melno sarakstu, izmantojot tikai Java.

Android 9 un 10

Operētājsistēmās Android 9 un 10 varat izmantot to, ko var saukt par dubulto atspoguļojumu vai metarefleksiju, lai apietu slēpto API melno sarakstu. Tā kā sistēma pārbauda tikai to, kuras trešās puses lietotnes zvana, dubultā refleksija liek domāt, ka sistēma veic slēptos API zvanus.

Šo triku var izmantot, lai izsauktu metodi, lai jūsu lietotnei piešķirtu slēptos API izņēmumus, kas ir pareizi nosaukti setHiddenApiExemptions(). Vienkārši pievienojiet tālāk norādīto kodu kaut kur savas lietotnes dzīves cikla sākumā (piemēram, lietojumprogrammas onCreate() metodi), un tas apstrādās melno sarakstu apiešanu.

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

Ja jūsu lietotne ir saderīga ar operētājsistēmas Android versijām, kas vecākas par 9, neaizmirstiet to iekļaut versijas pārbaudē.

Android 9 un jaunākas versijas

Lai apietu slēpto API melno sarakstu operētājsistēmā Android 9 un jebkurā jaunākā versijā, varat izmantot LSPosed bibliotēku. Šī bibliotēka izmanto Java nedrošo API, tāpēc maz ticams, ka tā kādreiz sabojāsies.

Lai to ieviestu, vienkārši pievienojiet atkarību savam moduļa līmeņa failam build.gradle.

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

Pēc tam izmantojiet to, lai apietu melno sarakstu.

HiddenApiBypass.addHiddenApiExemptions("L");

Ja jūsu lietotne ir saderīga ar operētājsistēmas Android versijām, kas vecākas par 9, neaizmirstiet to iekļaut versijas pārbaudē.

Secinājums un vairāk informācijas

Ir daudz iespēju, kā apiet slēpto API melno sarakstu operētājsistēmā Android neatkarīgi no tā, kuru platformas versiju atlasāt vai izmantojat. Ja vēlaties uzzināt vairāk par to, kā šīs metodes un bibliotēkas darbojas, noteikti apskatiet tālāk norādītās saites.

  • Mana Stack Overflow Q&A.
  • LSposed slēptā API apiešanas bibliotēka vietnē GitHub.
  • ChickenHook's RestrictionBypass bibliotēka vietnē GitHub.
  • tiann FreeReflection bibliotēkā GitHub.
  • Google dokumentācija par slēpto API melno sarakstu.