В Android есть два типа API-интерфейсов, которые недоступны через SDK.
Первый находится в упаковке com.android.internal
. Второй тип API - это набор классов и методов, помеченных атрибутом @hide Javadoc .
Начиная с Android 9 (уровень API 28), 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});
@hide
используется для вещей, которые должны быть видимыми по разным причинам, но не являются частью опубликованного API. Они не будут включены в документацию, когда она автоматически извлекает API из источника.Вы правы, вы не можете это изменить. Это нормально, это сделано специально, так как помечено как
final
. Вы должны иметь возможность использовать его, хотя редактор может не показывать его вам как один из вариантов в любом используемом им intellisense, потому что он отмечен значком@hide
, и вы должны принять к сведению пункт 3 ниже.Вам не следует использовать его вообще, поскольку он не является частью API, и разработчики могут удалить его, когда захотят. Если бы они были склонны к садизму, они были бы даже вправе заменить его функцией, блокирующей устройство, на котором оно работало (хотя, возможно, и не в строгом юридическом смысле).
источник
final
конечно, я не могу это изменить. Извините, это моя ошибка: xpublic
во всех классах на стадии разработки. Но действуетprivate
ли он/*package*/
на пользователей вроде нас?Activity
распределена по множеству классов, и всем им нужен доступ к этому члену. Суть в том, что является общественной , но не является частью API означает , что вы используете его на свой страх и риск.@hide
Аннотацию означает , что этот интерфейс не является частью общественного API и не должен использоваться в вашем коде. Эти методы предназначены только для внутреннего использования AOSP.Google фактически начал ограничивать использование интерфейсов, отличных от SDK . Это включает интерфейсы, отмеченные
@hide
Методы разделены на четыре списка:
Списки можно найти здесь: https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat.
источник