Вариант 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" "";
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"
Выход будет выглядеть следующим образом:
Да, вы можете используйте операторы сравнения для сравнения дат, например:
irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true
Но вы пытаетесь сравнить дату с datetime?
Если это так, вам нужно преобразовать datetime в дату, а затем провести сравнение.
Надеюсь, это поможет.
Да, вы можете напрямую сравнить значение поля даты / времени created_at
ActiveRecord с обычным объектом DateTime
(например, с тем, который вы можете получить при синтаксическом анализе). строка, которая у вас есть).
В проекте у меня есть объект Value, который имеет объект datetime created_at:
imac:trunk luca$ script/console
Loading development environment (Rails 2.3.2)
>> Value.first.created_at
=> Fri, 12 Jun 2009 08:00:45 CEST 02:00
>> Time.parse("2009-06-03 16:57:45.608000 -04:00")
=> Wed Jun 03 22:57:45 0200 2009
>> Value.first.created_at > Time.parse("2009-06-03 16:57:45.608000 -04:00")
=> true
Поле created_at определяется как:
create_table "values", :force => true do |t|
[...]
t.datetime "created_at"
end
NB, если ваше поле является датой, а не datetime, тогда вам нужно преобразовать его во время:
Post.first.created_at.to_time > Time.parse("2009-06-03 16:57:45.608000 -04:00")
или проанализировать дату:
Post.first.created_at > Date.parse("2009-06-03 16:57:45.608000 -04:00")
, иначе вы получите:
ArgumentError: comparison of Date with Time failed