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


120

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

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

무슨 @hide뜻이야?

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

답변:


182

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
안녕하세요 @StarPinkER 숨겨진 또는 내부 API를 사용하거나 reflaction을 사용하여 "android.permission.CHANGE_COMPONENT_ENABLED_STATE"권한을 부여 할 수 있습니까?
Hardik 2014

1
먼저이 답변을 확인하십시오 . 이 권한은 서명 / 시스템 권한입니다. 대부분의 경우 시스템 응용 프로그램이 아니면이 권한을 얻을 수 없습니다. 즉, 앱을 수락하거나 앱을 시스템 앱으로 만들고 서명하도록 Android 소스를 수정해야합니다. 그러나 자신의 Android 시스템을 만들지 않는 한이 작업을 수행 할 수 없습니다. Reflection은 "숨기기"를 처리 할 수 ​​있지만 Android 보안 시스템의 논리를 변경할 수는 없습니다. 우리가 이것을 할 수 있다면 어떻게 안드로이드 장치를 쉽게 공격 할 수 있는지 상상할 수 있습니다. @Hardik
StarPinkER

2
답 해주셔서 감사 합니다만, 답에 두 가지 문제가 있다고 생각합니다. 틀리면 정정 해주세요. "android.app.ActivityManager"대신 "ActivityManager"로 찾으려고하면 classnotfound 오류가 발생하고 "m.invoke (c,"는 정적 메서드의 경우 "m.invoke (null,", "m. 호출 (O는, "O 타입 C의 목적은 동적 인 방법을 위해, 여기서 미안 내 폴란드어 문법 :합니다.
lindenrovio

3
리플렉션에 대한 참고 사항 : 이러한 메서드 / 필드는 공식 SDK의 일부가 아니므로 향후 Android 개정판에 포함될 것이라는 보장은 없습니다.
sstn

2
주석이 문서에서 메서드 만 제거하는 경우 코드에서 여전히 사용할 수없는 이유는 무엇입니까?
Javier Delgado

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

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

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


오 예 ... final당연히 무시할 수 없습니다. 죄송합니다 그건 내 실수는 다음과 같습니다 X
midnite

public개발 단계의 모든 클래스에 적용 된다는 뜻 입니까? 그러나 같은 역할 private또는 /*package*/우리와 같은 사용자에게?
midnite

흠 ... 그건 그냥 댓글입니다. 그 의미를 이해합니다. 하지만 코드 수준에서이 동작을 어디에 어떻게 적용할까요?
midnite

1
공개 된 이유에 대해서는 실제로 언급 할 수 없습니다. 코드 구현 Activity이 많은 클래스에 분산되어 있고 모두이 멤버에 액세스해야 할 수 있습니다. 결론 공개되어 있지만 API의 일부가 아니라는 것 입니다 .
paxdiablo

1
@midnite, Eclipse에는 intellisense 항목과 통합 된 자체 Java 컴파일러가 있습니다. Java SDK로 이것을 컴파일하면 잘 컴파일 될 것입니다. 나는 물론이 제안 아니에요 있다는 점 3. 참조
paxdiablo

4

@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 에서 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.