Android має два типи API, які недоступні через SDK.
Перший знаходиться в упаковці com.android.internal
. Другий тип API - це набір класів і методів, які позначені атрибутом @hide Javadoc .
Починаючи з Android 9 (рівень 28 API), Google вводить нові обмеження щодо використання не-SDK-інтерфейсів , безпосередньо, через відображення чи через JNI. Ці обмеження застосовуються щоразу, коли додаток посилається на не-SDK-інтерфейс або намагається отримати його обробку за допомогою відображення або JNI.
Але перед рівнем API 28, до прихованих методів все-таки можна отримати доступ через відображення Java. @hide
Атрибут є лише частиною Javadoc (droiddoc також), так що @hide
просто означає , що метод / клас / поле виключений з API Docs.
Наприклад, checkUidPermission()
метод у ActivityManager.java
використанні @hide
:
/** @hide */
public static int checkUidPermission(String permission, int uid) {
try {
return AppGlobals.getPackageManager()
.checkUidPermission(permission, uid);
} catch (RemoteException e) {
// Should never happen, but if it does... deny!
Slog.e(TAG, "PackageManager is dead?!?", e);
}
return PackageManager.PERMISSION_DENIED;
}
Однак ми можемо назвати це відображенням:
Class c;
c = Class.forName("android.app.ActivityManager");
Method m = c.getMethod("checkUidPermission", new Class[] {String.class, int.class});
Object o = m.invoke(null, new Object[]{"android.permission.READ_CONTACTS", 10010});