Како заобићи скривену црну листу АПИ-ја на Андроиду 9+

click fraud protection

Гоогле је у Андроид 9 увео ограничења на којима програмери могу да приступе АПИ-ју. Ево како да заобиђете та скривена ограничења АПИ-ја.

Још 2018. године, Гоогле је објавио Андроид Пие. Међу променама корисничког интерфејса и новим функцијама, било је и неких промена на страни програмера. Те промене су укључивале нове АПИ-је, исправке грешака за постојеће АПИ-је и такође ограничења приступа скривеним АПИ-јима.

Међутим, на срећу, постоје начини да се заобиђу та ограничења. Пре него што пређем на то како да заобиђем ограничења, требало би да објасним мало о томе шта су скривени АПИ-ји, зашто су уопште били ограничени и зашто бисте можда желели да им приступите.

Скривени АПИ-ји су АПИ-ји у Андроиду које програмери апликација обично не могу да виде. Ако погледате АОСП-ов код, видећете читаву гомилу класа, променљивих и метода које имају @hide напомену унутар блока коментара изнад њих.

Ова напомена даје упутства било којој алатки коју Гоогле користи приликом компајлирања СДК-а да искључи ставку испод њега. Тај СДК се затим дистрибуира програмерима унутар СДК-ова преузетих преко Андроид Студија. Осим ако не користите модификовани СДК, Андроид Студио ће мислити да било која од тих скривених ставки једноставно не постоји. Ако покушате да га користите директно, он ће га приказати црвеном бојом и одбити да се компајлира.

Постоји много разлога зашто би АПИ могао бити скривен. Неке ствари су намењене само за интерне или системске апликације и неће радити ако их користи апликација треће стране. Други су експериментални или нестабилни и могу бити уклоњени или промењени у будућности. Неки су чак само АПИ-ји Гоогле једноставно не жели да примени нормалан циклус застаревања ако икада буду уклоњени.

Док стандардни Андроид СДК има а лот у њему понекад није довољно. Понекад нешто што желите да урадите већ постоји у Андроиду, али једноставно није јавно изложено.

На пример, многе апликације које правим, укључујући СистемУИ тјунер и Виџети за закључани екран, искористите гомилу различитих скривених АПИ-ја. СистемУИ тјунер треба да приступи некима да би правилно пратио, мењао и ресетовао опције. Лоцксцреен Видгетс користи неке за приказивање позадине испод, између осталог.

Већина програмера не мора да приступа скривеним АПИ-јима, али понекад могу бити прилично корисни.

Са издавањем Андроида 9 (Пие), Гоогле је увео скривену црну листу АПИ-ја. Није укључен сваки скривени АПИ, а постојали су и различити нивои листа. Скривеним АПИ-јима на белој листи може приступити свако. Скривеним АПИ-јима на светлосивој листи може приступити било која апликација, али ће можда бити недоступни у будућим верзијама Андроид-а. Било чему на тамно-сивој листи могле су да приступе само апликације које циљају нивое АПИ-ја пре Пие (тј. пре АПИ нивоа 28). Апликацијама које циљају на Пие и касније биће одбијен приступ. Коначно, скривеним АПИ-јима на црној листи није могла да приступи ниједна несистемска (или није на белој листи) апликација, без обзира на циљни АПИ.

Андроид 10 је променио начин на који су листе организоване и мало их поједноставио, али идеја је остала иста. Апликације су могле да приступе одређеним скривеним АПИ-јима, док су други блокирани. Андроид 11 ојачао детекцију приступа до блокирати обилазницу користи се за Пие и 10.

У свим верзијама Андроид-а, сваки пут када апликација треће стране покуша да приступи скривеном АПИ-ју са црне листе, Андроид ће приказати одговарајућу грешку „није пронађено“.

Заправо постоји доста начина да се превазиђе скривена црна листа АПИ-ја. У зависности од ваших потреба, можете одабрати оне које раде за све верзије Андроида, оне које раде само за Андроид 9 и 10, оне које користе изворни Ц++ код и оне које су у потпуности засноване на Јави. Постоји чак и заобилазно решење само за развој користећи АДБ.

АДБ заобилазно решење

Ако ваш уређај користи Андроид Пие, покрените следеће две АДБ команде да бисте омогућили скривени приступ АПИ-ју.

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

Ако ваш уређај користи Андроид 10 или новији, покрените следећу АДБ команду да бисте омогућили скривени приступ АПИ-ју.

adb shell settings put global hidden_api_policy 1

Да бисте се вратили на подразумевано понашање, само га замените put са delete и уклоните 1.

Очигледно, ове команде нису баш корисне за производну апликацију. Могу вам рећи из прве руке да је правилно инструкције корисника о томе како да користе АДБ невероватно тешко. Али они могу бити корисни ако треба да ажурирате стару апликацију како бисте били у складу са новим ограничењима.

Заобилазно решење нативе/ЈНИ

Постоје два начина на која можете заобићи скривену црну листу АПИ-ја користећи ЈНИ у вашој Андроид апликацији. Један ради за Андроид 9 и 10, а други ради за Андроид 9 и новије верзије.

Андроид 9 и 10

Ако већ имате изворни део своје апликације, ово ће бити лако имплементирати. Само користите JNI_OnLoad() функција.

статиц арт:: Рунтиме* рунтиме = нуллптр;

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

Имајте на уму да овај метод ради само на Андроид 9 и 10.

Андроид 9 и новије верзије

За било коју верзију Андроид-а, имате избор између две библиотеке да заобиђете скривено ограничење АПИ-ја: ФрееРефлецтион и РестрицтионБипасс.

Оба су лака за имплементацију и употребу.

За имплементацију ФрееРефлецтион, додајте зависност у буилд.градле на нивоу модула.

implementation 'me.weishu: free_reflection: 3.0.1'

Затим надјачајте attachBaseContext() у вашој апликацији.

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

Ако немате класу апликације, можете је додати прилично лако. Креирајте нову класу која се проширује Application а затим покажите на њега у свом АндроидМанифест.кмл.

Пример:

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

Reflection.unseal(base);
}
}

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

За имплементацију РестрицтионБипасс, додајте ЈитПацк спремиште у буилд.градле на нивоу пројекта.

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

Затим додајте зависност у буилд.градле на нивоу модула.

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

И то је то. Ова библиотека аутоматски уклања ограничења са црне листе.

Јава заобилазно решење

Иако су ЈНИ решења ефикасна, понекад можда не желите да користите изворни код. Ако већ не радите ствари у Ц++, он може додати непотребну величину, заједно са ограничењима платформе, вашој апликацији. Срећом, постоје начини да се заобиђе скривена црна листа АПИ-ја користећи само Јаву.

Андроид 9 и 10

У Андроиду 9 и 10 можете користити оно што се може назвати двоструким одразом или метарефлексијом да бисте заобишли скривену црну листу АПИ-ја. Пошто систем проверава само оно што апликације трећих страна позивају, двострука рефлексија га превари да помисли да систем обавља скривене АПИ позиве.

Овај трик се може користити за позивање методе да се вашој апликацији дају изузећа за скривени АПИ, прикладно названа setHiddenApiExemptions(). Једноставно додајте следећи код негде на почетку животног циклуса ваше апликације (као што је апликација onCreate() метод), и он ће се бавити заобилажењем црне листе.

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

Ако је ваша апликација компатибилна са верзијама Андроид-а нижим од 9, не заборавите да ово умотате у проверу верзије.

Андроид 9 и новије верзије

Да бисте заобишли скривену црну листу АПИ-ја на Андроид-у 9 и било којој новијој верзији, можете да користите ЛСПоседову библиотеку. Ова библиотека користи Јава-ин Унсафе АПИ, тако да је мало вероватно да ће се икада покварити.

Да бисте га имплементирали, само додајте зависност у буилд.градле на нивоу модула.

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

Затим га користите да заобиђете црну листу.

HiddenApiBypass.addHiddenApiExemptions("L");

Ако је ваша апликација компатибилна са верзијама Андроид-а нижим од 9, не заборавите да ово умотате у проверу верзије.

Закључак и више информација

Постоји много опција за заобилажење скривене АПИ црне листе на Андроиду, без обзира на коју верзију платформе циљате или користите. Ако сте радознали да сазнате више о томе како ове методе и библиотеке функционишу, обавезно погледајте следеће везе.

  • Мој Стацк Оверфлов питања и одговори.
  • ЛСпоседова скривена библиотека заобилажења АПИ-ја на ГитХуб-у.
  • ЦхицкенХоок-ова библиотека РестрицтионБипасс на ГитХуб-у.
  • тианнова библиотека ФрееРефлецтион на ГитХуб-у.
  • Гоогле-ова документација о скривеној црној листи АПИ-ја.