Colección de citas famosas - Slogan de motivación - Introducción a la API oculta de Android

Introducción a la API oculta de Android

..

Android P introduce restricciones de uso para interfaces que no son SDK (comúnmente conocidas como API ocultas). Este es otro ajuste importante después de las restricciones de enlaces en bibliotecas privadas en el NDK en Android N.

De ahora en adelante, ya sea el NDK de la capa nativa o el SDK de la capa Java, solo podemos usar la interfaz estándar pública proporcionada por Google. Por supuesto, esto es algo bueno para los desarrolladores, los usuarios e incluso para todo el ecosistema de Android.

Pero esto también significa que varias tecnologías negras en Android pueden desaparecer gradualmente.

Las interfaces públicas *** SDK son aquellas documentadas en el índice de paquetes de Android Framework.

A partir de Android Pie, el acceso a ciertas clases, métodos y campos ocultos está restringido. Antes de Pie, Fue muy fácil usar estos componentes ocultos que no pertenecen al SDK simplemente usando la reflexión.

Sin embargo, las aplicaciones orientadas a API 28 (Pie) o superior ahora encontrarán una ClassNotFoundException, NoSuchMethodError o NoSuchFieldException al intentar acceder a Activity#createDialog().

Primero echemos un vistazo a cómo el sistema implementa esta restricción.

Al acceder a interfaces no públicas a través de reflexión o JNI, se activarán advertencias/excepciones, etc., por lo que también puede rastrear el proceso de reflexión para ver en qué paso el sistema impone restricciones.

Veamos primero java.lang.Class.getDeclaredMethod(String):

Entre ellos, observe la llamada de ShouldBlockAccessToMember. Si devuelve falso, se devolverá nullptr directamente. , y la capa superior generará la excepción NoSuchMethodXXX, lo que activa restricciones del sistema.

El código fuente es el siguiente:

Continuar rastreando el método GetMemberAction:

Continuar rastreando el método GetMemberActionImpl:

Cuál se llama

Siempre que el método IsExempted devuelva verdadero, incluso si este método está en la lista negra, aún se liberará y se permitirá su llamada.

Método IsExempted:

Continúe rastreando el parámetro runtime-gt pasado; GetHiddenApiExemptions () descubre que también es un parámetro en tiempo de ejecución

En este. De esta manera, se puede modificar directamente oculto_api_exemptions_ omite las restricciones.

En la capa de Java, hay un método VMRuntime.setHiddenApiExemptions correspondiente. Al establecer condiciones de exención a través de VMRuntime.setHiddenApiExemptions, puede utilizar la reflexión.

El método DoesPrefixMatch se llama en el método IsExempted. DoesPrefixMatch realiza coincidencias de prefijos en firmas de métodos.

Las firmas de todas las clases de métodos Java comienzan con L, por lo que puede pasar L directamente y se perdonan todas las API ocultas.

Otra forma de evitar las restricciones de API no públicas en Android P y superiores