27 votes

Exécution de son propre exécutable sur le shell Android

J'ai besoin d'un outil de ligne de commande spécifique et j'ai créé un programme en C dans mon shell Linux. J'ai compilé le programme avec un compilateur croisé ARM. J'ai ensuite déplacé le programme dans le système de fichiers Android et j'ai essayé de l'exécuter.

Le résultat est "permission denied".

Que dois-je faire pour exécuter mes propres programmes compilés dans le système de fichiers Android ?

23voto

pr0nin Points 353

Je suppose que vous avez utilisé adb push pour télécharger votre exécutable sur la carte SD. Malheureusement, la carte sd est toujours montée avec "noexec" ce qui signifie que vous ne pouvez rien exécuter à partir d'ici.

Vous devez donc copier l'exécutable dans le système de fichiers local, par exemple dans /data/local. Si l'appareil n'est pas enraciné ou si BusyBox n'est pas installé, il n'y aura pas de commande "cp". Vous pouvez simplement utiliser cat : cat /sdcard/myprog > /data/local/myprog .

Ensuite, vous devez définir l'autorisation d'exécution sur l'exécutable. Chmod sur Android ne supporte généralement pas la syntaxe "u+x". Vous devez donc appeler chmod 555 /data/local/myprog .

Ensuite, vous pouvez exécuter votre exécutable : /data/local/myprog .

Sinon, le répertoire /data/local/tmp peut être utilisé. Via le shell adb, vous avez un accès complet à ce répertoire. Sur les appareils modernes (Android 11+), les applications ne peuvent pas lister les fichiers de ce répertoire, mais elles sont toujours capables d'exécuter des exécutables à partir de ce répertoire si vous fournissez le chemin complet de l'exécutable.

18voto

Koorosh Ghorbani Points 281

Tout d'abord, vous devez le pousser dans un répertoire, tel que /data/local/tmp . Ensuite, vous devez définir la permission pour cela en utilisant chmod 755 executable . Après cela, vous pouvez l'exécuter en tant que ./executable .

Les étapes complètes sont les suivantes :

adb push executable /data/local/tmp
adb shell
cd /data/local/tmp
chmod 755 executable
./executable

Si vous voulez l'exécuter à partir de votre dossier de ressources, vous devez copier le fichier dans votre dossier de données. /data/data/packagename/ . Ensuite, en utilisant File de la classe, définissez le setExecutable pour true pour le fichier et l'exécuter à l'aide de la classe Process ou de paquets tiers tels que Outils de racine .

UPDATE
si vous ciblez le sdk 29 ou plus, vous ne pouvez pas utiliser le binaire de votre dossier d'actifs ! vous devez copier votre binaire dans le dossier jnilib puis l'exécuter depuis le répertoire de la bibliothèque native ! context.getApplicationInfo().nativeLibraryDir

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X