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});
hello @StarPinkER можно предоставить «android.permission.CHANGE_COMPONENT_ENABLED_STATE» permissio, используя скрытый или внутренний api или reflaction ? – Hardik
Сначала проверьте [этот ответ] (http://stackoverflow.com/a/15289944/1365960). Это разрешение является сигнатурным/системным разрешением. В большинстве случаев вы не можете получить это разрешение, если оно не является системным приложением. Это означает, что вам нужно изменить Android-источник, чтобы принять ваше приложение или сделать свое приложение системным приложением и подписать его. Однако вы не сможете этого сделать, если вы не создаете собственную систему Android. Отражение может обрабатывать «скрытие», но это не может изменить логику системы Android Security. Вы можете себе представить, как мы можем легко атаковать Android-устройство, если мы сможем это сделать. @Hardik – StarPinkER
@StarPinkER спасибо за ответ :) – Hardik