Уровни входа в Android
У меня небольшие трудности с настройкой регистрации в Android. Вот как выглядит мой код:
if (Log.isLoggable("MY_TAG", Log.VERBOSE)) {
Log.v("MY_TAG", "Here's a log message");
}
Довольно просто, правда?
Тем не менее, я испытываю немало трудностей с получением Log.isLoggable("MY_TAG", Log.VERBOSE)
вернуть истину.
В 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, если это что-то меняет.
3 ответа
Похоже, что более поздние версии 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
файл должен быть правильно установлен, иначе он не будет прочитан. Файл должен быть доступен для записи только пользователю root.
С помощью adb shell setprop log.tag.MyAppTag VERBOSE
также работа. Проблема в том, что значения свойств теряются после перезагрузки.
Важной целью является не поставлять производственное приложение, в котором осталась тонна журнальных вызовов, что увеличивает его размер и даже, возможно, даже влияет на его производительность.
Для этого я рекомендую размещать эти константы в начале каждого класса, для которого будут выполняться вызовы журнала:
static final boolean DEBUG = false;
static final String TAG = "<MyClass>"
Теперь, где вы входите, сделайте это:
if (DEBUG) Log.v(TAG, "Something");
Включите ваши журналы, изменив DEBUG
постоянная к истине. (Если вы хотите, у вас может быть один класс с этими статиками для всего кода вашего приложения... Это имеет смысл для небольшого приложения, но по мере того, как все становится большим, приятно решить, какие части включить в систему.)
Делая это, когда вы создаете свое приложение с DEBUG = false
весь код регистрации не только не выполняется, но и полностью удаляется из вашего приложения. Это хорошо, потому что позволяет оставить достаточно обширную регистрацию в вашем коде для включения, когда вам это нужно, не беспокоясь о том, как это повлияет на размер вашего приложения доставки. В основном, просто добавляйте журналы, где бы они вам не понадобились, и не беспокойтесь о том, чтобы оставить их.
Это подход, который используется во многих платформах Android. Например, Activity ManagerService.
Эти константы находятся вверху, и на их основе разбросаны различные строки журнала. (И куча других констант суб-отладки для различных его аспектов, так как этот файл смехотворно глупо велик.)