Red de conocimiento informático - Computadora portátil - Introducción a la API oculta de Android

Introducción a la API oculta de Android

Android P introduce restricciones en el uso de interfaces que no son SDK (a menudo llamadas API ocultas). Anteriormente, Android N realizó ajustes importantes a las restricciones de enlaces para bibliotecas privadas en el NDK.

De ahora en adelante, ya sea el NDK de la capa nativa o el SDK de la capa Java, solo podemos usar las interfaces estándar proporcionadas y expuestas por Google. Definitivamente, esto es algo bueno para los desarrolladores, los usuarios y todo el ecosistema de Android.

Pero esto también significa que todos los hackers de Android están en riesgo de extinción.

Las interfaces SDK públicas*** se refieren a aquellas interfaces registradas en el índice del paquete de marco de Android

A partir de Android Pie, el acceso a ciertas clases, métodos y campos ocultos ha sido restringido antes de ser restringidos a Pie, estos componentes ocultos que no pertenecen al SDK podrían manejarse fácilmente simplemente usando la reflexión.

Ahora, sin embargo, las aplicaciones API 28 (Pie) o superiores encontrarán una ClassNotFoundException, NoSuchMethodError o NoSuchFieldException Activity#createDialog() al intentar acceder a ellas.

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

Dado que el acceso a interfaces no públicas a través de la reflexión o JNI puede generar advertencias/excepciones, vale la pena rastrear el flujo de reflexión para ver exactamente dónde está la restricción.

Primero verifique java.lang.Class.getDeclaredMethod(String):

Verifique la llamada a ShouldBlockAccessToMember Si se devuelve false, se devuelve nullptr directamente y la capa superior arroja un NoSuchMethodXXX. excepción; esto activará la aceleración del sistema.

El código fuente es el siguiente:

Continuar rastreando el método GetMemberAction:

Continuar rastreando el método GetMemberActionImpl:

Este llamadas a métodos

Siempre que el método IsExempted devuelva verdadero, incluso si el método está en la lista negra, se liberará y se permitirá llamarlo.

Método IsExempted:

Continúe rastreando los parámetros pasados ​​en runtime-gt; GetHiddenApiExemptions (), encontramos que también es un parámetro dentro del tiempo de ejecución.

Esto le permite modificar oculta_api_exemptions_ directamente, evitando así la restricción.

A nivel de Java, existe un método VMRuntime.setHiddenApiExemptions correspondiente que establece exenciones a través de VMRuntime.setHiddenApiExemptions y puedes usar la reflexión con gusto.

El método DoesPrefixMatch se llama dentro del método IsExempted; DoesPrefixMatch es una coincidencia de prefijo para la firma del método. Las firmas de todas las clases de métodos Java comienzan con L, por lo que solo necesita pasarles una L y todas las API ocultas serán perdonadas.

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