Вход в J2ME

17

Какие существуют способы ведения журналов для j2me?

Меня особенно интересует легко исключение регистрации для версии «release», чтобы иметь меньший пакет & amp; память.     

задан Asaf R 23.09.2008 в 14:21
источник

8 ответов

12

Если вы используете предварительную обработку и обфускацию с помощью Proguard, вы можете иметь простой класс ведения журнала.

public class Log {
  public static void debug(final String message) {
    //#if !release.build
    System.out.println(message);
    //#endif
  }
}

Или выполните регистрацию, где вам нужно. Теперь, если для свойства release.build установлено значение true, этот код будет закомментирован, что приведет к пустым методам. Proguard удалит все способы использования пустого метода. По сути, в сборке релизов будут удалены все сообщения отладки.

Edit:

Размышляя об этом на уровне библиотеки (я работаю над отображением библиотеки 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;
  }
}

Таким образом, конечный разработчик может включить уровни журналов внутри библиотеки, которые он или она интересует. Если ничего не будет включено, весь код регистрации будет удален при запутывании конечного продукта. Сладкий:)

/ JaanusSiim

    
ответ дан JaanusSiim 23.09.2008 в 15:42
источник
  • Как код будет удален во второй версии? Вы удалили команды предварительной обработки –  Casebash 16.04.2010 в 04:12
  • Часть предварительной обработки находится в коде приложения около 'Log.setShowDebug (true)'. Таким образом, showDebug всегда будет ложным, и волшебство ProGuard произойдет. Возможно, вам придется играть с номером пропусков оптимизации. –  JaanusSiim 16.04.2010 в 07:52
19

MicroLog уверен, что ставка. Это небольшая библиотека регистрации Java ME (J2ME), подобная Log4j. Он поддерживает ведение журнала на консоль, файл, RecordStore, Canvas, Form, Bluetooth, последовательный порт (Bluetooth, ИК, USB), Socket (включая SSL), UDP, Syslog, MMS, SMS, электронную почту или Amazon S3 .

Ссылка

    
ответ дан darius 23.09.2008 в 15:18
источник
  • MicroLog выглядит очень красиво, но ему нужен CLDC 1.1 –  Casebash 16.04.2010 в 04:12
  • Я нашел библиотеку под названием J4me, которая будет работать на любом устройстве. Microlog выглядит лучше, если вы можете управлять им, хотя –  Casebash 16.04.2010 в 04:32
  • На самом деле J4me выглядит слишком упрощенным для моих нужд (только на самом деле предоставляет уровни ведения журнала). Я думаю, что я буду использовать свой собственный Proguard –  Casebash 16.04.2010 в 04:41
7

Вы можете использовать -assumenosideaffects в proguard для завершения, чтобы удалить свой класс ведения журнала:

-assumenosideeffects public class logger.Logger {*;}

Вместо предварительной обработки.

    
ответ дан edsumner 03.10.2008 в 11:59
источник
3

Телефоны Series60 и UIQ, имеющие виртуальную машину Sun, измененную самим Symbian, имеют перенаправление стандартного вывода.

Вы можете не только захватить System.out, но и Throwable.printStackTrace ().

На ранних телефонах вам нужно будет написать приложение на C ++, которое перехватит процесс стандартного сервера библиотеки. Symbian выпустил приложение Redirector, которое могло бы захватить стандартный вывод VM на консоль или файл.

В новых телефонах был введен протокол GCF «redirect: //», который мог бы считывать стандартный вывод виртуальной машины в байт Java [] или объект String (вы хотели бы сделать это в отдельном MIDlet) и приложение Redirector был переписан на Java.

В новейшей J9 VM, используемой в телефонах Series60 3rd Edition Feature Pack 2 (и позже), вам может потребоваться вместо этого попробовать «перенаправить: // тест».

    
ответ дан michael aubert 24.09.2008 в 14:07
источник
1

Я использовал MIDPLogger до приемлемого уровня в производственном приложении, хотя я его нашел имеет больше пользы после интеграции в приложение, а не как другой Мидл в наборе или так далее. Я также нашел MicroLog , но не использовал его для каких-либо подробностей.

    
ответ дан Scott Bennett-McLeish 23.09.2008 в 14:48
источник
0

Я написал оптимизатор байт-кода, и из-за формата файлов классов вы можете указать кодировку UTF класса name & amp; которая позволяет вам выводить журналы с помощью MyClass.someFunc () (вы можете обработать подпись, если хотите получить типы), которая позволяет вам делать что-то вроде отладки стиля C с помощью LINE & amp; FILE .

    
ответ дан user26228 14.10.2008 в 20:27
источник
0

Использование условной компиляции класса logger не решает проблему полного удаления протоколирующих операторов, потому что вы нередко регистрируете больше, чем просто строку. Вы будете искать значения переменных, а затем собирать их в строки, например: WhateverLog.log («Loaded» + someclass.size () + «foos»).

Теперь, если вы оставите только тело WhateverLog.log (как показано в принятом решении), вы все равно оставите много ненужного кода, включая конкатенацию String (и, следовательно, создание StringBuffer). Вот почему вам лучше использовать инструмент обработки постбайтного кода, например, proguard (уже упоминалось). Эффекты Proguard -assumenosideeffits позволят его оптимизатору удалять не только операторы протоколирования, но и весь код, результаты которого будут использоваться только при вызове регистрации.

    
ответ дан Otm Shank 08.11.2008 в 15:31
источник
  • Мне нужно не согласиться: P Как уже упоминалось - он работает только при использовании proguard. После комментирования содержимого метода debug () вы получите пустой метод, который будет удален proguard. Это будет означать, что все вызовы методов также будут удалены - у вас не будет никакого бесполезного кода;) –  JaanusSiim 04.12.2008 в 13:14
  • Многие библиотеки журналов используют строки формата по этой причине. Таким образом, вызов будет чем-то вроде WhateverLog.log («Loaded% d foos», someclass.size ()) ;. Форматирование выполняется только при включенном ведении журнала. В идеале вы также избегаете делать дополнительный вызов по размеру, если это возможно. –  Matthew Flaschen 21.02.2012 в 17:30
0

Структура LWUIT для J2ME предоставляет форму ведения журнала, которая может содержать в себе журнал. Вы можете добавить журнал в каждое место, которое, по вашему мнению, может генерировать исключение.

Пример: Log.getInstance (). showLog (); Добавив вышеприведенную строку, вы сможете отслеживать запись в устройствах J2ME.

    
ответ дан Megha 09.04.2012 в 08:04
источник
  • Хорошо, что вы просматриваете старые сообщения –  Lucifer 12.04.2012 в 07:02