Подтвердить что ты не робот

Как обфускать библиотеку Android (файл .jar) с помощью Proguard в Eclipse

Я видел много сообщений о том, как обфускать приложение Android (файл .apk) с помощью ProGuard в Eclipse. Также см. http://developer.android.com/guide/developing/tools/proguard.html:

"Когда вы создаете приложение в режиме деблокирования, либо запустив ant release, либо используя мастер экспорта в Eclipse, система сборки автоматически проверяет, является ли свойство proguard.config Если это так, ProGuard автоматически обрабатывает байт-код приложения перед упаковкой всего в .apk файл."

Но если вы экспортируете проект Android в файл .jar с помощью мастера экспорта Eclipse, следуя описанным шагам (создания файла proguard.cfg, настраивая свойство proguard.config на proguard.cfg в файле default.properties, с помощью Export Wizard и т.д.), похоже, не работает - я не вижу обфускации имен классов и т.д. в полученном файле jar. У меня также есть следующие настройки в файле proguard.cfg, но я не вижу никаких выходных файлов в каталоге проекта или в каталоге proguard (этот каталог даже не создан).

-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt

Я даже создал файл project.properties в каталоге проекта со следующей строкой, но это, похоже, не заставило ProGuard действовать:

proguard.config=proguard.cfg

В этом проекте нет действий. Я использую Android 2.3.1 и Eclipse Galileo 3.5.2 в Windows. Те же результаты с Android 3.0. Похоже, что этап обфускации должен быть каким-то образом введен в явном виде в Eclipse Export Wizard. Я буду признателен за любую помощь или прозрение. Благодарю.

4b9b3361

Ответ 1

как было предложено в комментариях к одному из приведенных выше ответов (но я не заметил сначала, потому что он был похоронен среди одного из "дополнительных комментариев" )...

мы просто запускаем progruard в командной строке (см. первый блок ниже) в библиотеке вне eclipse с параметрами во втором блоке ниже в нашем нашем файле proguard.cfg(и определенно не > используйте -dontpreverify, или проекты, которые используют ваш проект в качестве библиотеки андроида, не смогут быть должным образом запутаны из-за проблем StackMapTable из вашего project.jar).

:

$ java -jar $ANDROID_SDK/tools/proguard/lib/proguard.jar \
  -libraryjars $ANDROID_SDK/platforms/android-18/android.jar @proguard.cfg
  -outjars /tmp/project.jar -verbose

proguard.cfg:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontwarn our.company.project.R*
-injars bin/project.jar
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep class org.apache.3rdparty.stuff.**
-keep public class our.company.project.ProjectAPI
-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

-keepclassmembers public class our.company.project.ProjectAPI {
    public static <fields>;
}

-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 *;
}

возможно, что не все параметры и элементы -keep строго необходимы (кроме использования -dontpreverify, как ранее упоминалось), но большинство из них имеет смысл для меня как элементы, которые должны быть там, если у вас есть активность расширение класса в экспортируемой библиотеке.

Ответ 2

Я использую косвенный способ создания экспортированной андроидной обфускации, мой путь:

  • экспортировать подписанное приложение apk use eclipse

  • разархивируйте apk, найдите classes.dex

  • используйте dex2jar.bat, измените class.dex на jar

  • разархивируйте банку и удалите класс, который вам не нужен, затем запишите его и измените имя файла на XXX.jar

  • Затем вы используете эту банку в другом проекте или передаете ее клиенту, это является запутанным!

Я уверен, что это поможет! Наслаждайтесь этим!

Ответ 3

java -jar proguard.jar @yourconfig.pro

yourconfig.pro(расширен из http://proguard.sourceforge.net/index.html#manual/examples.html):

-injars yourjar.jar
-outjars yourjar_out.jar

-libraryjars 'C:\android\sdk\platforms\android-10\android.jar'

-printmapping mapping.txt
-verbose
-dontoptimize
-dontpreverify
-dontshrink
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keep public class * {
    public protected *;
}

-keepclassmembernames class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String, boolean);
}

-keepclasseswithmembernames class * {
    native <methods>;
}

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

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

Результат можно проверить с помощью jd-gui

Ответ 4

Способ вызова ProGuard довольно прост:

  • Добавьте строку proguard.config=proguard.cfg в project.properties
  • Экспорт пакета приложений

Файл proguard.cfg по умолчанию должен быть автоматически создан мастером нового проекта.

Ответ 5

Не обфускайте свой чистый Java Jar. Пропустите эту фазу полностью при создании Jar (будь то вручную в Eclipse или через Ant build из командной строки).

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

Я наткнулся на эту проблему и оказался успешно, как я описал здесь.