Вход в J2ME
-
02-07-2019 - |
Вопрос
Какие решения для ведения журналов существуют для j2me?
Я особенно заинтересован в том, чтобы легко исключить ведение журнала для «релизной» версии, чтобы иметь меньший объем пакета и памяти.
Решение
Если вы используете предварительную обработку и обфускацию с помощью Proguard, то у вас может быть простой класс журналирования.
public class Log {
public static void debug(final String message) {
//#if !release.build
System.out.println(message);
//#endif
}
}
Или ведите журнал там, где вам нужно.Теперь, если для свойства Release.build установлено значение true, этот код будет закомментирован, что приведет к созданию пустого метода.Proguard удалит все случаи использования пустого метода. Фактически в сборке выпуска будут удалены все отладочные сообщения.
Редактировать:
Подумав об этом на уровне библиотеки (я работаю над отображением библиотеки J2ME), я, вероятно, нашел лучшее решение.
public class Log {
private static boolean showDebug;
public static void debug(final String message) {
if (showDebug) {
System.out.println(message);
}
}
public static void setShowDebug(final boolean show) {
showDebug = show;
}
}
Таким образом, конечный разработчик может включить уровни журналирования внутри библиотеки, которая его/ее интересует.Если ничего не будет включено, весь код журналирования будет удален при обфускации конечного продукта.Сладкий :)
/ЯанусСийм
Другие советы
MicroLog — беспроигрышный вариант.Это небольшая библиотека журналирования для Java ME (J2ME), такая как Log4j.Он поддерживает вход в консоль, файл, RecordStore, Canvas, Form, Bluetooth, последовательный порт (Bluetooth, IR, USB), сокет (включая SSL), UDP, системный журнал, MMS, SMS, электронную почту или Amazon S3. .
Вы можете использовать -assumenosideaffects в proguard, чтобы полностью удалить класс ведения журнала:
-assumenosideeffects public class logger.Logger {*;}
Вместо предварительной обработки.
Телефоны Series60 и UIQ, на которых установлена виртуальная машина Sun, модифицированная самой Symbian, имеют перенаправление стандартного вывода.
Вы можете не только захватить System.out, но также работает Throwable.printStackTrace().
На ранних моделях телефонов вам нужно было написать приложение на C++, которое подключалось бы к процессу сервера стандартной библиотеки.Symbian создала приложение Redirector, которое могло захватывать стандартный вывод виртуальной машины на консоль или в файл.
В новых телефонах был введен протокол GCF «redirect://», который мог считывать стандартный вывод виртуальной машины в объект Java byte[] или String (вы хотели бы сделать это в отдельном MID-лете), а приложение Redirector было переписано на Джава.
На новейшей виртуальной машине J9, используемой в телефонах Series60 3rd Edition Feature Pack 2 (и более поздних версиях), вместо этого вам может потребоваться попробовать «redirect://test».
я использовал MIDPLogger до некоторого приемлемого уровня в рабочем приложении, хотя я обнаружил, что после интеграции в приложение он более полезен, чем как еще один мидлет в пакете или так далее.я также нашел Микролог но не использовал его в каких-либо подробностях.
Я написал оптимизатор байт-кода, и из-за формата файлов классов вы можете указать кодировку UTF имени класса и функции, которая позволяет вам выводить журналы с помощью MyClass.someFunc() (вы можете обработать подпись, если хотите получить типы ), что позволяет вам выполнять что-то вроде отладки в стиле C, используя ЛИНИЯ & ФАЙЛ макросы.
Использование условной компиляции класса регистратора не решает проблему полного удаления операторов протоколирования, поскольку зачастую вы регистрируете больше, чем просто строку.Вы будете искать значения переменных, а затем собирать их в строки, например:WhateverLog.log("Загружено" + someclass.size() + "foos").
Теперь, если вы оставите только тело WhateverLog.log (как показано в принятом решении), вы все равно оставите много ненужного кода, включая конкатенацию строк (и, следовательно, создание StringBuffer).Вот почему вам лучше использовать инструмент постобработки байт-кода, такой как proguard (уже упоминавшийся).-assumenosideeffects Proguard позволит оптимизатору удалить не только операторы протоколирования, но и весь код, результаты которого будут использоваться только при вызове протоколирования.
Структура LWUIT J2ME предоставляет форму ведения журнала, внутри которой может записываться оператор.Вы можете добавить журнал в каждом месте, где, по вашему мнению, может возникнуть исключение.
Пример :Журнал.getInstance().showLog();Добавив приведенную выше строку, вы сможете отслеживать журналирование на устройствах J2ME.