ProGuard — это утилита для сокращения, оптимизации и обфускации кода. На выходе вы получаете *.apk меньшего размера, который намного сложнее реинжинирить. На developer.android.com написано, что ProGuard внедрен в систему сборки Android приложений. Однако, я заметил, что эта утилита появилась в моей папке с SDK только после обновления до r9.
ProGuard запускается только когда вы запускаете сборку в «release» режиме. Для тех, кто не знает как это сделать (в Eclipse): правой кнопкой нужно вызвать контекстное меню проекта, затем Export -> Android -> Export Android Application. Конфиг-файл появляется автоматически, при создании проекта, в его корне, под именем proguard.cfg. Если у вас он не появился, проверьте наличие утилитки в папке с вашим SDK.
Далее, чтобы включить сам обфускатор перед сборкой, нужно добавить в файл /root_of_your_project/default.properties строку вида proguard.config=/path/proguard.cfg, где path — путь к файлу. Таким образом можно таскать один конфиг для кучи проектов.
Итак, после «release» сборки ProGuard немножко намусорит в одной из следующих папок:
Создаются файлы:
Также на developer.android.com предупреждают о том, что при обработке кода ProGuard'ом могут возникнуть осложнения в виде ClassNotFoundException. Чтобы избежать подобного, можно добавить строку в конфиг:
Подробнее о настройке конфига можно почитать здесь. Собственно, там же можно найти пару сэмплов.
Кроме этого, в папке /path_to_your_SDK/tools/proguard/bin лежит некий скрипт под названием retrace.bat (для Linux/Mac OS X — retrace.sh). Он позволяет преобразовать обфусцированное в читаемое, используя вышеозначенный mapping.txt.
Синтаксис использования:
Например:
Также скрипт воспринимает стандартный ручной ввод текста, в случае если вам лень писать путь к <stacktrace_file>.
Если у вас при первом же запуске в «release» режиме с ProGuard'ом (с дефолтными настройками) вылетает ошибка с кодом 1, то скорее всего в пути к вашему SDK есть пробелы — удалите их, и все заработает.
Приятной вам обфускации!
ProGuard запускается только когда вы запускаете сборку в «release» режиме. Для тех, кто не знает как это сделать (в Eclipse): правой кнопкой нужно вызвать контекстное меню проекта, затем Export -> Android -> Export Android Application. Конфиг-файл появляется автоматически, при создании проекта, в его корне, под именем proguard.cfg. Если у вас он не появился, проверьте наличие утилитки в папке с вашим SDK.
Далее, чтобы включить сам обфускатор перед сборкой, нужно добавить в файл /root_of_your_project/default.properties строку вида proguard.config=/path/proguard.cfg, где path — путь к файлу. Таким образом можно таскать один конфиг для кучи проектов.
Итак, после «release» сборки ProGuard немножко намусорит в одной из следующих папок:
- /root_of_your_project/proguard — при использовании Eclipse
- /root_of_your_project/bin/proguard — при использовании Ant
Создаются файлы:
- dump.txt — описывает внутренности всех класс-файлов в вашем *.apk
- mapping.txt — представляет отображение между исходными и обфусцированными классами, полями классов, методами.
- seeds.txt — список необфусцированных классов
- usage.txt — код, вытащенный из *.apk
Также на developer.android.com предупреждают о том, что при обработке кода ProGuard'ом могут возникнуть осложнения в виде ClassNotFoundException. Чтобы избежать подобного, можно добавить строку в конфиг:
-keep public class <MyClass>
Подробнее о настройке конфига можно почитать здесь. Собственно, там же можно найти пару сэмплов.
Кроме этого, в папке /path_to_your_SDK/tools/proguard/bin лежит некий скрипт под названием retrace.bat (для Linux/Mac OS X — retrace.sh). Он позволяет преобразовать обфусцированное в читаемое, используя вышеозначенный mapping.txt.
Синтаксис использования:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
Например:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
Также скрипт воспринимает стандартный ручной ввод текста, в случае если вам лень писать путь к <stacktrace_file>.
Если у вас при первом же запуске в «release» режиме с ProGuard'ом (с дефолтными настройками) вылетает ошибка с кодом 1, то скорее всего в пути к вашему SDK есть пробелы — удалите их, и все заработает.
Приятной вам обфускации!