Android 소스 코드에서 @hide는 무엇을 의미합니까? 대한 Activity소스 코드

에 대한 Activity소스 코드 , 라인 3898 (바닥에 가까운) :

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}

무슨 @hide뜻이야?

public class ChildActivity extends Activity { ... }사용할 수 없음을 발견했습니다 Activity.isResumed(). 이것은 정상입니까? 어떻게 액세스 할 수 있습니까?



답변

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


답변

  1. @hide다양한 이유로 표시되어야하지만 게시 된 API의 일부 가 아닌 항목에 사용됩니다. 소스에서 API를 자동으로 추출 할 때 문서에 포함되지 않습니다.

  2. 당신이 옳습니다. 당신은 그것을 무시할 수 없습니다. 으로 표시되어 있기 때문에 이는 정상적인 현상 final입니다. 으로 표시되어 있기 때문에 편집자가 사용 하는 모든 인텔리전스에서 선택 항목 중 하나로 표시하지 않을 수 있지만 사용할@hide 수 있어야합니다.

  3. 당신은해야 되지 는 API의 일부가 아니라 그들이 원하는 때마다 개발자는 제거 할 수 있기 때문에 전혀 그것을 사용할 수 있습니다. 그들은 심지어 가학 적으로 그것을 실행하는 장치를 벽돌로 만드는 기능으로 대체하려는 자신의 권리 내에있을 것입니다 (엄격한 법적 의미에서는 아닐지라도).


답변

@hide주석이 인터페이스는 공개 API의 일부가 아닌 사용자 코드에서 사용할 수 없습니다 것을 의미합니다. 메서드는 AOSP의 내부 용도로만 사용됩니다.

Google은 실제로 비 SDK 인터페이스의 사용제한 하기 시작했습니다 . 여기에는 다음으로 표시된 인터페이스가 포함됩니다.@hide

방법은 네 가지 목록으로 분류됩니다.

  • 화이트리스트 : SDK
  • 밝은 회색 목록 : 아직 액세스 할 수있는 비 SDK 메서드 / 필드.
  • 다크 그레이리스트 :
    • 대상 SDK가 API 레벨 28 미만인 앱의 경우 : 다크 그레이리스트 인터페이스의 각 사용이 허용됩니다.
    • 대상 SDK가 API 레벨 28 이상인 앱의 경우 : 블랙리스트와 동일한 동작
  • 블랙리스트 : 대상 SDK에 관계없이 제한됩니다. 플랫폼은 인터페이스가없는 것처럼 작동합니다. 예를 들어 앱이 사용하려고 할 때마다 NoSuchMethodError / NoSuchFieldException이 발생하고 앱이 특정 클래스의 필드 / 메소드 목록을 알고 자 할 때 포함하지 않습니다.

목록은 https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat 에서 찾을 수 있습니다.


답변