Как обфускать библиотеку 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. Я буду признателен за любую помощь или прозрение. Благодарю.
Ответы
Ответ 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.
Я наткнулся на эту проблему и оказался успешно, как я описал здесь.