Обфускация (obfuscation) это преобразование кода программы, делающее его нечитаемым при декомпиляции и таким образом защищающее интеллектуальную собственность автора программы. Оптимизация это преобразование кода, приводящее к уменьшению размера приложения и увеличению скорости его выполнения. Побочным эффектом при обфускации является оптимизация кода. В приведенной ниже статье демонстрируются преимущества обеих техник, а также описывается использованиеRetroGuard иJODE - двух бесплатных утилит для Sun ONE Studio Mobile Edition.
Оптимизация размера программы и скорости его выполнения всегда была одной из главных проблем программирования. Применительно к приложениям для мобильных телефонов оптимизация играет ключевое значение, поскольку недостаточная оптимизация кода приложения легко может привести к краху всего проекта. Это связано, прежде всего, с ограниченностью ресурсов телефона и жесткими требованиями к размеру приложения. Техника оптимизации MIDlet-ов включает в себя:
Обфускация предназначена для защиты интеллектуальной собственности автора программы. Она делает невозможным украсть исходный код программы, выполнив декомпиляцию объектного кода. Приложения для мобильных устройств особенно нуждаются в обфускации, поскольку нет никакой возможности проконтролировать пользователей использующих их. Техника обфускации MIDlet-ов включает в себя:
Поскольку названия классов и их членов заменяются на более короткие сочетания букв, в результате получается более компактный код. Цели, которые преследуют обфускация и оптимизация различны, но технические приемы, применяемые для достижения целей, одинаковы, поэтому многие утилиты позволяют сразу выполнять и обфускацию и оптимизацию.
Среда программирования Sun ONE Studio Mobile Edition позволяет встраивать различные модули для выполнения обфускации и оптимизации от сторонних производителей. В этой статье я хочу рассмотреть два модуля с открытым кодом: RetroGuard и JODE. Они легко встраиваются в IDE и позволяют быстро проводить преобразование кода, учитывая специфику MIDlet-ов. Обфускаторы встраиваются в Sun ONE Studio как фильтры для процесса компиляции MIDlet suit-ов. Вместо того чтобы применять обфускацию к каждому отдельному классу или пытаться получить список выполняемых классов, RetroGuard и JODE просто применяют обфускацию ко всем классам, входящим в JAR. JODE выполняет более полную оптимизацию, определяя и удаляя неиспользуемые классы и методы из MIDlet suit-а.
Ниже описан процесс инсталляции модулей
После установки модуля J2ME Wireless, в Mobile Edition Online Help добавится новая секция "Managing Obfuscators and Optimizers". Откройте "Adding Obfuscators and Optimizers" для получения детальной инструкции по установке и настройке модулей обфускации и оптимизации.
RetroGuard находится в модуле kjava-obfuscator-retroguard.nbm. Его можно использовать сразу после установки.
JODE надо загружать отдельно, затем необходимо настроить Obfuscator Registry, чтобы связать установленный JODE модуль с закаченной утилитой JODE. Это можно сделать следующим образом.
После установки модулей интерфейс Sun ONE Studio изменится:
Новая секция Online Help содержит обзор обфускаторов и оптимизаторов, описывается их инсталляция и настройка. ОткройтеHelp > Help Sets > Mobile Edition Help, а затем "Managing Obfuscators and Optimizers".
Чтобы открыть Obfuscator Registry выберитеTools > Obfuscators. Расположенная слева панель содержит список установленных обфускаторов и оптимизаторов. После выбора одного из них в правой части окна отображаются настройки. Используйте кнопку "Set As Default" чтобы выбрать обфускатор, который будет использоваться при компиляции MIDlet suit-а. Выбранный по умолчанию обфускатор можно также изменить в индивидуальных настройках MIDlet Suit-а
Расположенная в правой нижней части окна закладка Properties содержит настройки, регламентирующие отношения между IDE и утилитой.
Закладка Expert содержит настройки самой утилиты. Информацию о них можно найти в соответствующем разделе документации.
Каждый MIDlet Suite имеет индивидуальные настройки. С их помощью можно установить используемый обфускатор. Когда свойство Obfuscate установлено в False, MIDlet компилируется безо всякой фильтрации и обфускации. Если это свойство установлено в True, используется обфускатор, указанный в поле Obfuscator. Первоначально он имеет значение, установленное по умолчанию в Obfuscator Registry.
Проведем небольшое тестирование. Возьмем несколько примеров, поставляемых вместе с Sun ONE Studio Mobile Edition, и прогоним их через Retro Guard и JODE. Результаты работы приведены в таблице:
Сравнение результата компиляции JAR файлов (в байтах) | |||
MIDlet Suite | Без обфускации | RetroGuard | JODE |
demos | 180,146 | 143,038 | 109,364 |
games | 50,653 | 39,975 | 38,451 |
photoalbum | 221,665 | 218,740 | 218,654 |
UIDemo | 23,526 | 19,675 | 20,113 |
К сожалению, демонстрацию не удалось завершить. Обфускатор натолкнулся на UIDemo и вылетел. RetroGuard проглотил UIDemo, но полученный в результате MIDlet не запускался. JODE сначала столкнулся с той же проблемой. Изменение настроек позволило получить менее защищенный, но рабочий MIDlet. Для JODE необходимо установить свойство Renamer в Off, а Unreachable Methods and Class в Preserve. Проблема возникла, поскольку UIDemo содержит массив жестко прописанных имен классов, доступ к которым получает с помощью Class.forName(...). Обфускатор не может изменять жестко установленные настройки, таким образом, имена классов изменялись, а массив с названиями классов содержал старые названия. Избегайте подобных методов кодирования.
В основе статьи лежит работа"Obfu
scation and Optimization: New Functionality with the RetroGuard and JODE Modules for Sun ONE
Studio Mobile Edition" от Vaughn Spurlin.
Перевод:aRix