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