Има ли начин за достъп до android.net.EthernetManager в приложение за Android?

Има ли начин за достъп до android .net.EthernetManager в приложение за Android? И Class.forName("android.net.ethernet.EthernetManager"), и Class.forName("android.net.EthernetManager") генерират ClassNotFoundException.


person Hong    schedule 05.02.2016    source източник


Отговори (2)


Изглежда, че android.net.EthernetManager е скрит клас, маркиран като @hide от Javadoc. Можете да получите достъп до него, като използвате персонализирана SDK платформа, която е направена тук, и не няма нужда да руутвате устройството.

Библиотеката на Android Hidden API е модифициран jar файл, който комбинира android.jar от Android SDK с framework.jar от реално устройство. Този буркан ви позволява да използвате вътрешни/скрити API на Android в разработката.

Какво представляват вътрешни и скрити API на Android? Вътрешният API се намира в пакет com.android.internal, който е достъпен във файла framework.jar от реално устройство с Android, докато скритите API се намират във файл android.jar с атрибут @hide Javadoc. Въпреки че класовете и методите са public, но нямате достъп до тях. Има доста методи и ресурси, които можете да използвате от този пакет. Ще приема, че това е един API и ще го наричам скрит API. Научете повече за скрития API тук.

И така, вижте този знак @hide:

въведете описание на изображението тук

Този клас е достъпен на API ниво 22 и по-високо. Но персонализираният API има ограничение. Android Hidden API не е наличен за Lollipop 5.1.1 (API 22) и Marshmallow 6.0 (API 23), тъй като не мога да намеря хора, които имат това устройство. Ако го имате, моля, качете framework.jar файл от физическо устройство, което се намира в /system/framework/framework.jar, тук . Ще направя нова!

ДРУГО ОГРАНИЧЕНИЕ

Има друго ограничение от Hidden API, което все още не обяснявам. Когато използвате някои функции, методи, ресурси или класове с този скрит API, които са достъпни само на определено ниво на API, приложението ви може да има достъп до тях само в рамките на нивото на API на съответното устройство. Например, ако използвате android.net.EthernetManager в приложението си, трябва да зададете целевия и компилиран SDK на android-22 (тъй като този клас е наличен само на API ниво 22 и по-високо). След като стартирате приложението си на устройство, което има API ниво 22 и по-високо, не се показва грешка. Но след като стартирате приложението на ниво API 21 и по-ниско, ще бъде изведена грешка, например java.lang.NoClassDefFoundError, тъй като класът android.net.EthernetManager е създаден само за API 22 и по-високи.

person Anggrayudi H    schedule 05.02.2016
comment
Благодаря много. Ще го пробвам и ще докладвам утре. - person Hong; 05.02.2016
comment
Току що го пробвах. Получих грешка: java.lang.NoClassDefFoundError: android.net.EthernetManager. Чудя се дали устройството за тестване е API 19, тогава трябва да използвам android-19. С други думи, ако създам приложението с целеви API 19, това приложение може да бъде разгърнато САМО на устройства с API 19. Бихте ли изяснили това? - person Hong; 05.02.2016
comment
Благодаря ти. Как може да се разбере кой API е достъпен само за кой API? Не мога да разбера, че EthernetManager е наличен само за API 22 и по-горе, като гледам кода. - person Hong; 07.02.2016
comment
@Hong, Просто въведете метод, ресурс или клас в полето за търсене на jcs.mobile-utopia.com/servlet/. И след това погледнете колоната Категория. - person Anggrayudi H; 07.02.2016
comment
Благодаря ти. Чудя се дали този метод е надежден, тъй като android.jar на Android Hidden API библиотеката за API 21 има EthernetManager. Искам да го използвам за API 17, така че нямам късмет. - person Hong; 07.02.2016
comment
Само моите 5 цента. Използването на нескрити класове е добра идея, но увеличава приложението ви с 5Mb, не забравяйте за това. Трябваше да се откажа от това усилие. - person djdance; 03.12.2018
comment
@djdance Ето защо трябва да свиете кода си с ProGuard. - person Anggrayudi H; 05.12.2018
comment
@AnggrayudiH ти изглежда си най-загриженият човек със скритите API на AOSP. Благодаря за работата. // Като пример, IPackageManager#getPermissionFlags() се заменя с IPermissionManager#getPermissionFlags() в SDK 30. Така че, когато се насочва към SDK 30, първото не е достъпно и компилаторът изхвърля symbol not found. Има ли друг начин освен 1) reflection или 2) модифициран android.jar, по който можем да изберем достъп до скритите API? - person Irfan Latif; 28.12.2020
comment
Единственото решение за този случай е използването на отражение и проверка на нивото на API, преди да извикате getPermissionFlags(). Отражението на Java може да се използва в динамична ситуация като тази. @ИрфанЛатиф - person Anggrayudi H; 28.12.2020
comment
@AnggrayudiH точно това правя. Всъщност и двете решения работят. Добавих мъниче getPermissionFlags() към IPackageManager.class (което е AIDL интерфейс към PackageManagerService) в android.jar и няма повече грешки при компилиране. Но имате добър опит с това. Затова си помислих, че може би имате и трета идея. Все пак благодаря за отговора. - person Irfan Latif; 28.12.2020

IIRC можете да направите това само ако вашето устройство е руутнато.

Тук има добро обяснение: Ethernet свързаност чрез програмно (Android) ( Руутнато устройство)

person jmorris    schedule 05.02.2016
comment
Благодаря за отговора. Погледнах публикацията преди. Получавам нула за getSystemService(ethernet) на руутнато устройство. - person Hong; 05.02.2016