2011-11-11 9 views
0

問題1: 私のアプリケーションを使用してカーネルログを他のファイルにリダイレクトしたい。 正しく実行するには?Runtime.execを使用してdmesgのデータをリダイレクトする方法は?

Runtime.getRuntime().exec("dmesg > /data/kernel_log.txt"); 

問題2: 私は私のアプリを使用してカーネルログをクリアしたいコードは、以下のようなものです。以下のコードを修正する方法。

Runtime.getRuntime().exec("dmesg -c"); 

注1: 私の目標は、STARTから最新のカーネル(のdmesg)のすべてのログを取得することです。 dmesgにはバッファサイズの制限があり、バッファのサイズを変更するためにカーネルを再構築したくないので です。

注2:これは非常に関連しています。 android : how to run a shell command from within code

注3:現在、私は、ENGモードのビルドでデバイスを使用しています、私は修正しています、これが根付いていることを意味?

Logcatエラーメッセージ:

11-11 20:18:47.910: E/DmesgGetterService(2885): java.io.IOException: Error running exec(). Command: [dmesg > /data/kernel_log.txt] Working Directory: null Environment: null 
... 
11-11 20:19:07.920: E/DmesgGetterService(2885): Caused by: java.io.IOException: No such file or directory 
... 
+1

私はアンドロイドでは一度も働いたことはありませんが、それが "Desktop-Linux"と似ていると思うと、/ procファイルシステムからdmesg-infoを入手できるはずです。 IIRC dmesgは、仮想ファイル/ proc/kmesgを出力するための略語です。 – Jonathan

+0

はい、次のようにカーネルログを取得できます:Runtime.getRuntime()。exec( "dmesg"); – quiel

+0

問題は出力を別のファイルにリダイレクトできないことです。私はFileOutputStreamを使用することができますが、これは行単位でループするので、メモリ使用量が大きくかかる可能性があります。 – quiel

答えて

0

私は別の方法でのdmesgログを取得することができました。 AlarmManagerを使用して指定した間隔でサービスを実行すると、カーネルからログを取得し、前の実行からコピーした最後の行を見つけて新しいログを追加します。それでおしまい!