Android에는 SDK를 통해 액세스 할 수없는 두 가지 유형의 API가 있습니다.
첫 번째는 패키지에 com.android.internal
있습니다. 두 번째 API 유형은 @hide Javadoc 속성으로 표시된 클래스 및 메소드의 모음입니다 .
Android 9 (API 레벨 28)부터 Google은 직접, 리플렉션 또는 JNI를 통해 비 SDK 인터페이스 사용에 대한 새로운 제한을 도입 합니다. 이러한 제한은 앱이 비 SDK 인터페이스를 참조하거나 리플렉션 또는 JNI를 사용하여 핸들을 얻으려고 할 때마다 적용됩니다.
그러나 API 레벨 28 이전에는 숨겨진 메소드에 Java 리플렉션을 통해 액세스 할 수있었습니다. @hide
(가) 그래서 속성은 자바 독 (또한 droiddoc)의 한 부분입니다 @hide
단지 방법 / 클래스 / 필드는 API 문서에서 제외됩니다 것을 의미합니다.
예를 들어의 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});