Обфускация

 V*D*V

Для подключения обфускатора Proguard в файл project.properties необходимо добавить строчку

 

proguard.config=proguard.cfg

 

Она подразумевает, что в этом же каталоге есть файл proguard.cfg. Однако, по каким-то причинам его там может не быть. Можно скопировать файл из другого проекта или просто создать файл следующего содержания:

 

-optimizationpasses 5

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-dontpreverify

-verbose

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

 

-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 * extends android.app.backup.BackupAgentHelper

-keep public class * extends android.preference.Preference

-keep public class com.android.vending.licensing.ILicensingService

 

-keepclasseswithmembernames class * {

    native <methods>;

}

 

-keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet);

}

 

-keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet, int);

}

 

-keepclassmembers class * extends android.app.Activity {

   public void *(android.view.View);

}

 

-keepclassmembers enum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

 

-keep class * implements android.os.Parcelable {

  public static final android.os.Parcelable$Creator *;

}

 

После попытки выполнить компиляцию получаем ошибку

 

Conversion to Dalvik format failed with error 1

 

В файле [android-sdk-path]\tools\proguard\bin\proguard.bat меняем строчку

 

call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %*

 

на

 

call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %1 %2 %3 %4 %5 %6 %7 %8 %9

 

После новой попытки выполнить компиляцию получаем ошибку

 

Proguard returned with error code 1. See console

java.io.IOException: Can't read [proguard.ClassPathEntry@1787038] (No such file or directory)

 at proguard.InputReader.readInput(InputReader.java:230)

 at proguard.InputReader.readInput(InputReader.java:200)

 at proguard.InputReader.readInput(InputReader.java:178)

 at proguard.InputReader.execute(InputReader.java:100)

 at proguard.ProGuard.readInput(ProGuard.java:195)

 at proguard.ProGuard.execute(ProGuard.java:78)

 at proguard.ProGuard.main(ProGuard.java:499)

 

Чтобы разобраться в чём дело, загружаем последнюю версию с сайта Proguard http://sourceforge.net/projects/proguard/files/.

 

Копируем новые файлы в [android-sdk-path]\tools\proguard\lib\.

 

После новой попытки выполнить компиляцию получаем более подробное описание ошибки:

 

Proguard returned with error code 1. See console

java.io.IOException: Can't read [C:\Users\[UserName]\AppData\Local\Temp\'C:\Program Files\Android\android-sdk\platforms\android-10\android.jar'] (No such file or directory)

 at proguard.InputReader.readInput(InputReader.java:230)

 at proguard.InputReader.readInput(InputReader.java:200)

 at proguard.InputReader.readInput(InputReader.java:178)

 at proguard.InputReader.execute(InputReader.java:100)

 at proguard.ProGuard.readInput(ProGuard.java:196)

 at proguard.ProGuard.execute(ProGuard.java:78)

 at proguard.ProGuard.main(ProGuard.java:492)

Caused by: java.io.IOException: No such file or directory

 at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:50)

 at proguard.InputReader.readInput(InputReader.java:226)

 ... 6 more

 

Становится понятно, что проблема возникла из-за пробелов в пути к файлу.

Для её решения можно использовать 2 способа:

 

Первый.

 

Идём в Eclipse > Window > Preferences > SDK Location.

 

Меняем C:\Program Files\Android\android-sdk

на C:\Progra~1\Android\android-sdk.

 

На некоторых машинах вместо Progra~1 может быть Progra~2.

 

Второй.

 

Создаём мягкую ссылку в каталоге без пробелов на каталог, куда установлен android-sdk.

Для этого запускаем консоль с правами администратора.

 

mklink /D c:\Apps\android-sdk "c:\Program Files\Android\android-sdk"

 

Идём в Eclipse > Window > Preferences > SDK Location.

 

Меняем C:\Program Files\Android\android-sdk

на C:\Apps\android-sdk.

 

Снова пробуем.

 

Proguard returned with error code 1. See console

java.io.IOException: Can't read [C:\Apps\android-sdk\platforms\android-10\android.jar] (No such file or directory)

 at proguard.InputReader.readInput(InputReader.java:230)

 at proguard.InputReader.readInput(InputReader.java:200)

 at proguard.InputReader.readInput(InputReader.java:178)

 at proguard.InputReader.execute(InputReader.java:100)

 at proguard.ProGuard.readInput(ProGuard.java:196)

 at proguard.ProGuard.execute(ProGuard.java:78)

 at proguard.ProGuard.main(ProGuard.java:492)

Caused by: java.io.IOException: No such file or directory

 at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:50)

 at proguard.InputReader.readInput(InputReader.java:226)

 ... 6 more

 

Ошибка выглядит странной, ведь до этого создание приложения проходило успешно!

Открываем Android SDK Manager. Android 2.3.3 (API 10) SDK Platform числится установленной. Проверяем наличие каталога [android-sdk-path]\platforms\android-10. Он отсутствует. При этом в списке библиотек проекта библиотека числится и открывается! Видимо, sdk устроено так, что если есть более высокая версия, она заменяет нижнюю, если той нет.

Удаляем SDK.

Перезагружаем систему. Запускаем [android-sdk-path]\SDK Manager.exe с правами администратора и снова устанавливаем Android 2.3.3 (API 10) SDK Platform.

На этот раз всё заканчивается созданием файла приложения!