210 votes

Pourquoi "System.out.println" ne fonctionne-t-il pas sous Android ?

Je veux imprimer quelque chose dans la console, afin de pouvoir la déboguer. Mais pour une raison quelconque, rien ne s'imprime dans mon application Android.

Comment déboguer alors ?

public class HelloWebview extends Activity {
    WebView webview;    
    private static final String LOG_TAG = "WebViewDemo";
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webview = (WebView) findViewById(R.id.webview);
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebChromeClient(new MyWebChromeClient());
        webview.loadUrl("http://example.com/");    
        System.out.println("I am here");
    }

5 votes

Bien que vous ayez obtenu la réponse ci-dessous, j'aimerais ajouter que la sortie des instructions SOP est également dirigée vers LogCat : seulement, le nom de la balise serait System.out.

1 votes

Avant la version 0.9, System.out était perdu, je pense. Après il a été passé à la sortie logcat : code.google.com/p/Android/issues/detail?id=92 . (Si vous utilisez une bibliothèque existante ou autre qui utilise System.out, à tort ou à raison, elle apparaîtra dans logcat avec les versions ultérieures d'Android).

0 votes

Nous pouvons voir les System.out.printlns dans le logcat.

236voto

Dave Webb Points 90034

Correction :

Sur l'émulateur et la plupart des appareils System.out.println est redirigée vers LogCat et imprimée à l'aide de la fonction Log.i() . Cela peut ne pas être vrai sur les versions très anciennes ou personnalisées d'Android.

Original :

Il n'y a pas de console à laquelle envoyer les messages. System.out.println les messages se perdent. De la même manière que cela se produit lorsque vous exécutez une application Java "traditionnelle" avec la fonction javaw .

Au lieu de cela, vous pouvez utiliser la fonction Android Log classe :

Log.d("MyApp","I am here");

Vous pouvez ensuite consulter le journal soit dans le Logcat dans Eclipse, ou en exécutant la commande suivante :

adb logcat

Il est bon de prendre l'habitude de regarder la sortie de logcat car c'est aussi là que sont affichées les traces de pile de toutes les exceptions non capturées.

La première entrée de chaque appel d'enregistrement est la balise d'enregistrement qui identifie la source du message d'enregistrement. Ceci est utile car vous pouvez filtrer la sortie du journal pour n'afficher que vos messages. Pour être sûr d'être cohérent avec votre étiquette de journal, il est probablement préférable de la définir une fois en tant qu'élément static final String quelque part.

Log.d(MyActivity.LOG_TAG,"Application started");

Il existe cinq méthodes à une lettre dans Log correspondant aux niveaux suivants :

  • e() - Erreur
  • w() - Avertissement
  • i() - Informations
  • d() - Débogage
  • v() - Verbose
  • wtf() - Un terrible échec

En La documentation indique ce qui suit à propos des niveaux :

Verbose ne devrait jamais être compilé dans une application, sauf pendant le développement. Les journaux de débogage sont compilés mais supprimés au moment de l'exécution. Les journaux d'erreur, d'avertissement et d'information sont toujours conservés.

36 votes

En fait, System.out imprime dans LogCat par l'intermédiaire de Log.i().

7 votes

@JosephEarl - N'hésitez pas à utiliser le bouton Modifier.

11 votes

Il y a aussi Log.wtf() :-)

18voto

Maurits Rijk Points 4873

Utiliser le Classe de journal . Sortie visible avec LogCat

18voto

kaushikSuman Points 171

Oui, c'est le cas. Si vous utilisez l'émulateur, il apparaîtra dans la vue Logcat sous la rubrique System.out tag. Écrivez quelque chose et essayez-le dans votre émulateur.

3 votes

En plus de cette réponse, gardez à l'esprit que parfois "quelque chose se passe" et qu'aucune entrée n'est imprimée avec l'utilisation de System.out. Si c'est le cas, essayez de fermer et de redémarrer l'émulateur. Cela a fonctionné pour moi.

2voto

Marc Points 554

Bien entendu, pour voir le résultat dans logcat, vous devez régler le niveau de journalisation au moins sur "Info" ( Niveau de journalisation dans logcat ) ; sinon, comme cela m'est arrivé, vous ne verrez pas votre résultat.

2voto

7heaven Points 607

Si vous avez vraiment besoin que System.out.println fonctionne (par exemple, s'il est appelé par une bibliothèque tierce), vous pouvez simplement utiliser la réflexion pour changer le champ dans System.class :

try{
    Field outField = System.class.getDeclaredField("out");
    Field modifiersField = Field.class.getDeclaredField("accessFlags");
    modifiersField.setAccessible(true);
    modifiersField.set(outField, outField.getModifiers() & ~Modifier.FINAL);
    outField.setAccessible(true);
    outField.set(null, new PrintStream(new RedirectLogOutputStream()); 
}catch(NoSuchFieldException e){
    e.printStackTrace(); 
}catch(IllegalAccessException e){
    e.printStackTrace(); 
}

Classe RedirectLogOutputStream :

public class RedirectLogOutputStream extends OutputStream{
    private String mCache;

    @Override
    public void write(int b) throws IOException{
        if(mCache == null) mCache = "";

        if(((char) b) == '\n'){
            Log.i("redirect from system.out", mCache);
            mCache = "";
        }else{
            mCache += (char) b;
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X