O Android tem dois tipos de APIs que não são acessíveis via SDK.
O primeiro está localizado no pacote com.android.internal
. O segundo tipo de API é uma coleção de classes e métodos marcados com o atributo @hide Javadoc .
A partir do Android 9 (API nível 28), o Google introduz novas restrições ao uso de interfaces não SDK , seja diretamente, via reflexão ou via JNI. Essas restrições são aplicadas sempre que um aplicativo faz referência a uma interface não SDK ou tenta obter seu identificador usando reflexão ou JNI.
Porém, antes do nível 28 da API, os métodos ocultos ainda podiam ser acessados via reflexão de Java. O @hide
atributo é apenas parte do Javadoc (droiddoc também), portanto, @hide
significa simplesmente que o método / classe / campo é excluído dos documentos da API.
Por exemplo, o checkUidPermission()
método em ActivityManager.java
usa @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;
}
No entanto, podemos chamá-lo por reflexão:
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});