Получение logcat определенного приложения для Android в Windows [дубликат]

Я использую maven для моего проекта, и когда я делаю mvn clean install и пытаюсь запустить программу, он выдает исключение. Итак, я очищаю проект и запускаю его снова, и он работает для меня.

Я использую eclipse IDE.

Для:

Класс не найден Исключение при запуске теста Junit

Попробуйте запустить mvn clean test, как только он скомпилирует все тестовые классы (работал для меня).

7
задан Felix Plaumann 23 September 2015 в 09:25
поделиться

3 ответа

В записи

logcat нет поля имени пакета. Поэтому нет стандартного / встроенного способа фильтрации.

Хотя с Android 7.0 вы можете использовать опцию logcat --pid в сочетании с командой pidof -s для фильтрации вывода с помощью имени бинарного / пакета:

adb shell "logcat --pid=$(pidof -s <package_name>)"

Заменить " на ' для Linux / MacOS

6
ответ дан Alex P. 20 August 2018 в 16:30
поделиться
  • 1
    Не работает для меня на устройстве на основе Marshmallow: $ adb -d shell logcat --pid=6693 Unrecognized Option - Usage: logcat [options] [filterspecs] ... похоже, что --pid не является допустимым вариантом. – Jules 25 June 2017 в 14:45
  • 2
    @Jules, logcat --pid была представлена ​​в Нуге – Alex P. 25 June 2017 в 15:01

Вариант 1

Введите следующие строки:

adb shell
su
bash
PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"\$\(echo \1\) \$\(pidof \1\)\";/'))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE\n$PROC_PID_LIST_CACHE")
function pid2pkg() { pkgName=$(echo "$PID_LIST_CACHE" | grep -w $1 | cut -d ' ' -f1 | head -1); if [ "$pkgName" != "" ] ; then echo $pkgName; else echo "*NOT RUNNING*"; fi }
eval "$(logcat -d | sed -r -e 's/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)/\2 \$\(pid2pkg \3\) \5/g' | sed -r -e 's/(.+)/echo -e \"\1\"/g')"

Выход логарифма будет иметь следующий формат:

[Time] [Name] [Type] [Message]

Пример:

14:34:59.386 wpa_supplicant E wpa_supplicant: nl80211: Failed to set IPv4 unicast in multicast filter
14:35:02.231 com.android.phone D TelephonyProvider: subIdString = 1 subId = 1
14:35:03.469 android.hardware.wifi@1.0-service E WifiHAL : wifi_get_logger_supported_feature_set: Error -3 happened.
14:35:03.518 system_server I WifiService: getWifiApEnabledState uid=10086
14:35:03.519 dev.ukanth.ufirewall D AFWall  : isWifiApEnabled is false
14:35:03.520 system_server I GnssLocationProvider: WakeLock released by handleMessage(UPDATE_NETWORK_STATE, 0, 123)
14:35:03.522 dev.ukanth.ufirewall I AFWall  : Now assuming wifi connection

Некоторые системные процессы не имеют пакетов. system_server и wpa_supplicant, например. Если имя пакета не может быть найдено, вместо него будет отображаться имя процесса.

Предостережения:

Если процесс, стоящий за определенным PID, больше не работает, вы не можете получить имя пакета / процесса.

После того, как процесс вышел из системы или ваше устройство перезапустилось, PID можно фактически назначить для совершенно разных процессов.

Таким образом, вы можете проверить, как долго процесс действительно запущен :

ps -e -o pid -o stime -o name

Вариант 2

Если вы хотите, чтобы форматирование было более читаемым, вы можете скопировать мой сценарий ведения журнала на свое устройство и выполнить его:

better_logging.sh

PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"\$\(echo \1\) \$\(pidof \1\)\";/'))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE\n$PROC_PID_LIST_CACHE")
MAX_LEN=$(echo "$PID_LIST_CACHE" | cut -d ' ' -f1 | awk '{ if ( length > L ) { L=length} }END{ print L}')
function pid2pkg() {
    pkgName=$(echo "$PID_LIST_CACHE" | grep -w $1 | cut -d ' ' -f1 | head -1);
    if [ "$pkgName" != "" ] ; then
        printf "%-${MAX_LEN}s" "$pkgName";
    else
        printf "%-${MAX_LEN}s" "<UNKNOWN (NOT RUNNING)>";
    fi
}

eval "$(\
logcat -d | \
sed -r -e 's/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)/\2\ $\(pid2pkg \3\) \5/g' | \
sed -r -e 's/(.+)/echo -e \"\1\"/g' \
)" | \
awk '
function color(c,s) {
    printf("\033[%dm%s\033[0m\n",90+c,s)
}
/ E / {color(1,$0);next}
/ D / {color(2,$0);next}
/ W / {color(3,$0);next}
/ I / {color(4,$0);next}
{print}
'

Чтобы скопировать и запустить его, вы можете использовать:

adb push better_logging.sh /sdcard/better_logging.sh
adb shell "bash /sdcard/better_logging.sh"

Выход будет выглядеть следующим образом:

0
ответ дан Forivin 20 August 2018 в 16:30
поделиться

Это мой сценарий. Немного ржавый, но все еще работает.

PID=`adb shell ps | grep -i <your package name> | cut -c10-15`;
adb logcat | grep $PID

На самом деле у меня есть скрипт python для добавления большего количества цветов, а цикл while - для отслеживания этого процесса, когда он перезапускается, но я думаю, вы получите точка.

6
ответ дан Lucas Vidal 20 August 2018 в 16:30
поделиться
  • 1
    На самом деле я не знаю, как это использовать. Я не знаю, как запускать скрипты из командной строки и как использовать это в своем приложении для Android (где мне это действительно нужно / нужно). В настоящее время я делаю это с Runtime.getRuntime (). Exec (& quot; su -c logcat -d -v long & quot;); но я не получаю имена пакетов. – Felix Plaumann 22 January 2016 в 10:39
  • 2
    для чего нужна «cut -c10-15»? Благодарю. – Alexander Fradiani 30 June 2016 в 21:11
Другие вопросы по тегам:

Похожие вопросы: