El mapa de dependencia muestra lo que puede cambiar por sí solo

Una aplicación puede cargar una biblioteca principal que carga dependencias transitivas. Los SDK de terceros pueden incluir componentes nativos que dependen de las exportaciones o de un orden de inicialización particular.

Registre los nombres de las bibliotecas, las dependencias directas y transitivas, los puntos de entrada de carga, el tiempo de inicialización y las personas que llaman. De lo contrario, un cambio en un SO puede fallar solo cuando se carga otra biblioteca más tarde.

  • Dependencias primarias y transitivas
  • Bibliotecas del sistema y de terceros
  • Cargar orden de entrada e inicialización
  • Etapa de falla más temprana

El registro JNI restringe el tratamiento de símbolos

El registro estático se basa en convenciones de nomenclatura, mientras que el registro dinámico generalmente vincula los métodos Java a funciones nativas durante la inicialización. Impone diferentes restricciones a la visibilidad, el cambio de nombre y el tiempo de carga.

Antes de cambiar las exportaciones o la representación de funciones, identifique cómo se registra cada entrada importante, si la llama un código de reflexión o de terceros y cómo se diagnosticarán tanto Java como las fallas nativas.

ABI es un límite de ejecución, no una etiqueta

arm64-v8a, armeabi-v7a y x86_64 utilizan instrucciones, salidas vinculadas y dependencias diferentes. Una compilación o un lanzamiento exitoso del emulador para un ABI no establece otra arquitectura de destino.

Inspeccione las ABI en el APK final, luego verifique la resolución de dependencias, el inicio de la aplicación, las llamadas críticas a JNI, el manejo de errores y las rutas de SDK de terceros en cada arquitectura de destino.

  • El paquete final contiene el objetivo ABI
  • Cada dependencia se resuelve
  • Se repiten las rutas críticas JNI
  • Las arquitecturas descubiertas son explícitas.

Aceptar fuerza de protección con estabilidad de carga.

La reducción de símbolos, el tratamiento de cadenas y la virtualización de funciones eliminan diferentes pistas. Ninguna acción individual representa una protección nativa completa, y el inicio de aplicaciones o las funciones ejecutadas con frecuencia requieren una atención especial en el rendimiento.

Comience con un pequeño conjunto de funciones valiosas con entradas y salidas claras. Amplíe el alcance del mismo candidato y mantenga una versión recuperable para cada cambio de configuración.

Aplicar la guía a una aplicación real

Proporcione la pila, las rutas críticas, los sistemas de destino y el candidato actual para que Yudun pueda recomendar una revisión específica de protección y compatibilidad.