Maison > Java > javaDidacticiel > le corps du texte

Pourquoi ma commande Shell fonctionne-t-elle dans le terminal mais échoue-t-elle en Java ?

Patricia Arquette
Libérer: 2024-11-10 10:06:03
original
477 Les gens l'ont consulté

Why Does My Shell Command Work in Terminal but Fail in Java?

Exécution de commandes Shell depuis Android : un voyage du terminal à Java

Dans leur quête d'automatisation des fonctionnalités des appareils, les développeurs Android rencontrent souvent le besoin d'exécuter des commandes Shell par programme. Bien que cela soit simple à partir de l'émulateur de terminal, exécuter les mêmes commandes à partir de Java peut présenter des défis. Cet article de questions-réponses explique pourquoi la même commande qui fonctionne dans un émulateur de terminal peut ne pas réussir en Java et fournit une solution pour surmonter cet obstacle.

Problème : l'exécution de la commande Shell échoue en Java

Un développeur tentant d'enregistrer son écran à l'aide de la nouvelle commande screenrecord dans Android KitKat a remarqué que la commande fonctionnait parfaitement dans l'émulateur de terminal, mais échouait lorsqu'elle était exécutée à partir d'une application Java à l'aide de Process.exec(). Ils ont demandé des conseils sur l'origine du problème et comment le résoudre.

Réponse : Accorder des autorisations à la commande

Le nœud du problème provenait du fait que la commande screenrecord nécessite des autorisations élevées, généralement accordé avec l'utilisation de «su» (super-utilisateur). Lors de l'exécution de la commande depuis l'émulateur de terminal, l'utilisateur fournit 'su' manuellement, en accordant les autorisations nécessaires. Cependant, lors de l'exécution de la commande à partir de Java, l'application ne disposait pas de l'élévation requise.

Solution : inviter l'accès root via l'entrée standard du processus

La solution consistait à demander l'accès root dans le code Java. . La commande « su » est généralement suivie d'une nouvelle ligne et de la commande qui doit être exécutée. En récupérant le flux d'entrée standard du processus 'su' et en y écrivant la commande, le développeur pourrait efficacement imiter le comportement de l'émulateur de terminal.

L'extrait de code suivant illustre la solution :

try{
    Process su = Runtime.getRuntime().exec("su");
    DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());
    
    outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n");
    outputStream.flush();
    
    outputStream.writeBytes("exit\n");
    outputStream.flush();
    su.waitFor();
}catch(IOException e){
    throw new Exception(e);
}catch(InterruptedException e){
    throw new Exception(e);
}
Copier après la connexion

Conclusion

En utilisant la solution fournie, les développeurs peuvent exécuter avec succès des commandes shell à partir d'applications Java, même celles nécessitant des autorisations élevées. Cette technique ouvre la possibilité d'automatiser diverses fonctions de l'appareil et d'améliorer les capacités des applications.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal