3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidのlogcatをTerminalで

Last updated at Posted at 2018-11-19

IDEのLogcatViewerの不満

Logcatの定番Viewerといえば,Android StudioのLogcatViewerですよね.
でも,不満がありました

解像度が小さいサブディスプレイで扱いにくい

会社で支給されてるディスプレイ,サブディスプレイの解像度が小さいんです.
(いや,多分言えば買ってくれるんでしょうけど,どうせ置き場所もないし)

それは置いておいて,

image.png

フィルターのテキストエリア狭いよおおおお!!

ちなみにFullHDでもこの大きさ.たくさんフィルター掛けたい単語を並べるのもツライです.

image.png

タブ化したい

LogcatViewer,タブ化したいって思ったことありませんか?
TAG1 と TAG2 と Warn以上でフィルタしたログを並べて見たい!!!という欲求.
Android StudioのLogcatViewerは複タブ化できません.
フィルターの条件を複数指定することはできますが,1つのViewに流れてしまいます.

Terminalで解決してみる

adb logcat を Terminal で動かして解決しようと思います.

Step1. 色を変える

adb logcat はそのまま出力しても全てのログレベルで文字色変わらないので, Terminalで色付きadb logcat の記事を参考に logcat_color.awk を作りました.
Ubuntuターミナルのデフォルト背景は暗めの色なので,カラー指定だけ変えています.
(ちなみに,任意の色を指定する方法,だれかご存知でしたら教えてください.赤がまだ見難いです…)

logcat_color.awk
# !/usr/bin/awk -f

# adb logcat -v time
/^.* V\/.*$/ { print "\033[0m" $0 }
/^.* D\/.*$/ { print "\033[0;94m" $0 "\033[0m" }
/^.* I\/.*$/ { print "\033[0;92m" $0 "\033[0m" }
/^.* W\/.*$/ { print "\033[0;93m" $0 "\033[0m" }
/^.* E\/.*$/ { print "\033[0;91m" $0 "\033[0m" }

とりあえず, adb logcat -v time | ~/bin/logcat_color.awk とlogcatの出力をawkに流して色が付けば成功です.

Step2. 複タブ化してみる

Ubuntuの場合, gnome-terminal --tab で新しいタブを開くことができます(ひとつ目のみ新しいWindow)
Terminalで gnome-terminal --tab --tab とするとこんな感じです

名称未設定.png

タブが2個開かれた状態でターミナルが開きます.

Step3. 開いたタブでコマンドを実行する

gnome-terminal は -e オプションでコマンドを渡すことができます.
別タブで監視したいフィルターを書いた adb logcat コマンドを渡して,タブで動かします.

gnome-terminal \
--tab -e "sh -c 'adb logcat -v time WifiStateMachine:S VM_BMS:S ThermalEngine:S StatusBar:S QC-QMI:S | ~/bin/logcat_color.awk'" \
--tab -e "sh -c 'adb logcat -v time -s ActivityManager:* | ~/bin/logcat_color.awk'" \
--tab -e "sh -c 'adb logcat -v time *:W | ~/bin/logcat_color.awk'" \

上から,

  • 指定タグを除いたログを表示
  • ActivityManagerのログを表示
  • Warn以上のログレベルを表示

です.

Step4. bashスクリプト化

おおよそ取得したいログは決まっています.
毎回上を手打ちしたりコピペするのも面倒なので,bashスクリプトにまとめます.

~/bin/logcat.sh
# /bin/bash

exclude="WifiStateMachine:S VM_BMS:S ThermalEngine:S StatusBar:S QC-QMI:S" # ここに除外したいフィルター条件を並べる

gnome-terminal \
--tab -e "sh -c 'adb logcat -v time ${exclude} | ~/bin/logcat_color.awk'" \
--tab -e "sh -c 'adb logcat -v time -s ActivityManager:* | ~/bin/logcat_color.awk'" \
--tab -e "sh -c 'adb logcat -v time *:W | ~/bin/logcat_color.awk'" \

あとは好きなフィルター条件を書いて並べるだけです!

まとめ

1タブ
image.png

2タブ
image.png

3タブ
image.png

改善余地

  • タブのタイトルを変えたい

    • gnome-terminal--title オプションがdeprecatedで使えなくなってた :sob:
  • リンクやスタックトレースが見にくい

    • LogcatViewerだとオートリンクで色が変わったりしますからね
  • スタックトレースからIDEの該当箇所に飛べない

    • これはどうしようもないですね
  • 検索しにくい

    • とてもしにくい

ここまで書いて

そう言えば pidcat というものが有ったことを思い出しました.
sudo apt install pidcat でインストールしたのですが,バージョンが古いのか一部コマンドオプションを渡すとエラーが出てしまいました.
GitHubから最新のPythonスクリプトを置き直したところ,エラーもなく見えるようになりました.

image.png

デフォルトで十分見やすく, logcat_color.awk を通す必要も無いですが,やっぱりフィルターだけはどうにもなりませんね.

改行位置固定の問題

ただ,pidcatは実行したタイミングのターミナルウィンドウサイズを取得してその位置で改行を行うため,ウィンドウサイズを変更しても改行位置が変わってくれません.

image.png

image.png ← ウィンドウサイズを変えても改行位置が変わらない

コードをちょっと読んだ所,やはりpidcatを呼び出した時点の ウィンドウサイズを取得している箇所 がありました.

pidcat.py
try:
  # Get the current terminal width
  import fcntl, termios, struct
  h, width = struct.unpack('hh', fcntl.ioctl(0, termios.TIOCGWINSZ, struct.pack('hh', 0, 0)))
except:
  pass

ここを関数化してあげて

pidcat.py
def get_terminal_size():
  try:
    # Get the current terminal width
    import fcntl, termios, struct
    h, width = struct.unpack('hh', fcntl.ioctl(0, termios.TIOCGWINSZ, struct.pack('hh', 0, 0)))
  except:
    pass

indent_wrap() で呼び出してあげます

pidcat.py
  def indent_wrap(message):
+   get_terminal_size()
    if width == -1:
      return message
    message = message.replace('\t', '    ')
    wrap_area = width - header_size

これで,TerminalWindowをグリグリ動かしても,ウィンドウの幅に応じて改行位置を変えてくれます.

複タブ化とフィルターはやっぱりbashで

ただ,結局フィルターしたいタグやログレベルは引数でつらつらと書き連ねなければいけないので,上と同様bash化してしまいます.

~/bin/logcat.sh
# /bin/bash

exclude="-i WifiStateMachine -i VM_BMS -i ThermalEngine -i StatusBar -i QC-QMI" # ここに除外したいフィルター条件を並べる

gnome-terminal \
--tab -e "sh -c 'pidcat.py ${exclude}'" \
--tab -e "sh -c 'pidcat.py -t ActivityManager'" \
--tab -e "sh -c 'pidcat.py -l W ${exclude}'" \

あと, peco と繋いでフィルタとかできると嬉しいんですが

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?