2013-06-11 2 views
97

Для Activity source code, строка 3898 (близко к нижней части):Что означает @hide в исходном коде Android?

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

Что @hide значит?

Я нашел, что мой public class ChildActivity extends Activity { ... } не может использовать/см. Activity.isResumed(). Это нормально? Как я могу получить к нему доступ?

ответ

155

Android имеет два типа API, которые недоступны через SDK.

Первый находится в пакете com.android.internal. Второй тип API - это набор классов и методов, которые отмечены @hide javadoc attribute.

Скрытые методы могут быть доступны через java-отражение. Атрибут @hide - это всего лишь часть javadoc (droiddoc), поэтому @hide просто означает, что поле method/class/исключено из документов 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}); 
+0

hello @StarPinkER можно предоставить «android.permission.CHANGE_COMPONENT_ENABLED_STATE» permissio, используя скрытый или внутренний api или reflaction ? – Hardik

+0

Сначала проверьте [этот ответ] (http://stackoverflow.com/a/15289944/1365960). Это разрешение является сигнатурным/системным разрешением. В большинстве случаев вы не можете получить это разрешение, если оно не является системным приложением. Это означает, что вам нужно изменить Android-источник, чтобы принять ваше приложение или сделать свое приложение системным приложением и подписать его. Однако вы не сможете этого сделать, если вы не создаете собственную систему Android. Отражение может обрабатывать «скрытие», но это не может изменить логику системы Android Security. Вы можете себе представить, как мы можем легко атаковать Android-устройство, если мы сможем это сделать. @Hardik – StarPinkER

+0

@StarPinkER спасибо за ответ :) – Hardik

19
  1. @hide используются для вещей, которые должны быть видны по разным причинам, но являются не части опубликованной API. Они не будут включены в документацию, когда она автоматически извлекает API из источника.

  2. Вы правы, вы не можете переопределить его. Это нормально, это по дизайну, так как оно отмечено как final. Вы должны быть в состоянии использовать, хотя редактор может не показывать его вам как один из вариантов в любом использовании intellisense, поскольку он помечен @hide, и вы должны принять к сведению пункт 3 ниже.

  3. Вы должны не использовать его вообще, так как он не является частью API, и разработчики могут удалить его, когда захотят. Они даже были бы в пределах своих прав, если бы они были настроены с садизмом, чтобы заменить его функцией, которая запирала устройство, на котором оно работало (хотя, возможно, не в строгом юридическом смысле).

+0

О да ... это конечно, конечно, я не могу его переопределить. Извините, это моя ошибка: x – midnite

+0

Вы имеете в виду, что это 'public' во всех классах на стадии разработки. Но он действует как 'private' или'/* package */'таким пользователям, как мы? – midnite

+0

Хм ... Это всего лишь комментарий. Я понимаю его значения. Но что и где следует применять это поведение на уровне кода? – midnite

Смежные вопросы