adb logcatコマンドを使用して、Android端末のLogログを表示する
adb logcatコマンドを使用して、Android端末のLogログを表示する
モバイルアプリのログを別の場所でデバッグするために、中のLogログを見なければならないことがあります。
この記事では、スタジオを必要とせずにスマホプログラムでLogログを表示する方法を教えます。
adbコマンドを使うことが前提なので、電話とパソコン、そしてadbのインストールが必要で、adbのプログラムは数メガバイトの小さなものです。
I. cmdウィンドウで電話のログを表示する
スマホが接続されていることを確認した後(adb deviceで、パソコンに接続されているスマホを確認することができます)
cmdウィンドウに以下のコマンドを入力すると、StudioのLogcatウィンドウのようにログメッセージを表示することができます。
//Format 1: Print default log data
adb logcat
//format 2: simple data that requires logging details
adb logcat -v time
//format 3: you need to print a message with the level Error
adb logcat *:E
//format 4: need to print the time and level of the information is Error
adb logcat -v time *:E
//Format 5: Save the log to a fixed location on your computer, such as D:\log.txt
adb logcat -v time >D:\log.txt
この時点で電話のログは何でも更新され、cmdウィンドウは並行してデータを更新していきます。
しかし、これにはフィルターがなく、Logのログが大量にあると、欲しい情報を探すのが大変です。
もちろんcmdのデータをテキストにコピーしてゆっくり処理することも可能ですが、あまり効率的ではありません。
以下では、adb logcatの詳細なパラメータコマンドと、ログを効率的に出力したり、指定した場所に保存したりする方法について説明します。
II. adb logcatの説明
adb logcat を使ったことがあるが、具体的なコマンドを覚えていない場合
adb logcat -helpと入力すると、いくつかの簡単なデータフォーマットを見ることができます。
しかし、adb logcatを使ったことがない人は、上記のコマンドで何をすればいいのか分からないと思います。後で紹介を見るところから始めるといいでしょう。
1. adn logcatのログフォーマット
adb logcat [<option>] ... [<filter-spec>] ...
adb logcat [option...] [filter-spec...] ... ,
最初の-s, -vはオプション、次のV, D, I, W, E, F, Sはレベルフィルタ項目、同じタグは1つのフィルタ項目しか持てません、複数のタグは複数のフィルタ項目を持つことができます。
まずは、比較的単純なフィルター項目から。オプションについては後で説明します。
2. レベルによるログの絞り込み
フォーマット
adb logcat <tag>[:priority]
タグは、タグ、優先出力のレベル
ログのレベルのデフォルトはVで、エラーログであればEを選んで終了です。
Android's logging is divided into several priority levels (priority) as follows.
V -- Verbose (lowest, most output)
D -- Debug
I -- Info
W -- Warning
E -- Error
F -- Fatal
S -- Silent (highest, no output at all)
ログをレベルでフィルタリングすると、そのレベル以上のログが出力されます。
例えば、コマンド
adb logcat *:W
実は*はタグでもよく、指定がない場合は全てという意味です。
は、Warning、Error、Fatal、Silentのログを出力します。
(注意:macOSでは、"Spirit "コマンドに adb logcat "のように、*をタグとしてWを指定します。 :W"でないと、マッチングが見つからなかったと報告されます。*:W.)
3. タグとレベルによるログのフィルタリング
複数の[:priority]で構成することができます。
例えば、コマンドのようなものです。
adb logcat ActivityManager:I MyApp:D *:S
タグActivityManagerに対するInfoレベルのロギング、タグMyAppに対するDebugレベルのロギング、その他のタグに対するSilentレベルのロギング(他のタグのログをブロックする)の出力を示す。
### しかし、tag コマンドを使ってもうまくフィルタリングできないことに気づきました。また、tagを使うとその後に続くレベルが無効になってしまうので、tagには*記号を使った方が無難です。
4. adb logcatオプションの解決
--"-s" option : Set the output log *:s tag, only logs with that tag will be displayed;
--"-f" option : output log to file, default output to standard output stream, -f argument will not work;
--"-r" option : output logs per thousand bytes, requires -f parameter, but this command is not executed successfully;
--"-n" option : set the maximum number of logs to be output, need -r parameter, this command has the same effect as adb logcat;
--"-v" option : Set the output format of the log, note that only one option can be set;
--"-c" option : clear all log cache information;
--"-d" option : output the cached logs to the screen without blocking;
--"-t" option : output the last few lines of logs, and exit after output, without blocking;
--"-g" option : View log buffer information;
--"-B" option : output logs in binary form;
上記のオプションの多くは基本的に無意味で、例えば -s は *:s のログをフィルタリングするのと同じなので、ログは出力されません
ここでは、より一般的に使用されるオプションである-vと-cを紹介します。
(1) adb logcat -v
-v はログの出力形式を設定するためのものです。
ログは以下の形式に対応しています。
概要
デフォルトの書式です。というフォーマットで表示されます。
<priority>/<tag>(<pid>): <message>
例
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
#####プロセス
というフォーマットで表示されます。
<priority>(<pid>) <message>
例
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
#####タグ
というフォーマットで表示されます。
<priority>/<tag>: <message>
例
D/HeadsetStateMachine: Disconnected process message: 10, size: 0
#####ーー④raw
書式は
<message>
例
Disconnected process message: 10, size: 0
#####時
というフォーマットで表示されます。
<datetime> <priority>/<tag>(<pid>): <message>
例
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
#####スレッドタイム
というフォーマットで表示されます。
<datetime> <pid> <tid> <priority> <tag>: <message>
例
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
#####長さ
というフォーマットで表示されます。
[ <datetime> <pid>:<tid> <priority>/<tag> ]
#####⑧
例
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0
##### ⑨ 指定された書式は、上記のフィルターと組み合わせて使用することができます。例えば
adb logcat -v long ActivityManager:I *:S
vオプションの場合。
必要なものが通常のログであれば、-v time を使用しても問題ありません。
スレッドの区別を見る必要がある場合は、-v threadtime を使用すると良いでしょう。他のログも基本的に控えめに使用します。
(2) adb logcat -c
adb logcat -c はキャッシュ情報をクリアするために使用されます。
3つ目は、ログ情報をパソコンに保存することです
adb logcat の最後に " > the address to save the file " を追加してください。
例えば、パソコンに保存する場合は、以下のコマンドを使用します。
adb logcat -v time > D:\log.txt
Dドライブにlog.txtファイルが作成され、以前のログメッセージが表示されます。
コマンドに特定の場所を指定しない場合
adb logcat -v time > log.txt
このファイルは、Cドライブのユーザー名のフォルダに保存されます。
IV. adb logcatの使用法 まとめ
よく使われるコマンドは2つか3つだけです。
1. adb logcat -v time
2. adb logcat -v time > D:\log.txt
3. adb logcat -c
ログ情報を直接表示すると、前回電源を入れた時のログから始まるようで、多くのログ情報が表示されます
一番良いのは、-cで以前のログメッセージをクリアし、イベントをトリガーして最新のログメッセージを見ることです
## 私の例の一つを紹介します。
MainActivityのライフサイクルに、Logの表示、ログのクリア、プログラムの実行、ログテキストの表示を行うメソッドをいくつか記述してください。
###1.Androidのコードです。
package com.example.wenzhi.adblog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private String TAG = "adb MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
new Thread(new Runnable() {
@Override
public void run() {
Log.e(TAG,"onPause on over thread");
}
}).start();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy");
}
}
###2. adbのコマンドと手順、結果
###3. cmdウィンドウに直接ログが表示される場合
ログウィンドウは常に大きくなっています。
これで、adb logcatの詳しい使い方は終了です。
adbのコマンドについてもっと知りたい方は、https://github.com/mzlogin/awesome-adb#%E6%9F%A5%E7%9C%8B%E6%97%A5%E5%BF%97。
実は、上記は簡単な知識であり、それを学ぶための知識の探求です。
しかし、実際に使用されるコマンドは数少ない。
多くの人が、この記事を閲覧しているのを見ると
そろそろ本当に実用的なものをみんなに教えてあげてもいいんじゃないかと思うんです。
はadbスクリプトです。
実際の開発では、adbスクリプトを使用することで、世界が変わります。
以下は、私が個人的に開発で使っているロギング用のスクリプトです。
ダブルクリックで実行できるので、とても簡単です。
V. 開発で役立つロギングスクリプトについて
1.ログキャッシュのクリア.bat
adb logcat -c
このスクリプトは、以下のログ取得スクリプトと組み合わせて使用することで、以前にキャッシュしたデータをクリアし、現在取得できるログ情報のみを取得することができます。
2. GetLogFile.bat
adb wait-for-device
adb devices
adb shell logcat -v threadtime >"%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%log.txt"
pause
このログは、システムの問題であっても、問題を分析するのに有効です。
また、ここにwait-for-deviceを追加することで、起動時の再起動やシステムハングなどの問題を突き止められるケースもあるようです。
3. Androidのログ.batを全て取得する
Androidのログファイル全体を取得します。このためにはroot権限が必要です。
adb pull /data/log/android_logs/
pause
echo ####Current: %date% %time%
set date_time="%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
adb shell dumpsys window > windowInof_%date_time%.txt
pause
4.システム最前面のウィンドウ情報取得.bat
@echo off
::V1.0 2021-1-18
::Each system is different, you can add or remove unnecessary directories to get the data according to your needs
echo Version number: Get Android All Log V1.0
echo.
echo The current time is: %time% that is %time:~0,2% points%time:~3,2% minutes%time:~6,2% seconds%time:~9,2% centiseconds@
set date_time="%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%_%time:~6,2%%time:~9,2%"
::set the name of the displayed folder
set Folder="Logs_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%_%time:~6,2%%time:~9,2%"
echo Log folder: %Folder%
mkdir %Folder%
::Get root privileges, the following pull some private directory data need root privileges
adb remount
adb root
::Create folder
mkdir %Folder%\device
::Get all app services of the system
adb shell ps -A > %Folder%\device\ps.txt
::Get the system's cup and other occupancy
adb shell top -b -n 1 > %Folder%\device\top.txt
::Get information about the top ten most occupied processes in the system's cup
adb shell top -b -n 1 -H -m 10 -s 6 -o pid,tid,user,pr,ni,%%cpu,s,virt,res,pcy,cmd,name > %Folder%\device\top2.txt
::Get the process kernel information of the system
adb shell cat /proc/cmdline > %Folder%\device\cmdline.txt
::Get the system's process memory usage information
adb shell cat /proc/meminfo > %Folder%\device\meminfo.txt
::Get the system's cup information
adb shell cat /proc/cpuinfo > %Folder%\device\cpuinfo.txt
::Get the system's prop property information
adb shell getprop > %Folder%\device\getprop.txt
::Get the system's memory size information
adb shell df -h > %Folder%\device\df.txt
::Get a screenshot of the system's current interface
adb shell screencap /mnt/sdcard/Pictures/capture.png
adb pull /mnt/sdcard/Pictures/capture.png %Folder%\capture.png
::Get the system dumpsys information, including the dumpsys package XXX
mkdir %Folder%\dumpsys
adb shell dumpsys > %Folder%\dumpsys\dumpsys.txt
::Get the system's cache log
adb shell logcat -v threadtime -d > %Folder%\logcat.txt
::Get the logs of each directory of the system, adapt to different systems
::System Android logs
adb pull /data/log/android_logs %Folder%\android_logs
::Error logs caused by Dalvik, state monitoring debugger, C-level code and some problems with libc
adb pull /data/tombstones %Folder%\tombstones
::System ANR exception logs
adb pull /data/anr %Folder%\anr
::System kernel logs
adb pull /sys/fs/pstore %Folder%\pstore
::System kernel application crash data
adb pull /data/system/dropbox %Folder%\dropbox
::System? logs
adb pull /data/log/reliability %Folder%\reliability_system
adb pull /data/vendor/log/reliability %Folder%\reliability_vendor
::System, secure, global, etc. properties under system settings
adb pull /data/system/users/0 %Folder%\settings
::Get the recovery information of the system
mkdir %Folder%\recovery
adb pull /splash2/recovery %Folder%\recovery
echo.
echo ==========log \recovery completed ==========
pause
このスクリプトは、現在のActivity名とapkのパッケージ名などを取得します。
windowInof.txt ファイルで、キーワード: mCurrentFocus を検索してください。
例えば、UC Browserのインターフェース情報です。
mCurrentFocus=Window{86e35b9 u0 com.UCMobile/com.uc.browser.InnerUCMobile} です。
パッケージ名: com.UCMobile
アクティビティフルパス:com.UCMobile/com.uc.browser.
4. GetFullLog.bat
システム開発では、次のようなロギングスクリプトが非常によく使われます。
以下のロギングスクリプトは、システム開発において、システム内のすべての重要なデータを取得するために使用されます。
システムにどんな問題が生じても、それを情報化することができます。
これは、システム開発にも適用され、root権限が必要となります。
通常のユーザーが利用できないファイルディレクトリがあるため
@echo off
::V1.0 2021-1-18
::Each system is different, you can add or remove unnecessary directories to get the data according to your needs
echo Version number: Get Android All Log V1.0
echo.
echo The current time is: %time% that is %time:~0,2% points%time:~3,2% minutes%time:~6,2% seconds%time:~9,2% centiseconds@
set date_time="%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%_%time:~6,2%%time:~9,2%"
::set the name of the displayed folder
set Folder="Logs_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%_%time:~6,2%%time:~9,2%"
echo Log folder: %Folder%
mkdir %Folder%
::Get root privileges, the following pull some private directory data need root privileges
adb remount
adb root
::Create folder
mkdir %Folder%\device
::Get all app services of the system
adb shell ps -A > %Folder%\device\ps.txt
::Get the system's cup and other occupancy
adb shell top -b -n 1 > %Folder%\device\top.txt
::Get information about the top ten most occupied processes in the system's cup
adb shell top -b -n 1 -H -m 10 -s 6 -o pid,tid,user,pr,ni,%%cpu,s,virt,res,pcy,cmd,name > %Folder%\device\top2.txt
::Get the process kernel information of the system
adb shell cat /proc/cmdline > %Folder%\device\cmdline.txt
::Get the system's process memory usage information
adb shell cat /proc/meminfo > %Folder%\device\meminfo.txt
::Get the system's cup information
adb shell cat /proc/cpuinfo > %Folder%\device\cpuinfo.txt
::Get the system's prop property information
adb shell getprop > %Folder%\device\getprop.txt
::Get the system's memory size information
adb shell df -h > %Folder%\device\df.txt
::Get a screenshot of the system's current interface
adb shell screencap /mnt/sdcard/Pictures/capture.png
adb pull /mnt/sdcard/Pictures/capture.png %Folder%\capture.png
::Get the system dumpsys information, including the dumpsys package XXX
mkdir %Folder%\dumpsys
adb shell dumpsys > %Folder%\dumpsys\dumpsys.txt
::Get the system's cache log
adb shell logcat -v threadtime -d > %Folder%\logcat.txt
::Get the logs of each directory of the system, adapt to different systems
::System Android logs
adb pull /data/log/android_logs %Folder%\android_logs
::Error logs caused by Dalvik, state monitoring debugger, C-level code and some problems with libc
adb pull /data/tombstones %Folder%\tombstones
::System ANR exception logs
adb pull /data/anr %Folder%\anr
::System kernel logs
adb pull /sys/fs/pstore %Folder%\pstore
::System kernel application crash data
adb pull /data/system/dropbox %Folder%\dropbox
::System? logs
adb pull /data/log/reliability %Folder%\reliability_system
adb pull /data/vendor/log/reliability %Folder%\reliability_vendor
::System, secure, global, etc. properties under system settings
adb pull /data/system/users/0 %Folder%\settings
::Get the recovery information of the system
mkdir %Folder%\recovery
adb pull /splash2/recovery %Folder%\recovery
echo.
echo ==========log \recovery completed ==========
pause
便利なスクリプトがたくさんありすぎて、紹介しきれないので
以下はスクリプトのパッケージで、必要であれば自分でダウンロードすることができます。
https://download.csdn.net/download/wenzhi20102321/15059091
以下の主要な要素を含む。
adbスクリプトを上げると、adbコマンドの繰り返し操作に便利です。
Together : もっと意味のあることをしよう。
関連
-
android.os の NetworkOnMainThreadException。
-
android:EMSのプロパティ
-
IllegalStateException。ArrayAdapter は、リソース ID が TextView である必要があります。
-
AndroidでListViewを使ってカスタムテーブルを描画する
-
Android Get set image.setImageResource(R.drawable.xxx) リソース
-
Android基本アプレット
-
Androidカスタムドロップダウンリストボックスコントロール
-
超シンプルなアンドロイドのタイムディレイ機能
-
AndroidStudioのショートカット 検索/置換
-
AndroidManifest.xmlの最も完全な詳細な説明
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Android.mk:7: *** セパレータがありません。
-
Android開発で「Attempt to invoke virtual method 'XXX()' on null object reference」というヌルポインター例外に遭遇する。
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
repo: コマンドが見つかりません
-
Androidで、onTouchEventでダブルクリックを実装し、ダブルクリックイベントとして判定する方法
-
Android ProgressBarの色を変更する
-
Androidのカラーグラデーション実装のまとめ
-
アンドロイドスタジオ学習入門
-
Android TextViewは、テキスト内容が表示省略記号を超えているかどうかを判断する
-
Android自動テストフレームワーク Robotium