1. ホーム
  2. アンドロイド

adb logcatコマンドを使用して、Android端末のLogログを表示する

2022-02-23 15:23:59
<パス

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 : もっと意味のあることをしよう。