La carte des dépendances montre ce qui peut changer seul

Une application peut charger une bibliothèque principale qui charge les dépendances transitives. Les SDK tiers peuvent inclure des composants natifs qui dépendent des exportations ou d'un ordre d'initialisation particulier.

Enregistrez les noms des bibliothèques, les dépendances directes et transitives, les points d'entrée de chargement, le timing d'initialisation et les appelants. Une modification dans un SO peut autrement échouer uniquement lors du chargement ultérieur d’une autre bibliothèque.

  • Dépendances primaires et transitives
  • Bibliothèques système et tierces
  • Ordre de saisie et d'initialisation du chargement
  • Première étape de défaillance

L'enregistrement JNI limite le traitement des symboles

L'enregistrement statique repose sur des conventions de dénomination, tandis que l'enregistrement dynamique lie généralement les méthodes Java aux fonctions natives lors de l'initialisation. Ils imposent différentes contraintes en matière de visibilité, de renommage et de timing de chargement.

Avant de modifier les exportations ou la représentation des fonctions, identifiez comment chaque entrée importante est enregistrée, si une réflexion ou un code tiers l'appelle, et comment les échecs Java et natifs seront diagnostiqués.

ABI est une limite d'exécution, pas une étiquette

arm64-v8a, armeabi-v7a et x86_64 utilisent des instructions, des sorties liées et des dépendances différentes. Un lancement réussi de build ou d’émulateur pour un ABI n’établit pas une autre architecture cible.

Inspectez les ABI dans le APK final, puis vérifiez la résolution des dépendances, le lancement de l'application, les appels critiques JNI, la gestion des erreurs et les chemins SDK tiers sur chaque architecture cible.

  • Le package final contient la cible ABI
  • Chaque dépendance se résout
  • Répétition des chemins critiques JNI
  • Les architectures découvertes sont explicites

Acceptez la force de protection avec la stabilité de chargement

La réduction des symboles, le traitement des chaînes et la virtualisation des fonctions suppriment différents indices. Aucune action ne représente une protection native complète, et le lancement d'applications ou les fonctions fréquemment exécutées nécessitent une attention particulière en termes de performances.

Commencez par un petit ensemble de fonctions précieuses avec des entrées et des sorties claires. Étendez la portée sur le même candidat et conservez une version récupérable pour chaque changement de configuration.

Appliquer les conseils à une application réelle

Fournissez la pile, les chemins critiques, les systèmes cibles et le candidat actuel afin que Yudun puisse recommander un examen ciblé de la protection et de la compatibilité.