Как запутать библиотеку Android (файл .jar) с помощью Proguard в Eclipse - PullRequest
19 голосов
/ 11 ноября 2011

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

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

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

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

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

proguard.config=proguard.cfg

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

Ответы [ 5 ]

18 голосов
/ 29 января 2014

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

мы просто запускаем progruard накомандная строка ( см. первый блок ниже ) в библиотеке за пределами затмения с параметрами во втором блоке ниже в нашем файле proguard.cfg (и определенно не использовать -dontpreverify или проекты, использующие ваш проект в качестве библиотеки Android, не смогут быть должным образом запутаны из-за проблем 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, как упоминалось ранее), но большинство из них имеют смысл как элементыэто должно быть там, если у вас есть расширение класса Activity в экспортируемой библиотеке.

11 голосов
/ 20 ноября 2012

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

  1. экспорт подписанного apk с использованием eclipse

  2. разархивируйте apk, найдите классы.dex

  3. используйте dex2jar.bat, замените classes.dex на банку

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

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

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

7 голосов
/ 25 ноября 2013
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

2 голосов
/ 09 января 2012

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

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

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

2 голосов
/ 11 ноября 2011

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

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

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

...