воскресенье, 21 августа 2011 г.

Обфускация кода

Постановка задачи: обфуцировать  Android-проект(обфускация - процес переименования классов и методов в макимально короткие названия, что позволяет 1) уменьшить размер apk-файла 2) усложнит задачу анализа исходного кода, тем кто захочет декодировать apk).
Проблема: нужно чтобы обфускатор не обфусцировать ресурсы и часть системных классов.
В общем обфускация должна не поломать работоспособность кода.
Версия Android-а: 1.6
 Для того чтобы обфусцировать Android проект в среде Eclipse нужно:
1) Проверить есть ли в Вашем Android SDK встроенный обфускатор.
     Для этого заходим в папку с проектом и ищем в корне этой папки файл proguard.cfg. Если этого файла нет, то обновляем Android SDK. (из eclipse-а : Window->Android SDK and AVD Manager-> installed packages -> update all)

2) Делаем релизную сборку проекта: file -> export ->Android ->Export Android Application и выбираем проект




















Дальше, если у нас есть keystore-файл вводим путь к нему и пароль, если нету
переходим в папку с java jdk\bin, создаем bat-файл для запуска консоли, и с помощью инструмента keytool.exe создаем этот файл, как это делается можно прочитать здесь , посмотреть на скриншоте или скачать готовый файл, login: test, password: 123456.


3) убедились что сборка собирается, теперь подключаем обфускацию, для этого в файле default.properties, что находится в корне папки с проектом, дописываем строку: proguard.config=proguard.cfg
4) запоминаем размер apk файла(после обфускации он должен уменьшится) и делаем релизную сборку заново.
При обфускации могут возникнуть ошибки, для их исправления нужно вписывать команды в файл proguard.cfg

Здесь код файла  proguard.cfg, который работает у меня в проекте.
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-repackageclasses ''
-renamesourcefileattribute SourceFile
-keepattributes *Annotation*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.android.vending.licensing.ILicensingService

-assumenosideeffects class android.util.Log {
  public static *** d(...);
  public static *** v(...);
}

-keepclassmembers class * {
public void onClickButton(android.view.View);
}

-keepclasseswithmembernames class * {
  native <methods>;
}

-keep public class custom.components.package.and.name.**

-keep public class * extends android.view.View {
  public <init>(android.content.Context);
  public <init>(android.content.Context, android.util.AttributeSet);
  public <init>(android.content.Context, android.util.AttributeSet, int);
  public void set*(...);
}

-keepclasseswithmembers class * {
  public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
  public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
 public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
  public static <fields>;
}

-keep public class com.google.inject.** {
 public protected *;
}

-keep public class com.google.inject.util.** {
 public protected *;
}

-keep public class com.google.inject.spi.** {
 public protected *;
}

-keep public class com.google.inject.name.** {
 public protected *;
}

-keep public class com.google.inject.matcher.** {
 public protected *;
}

-keep public class com.google.inject.internal.** {
 public protected *;
}

-keep public class com.google.inject.binder.** {
 public protected *;
}



Если в Вашем проекте не используется библиотека guice, то вам нужно убрать строки -keepattributes *Annotation* и удалить все после строк -keepclassmembers class **.R$* {
    public static <fields>;
}

Комментариев нет:

Отправить комментарий