2016-11-07 3 views
2

Android est basé sur un noyau Linux, et pour autant que je sache, les binaires ELF liés statiquement nécessitent seulement un noyau pour fonctionner. Bien qu'Android n'inclue pas la glibc, l'interface d'appel système devrait toujours exister, étant intégrée dans le noyau. Je sais que toute application pratique serait énorme lorsqu'il est lié statiquement, mais c'est purement hypothétique. Cela fonctionnerait-il?Est-il possible d'exécuter un binaire ELF lié statiquement sur Android?

Répondre

1

Je suppose que ce que vous voulez faire est de prendre quelques bibliothèques statiques sur votre machine Linux et les lier statiquement avec un fichier d'objet de votre cru pour tenter de surmonter leur absence sur Android. Le problème avec ceci est que les deux machines n'utilisent presque certainement pas les mêmes architectures CPU donc les bibliothèques ne sont pas construites pour Android et le code machine ne sera pas "compris" par Android. Théoriquement, vous devrez également compiler les bibliothèques de manière croisée et lier votre programme avec cela. Cependant, Android a déjà une bibliothèque C standard appelée Bionic. Il remplace la glibc sur Android.

0

Pour le développement natif sur Android, vous créez généralement natifs .donc bibliothèques qui doivent être croix compilées pour chaque architecture supportée (arm, arm64, mips, x86, x86_64). Ces bibliothèques peuvent être chargées référencées par un fichier APK en utilisant JNI appels. Bien que vous puissiez utiliser les fichiers binaires ELF (.so les fichiers sont créés avec un compilateur standard tel que gcc), vous en aurez besoin pour chaque architecture cible sur laquelle vous souhaitez exécuter votre application.

également tandis que Android peut charger la version x86 ou le bras des .so fichiers pour x86_64 & arm64 respectivement, il est recommandé de créer les 4 versions si c'est ce que vous soutenez. Les bibliothèques natives sont chargées en fonction de la structure du dossier.

Exemple: un système arm46 charge le bras .so fichier sur lib/arm SEULEMENT SI lib/arm46 n'existe pas. Le résultat est que toutes les libraires qui incluent lib/arm64 provoqueront la rupture de votre application sur les systèmes arm64, sauf si vous incluez à la fois une version arm & arm64.