Уровни регистрации Android

У меня возникли трудности с настройкой регистрации Android. Вот как выглядит мой код:

    if (Log.isLoggable("MY_TAG", Log.VERBOSE)) {
        Log.v("MY_TAG", "Here a log message");
    }

Довольно просто, правильно?

Однако мне трудно справиться с тем, чтобы вернуть Log.isLoggable("MY_TAG", Log.VERBOSE) значение true.

Per http://developer.android.com/reference/android/util/Log.html, я попытался добавить файл local.prop в каталог /data/, который выглядит так:

log.tag.MY_TAG=VERBOSE

но не повезло. Я также пробовал:

System.setProperty("log.tag.MY_TAG", String.valueOf(Log.VERBOSE));

но это тоже не работает.

Любые идеи о том, что я делаю неправильно здесь? Я использую Android 2.1-update1 на Nexus 1, если это имеет значение.

Ответ 1

Попробуйте

adb shell setprop log.tag.MyAppTag VERBOSE

Ответ 2

Похоже, что более поздние версии Android хотят, чтобы /data/local.prop был доступен для записи только root. Команда adb push, по-видимому, сначала создает файлы, предоставляя каждому доступ для чтения/записи (потому что маска файла по умолчанию - 777). Android разумно игнорирует /data/local.prop, поскольку это может быть угрозой безопасности.

Я только экспериментировал с Android 2.3.3 и 4.1.2. У первого нет проблем с чтением local.prop, который доступен для записи в мире, а последний, по-видимому, молча игнорирует содержимое файла.

Создание файла local.prop, как описано в исходном вопросе:

log.tag.MY_TAG=VERBOSE

И затем нажатие на устройство, как показано ниже, делает трюк:

adb push local.prop /data/local.prop
adb shell chmod 644 /data/local.prop
adb shell chown root.root /data/local.prop
adb reboot

Вы можете дважды проверить, чтобы убедиться, что значения в local.prop были прочитаны, выполнив:

adb shell getprop | grep log.tag

Итак, вкратце:

  • /data/local.prop читается только во время загрузки.
  • В более поздних версиях Android требуется, чтобы разрешения на файл /data/local.prop должны быть правильно настроены или не будут прочитаны. Файл должен быть доступен только для чтения.

Использование adb shell setprop log.tag.MyAppTag VERBOSE также работает. Проблема в том, что значения свойств теряются после перезагрузки.

Ответ 3

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

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

static final boolean DEBUG = false;
static final String TAG = "<MyClass>"

Теперь, когда вы регистрируетесь, сделайте следующее:

if (DEBUG) Log.v(TAG, "Something");

Включите журналы, изменив константу DEBUG на значение true. (Если вы хотите, у вас может быть один класс с этой статикой для использования всего вашего кода приложения... Это имеет смысл для небольшого приложения, но по мере того, как все становится большим, приятно решить, какие части нужно включить.)

Таким образом, когда вы создаете свое приложение с помощью DEBUG = false, весь ваш код ведения журнала не только не выполняется, но полностью удаляется из вашего приложения. Это хорошо, потому что это позволяет вам оставлять достаточно обширный журнал в вашем коде, который будет включен, когда вам это нужно, не беспокоясь о том, как это повлияет на размер вашего приложения для доставки. В основном просто бросайте журналы туда, где они вам нужны, и не беспокойтесь о том, чтобы оставить их.

Это подход, который требует большая часть платформы Android. Например, Activity ManagerService.

У этого есть те константы в верхней части, и различные логарифмические линии, посыпанные по всей их основе. (И множество других суб-отладочных констант для различных его аспектов, так как этот файл смехотворно туповат.)