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

#android #eclipse #jar #obfuscation #proguard

#Android #eclipse #jar #запутывание #proguard

Вопрос:

Я видел много сообщений о том, как запутать приложение 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, использование мастера экспорта и т.д.), Похоже, не работает — я не вижу запутывания имен классов и т.д. В результирующем файле 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. @user1040716 … вам удалось сгенерировать запутанный JAR?

Ответ №1:

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

мы просто запускаем progruard в командной строке (см. Первый блок ниже) в библиотеке за пределами eclipse с параметрами во втором блоке ниже в нашем proguard.cfg файле our (и определенно не используем -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 в библиотеке, которую вы экспортируете.

Ответ №2:

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

  1. экспортируйте подписанный apk-файл с помощью eclipse

  2. распакуйте apk, найдите classes.dex

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

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

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

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

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

1. После этих шагов я не могу использовать этот jar как старый jar. Старый импорт> com.abc.123 Автоматически исправляет новый импорт> XXX.com.abc.123 Поэтому мои классы obfustcate не могут найти друг друга… Есть идеи?

2. Заархивируйте папку com, а не контейнер

3. то же самое здесь, мои классы не могут найти друг друга, т. е. имя классов было изменено

Ответ №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:androidsdkplatformsandroid-10android.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

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

1. Спасибо! На Mac: в дополнение к настройке пути -libraryjars для скрипта выше, мне также понадобилась программная ссылка rt.jar -> classes.jar следуя приведенным здесь инструкциям: bruehlicke.blogspot.com/2009/11 /…

Ответ №4:

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

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

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

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

1. @user1040716 — вы упомянули о создании proguard.cfg. Это должно было быть создано для вас автоматически при настройке проекта. Если ее там нет, возможно, проект настроен неправильно. Попробуйте с совершенно новым проектом Android. Это должно сработать «из коробки» (как только вы добавите строку в project.properties). Убедитесь, что ваши инструменты SDK обновлены.

2. Я только что создал совершенно новый проект под Android 3.0. Скопировал файлы src из старого проекта. файл proguard.cfg был сгенерирован автоматически, но project.properties не был сгенерирован автоматически. Итак, сначала я добавил строку ‘proguard.config=proguard.cfg’ в default.properties. Выполнил экспорт файла Java JAR. Никаких запутываний не замечено. Затем я создал локальный файл project.properties и добавил строку. Затем выполнил экспорт файла Java JAR. Опять же, запутывания не замечено. Если я «экспортирую приложение Android», тогда создается файл .apk. Но я хочу запутанный файл .jar. Спасибо.

3. Идея заключается в этом. файл jar с запутанным кодом для использования в других проектах Android с помощью опции «Добавить внешние банки …» в разделе Путь сборки Java / Библиотеки.

4. Я думаю, для этого вам придется запустить ProGuard вне Eclipse (или, по крайней мере, вне процесса сборки Android). Процесс сборки Android вызывает ProGuard только при экспорте файлов .apk.

5. В итоге я запустил ProGuard вне Eclipse, как предложил Ted. Спасибо.

Ответ №5:

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

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

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

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

1. Что ж, я хотел бы распространять библиотеку (файл.jar) с запутанным кодом; другие будут использовать мою библиотеку в своих клиентских проектах. Итак, мне нужно запутать мой чистый Java Jar перед распространением. В итоге я запустил ProGuard вне Eclipse, как предложил Тед Хопп.

2. ага. Извините, моя голова, должно быть, пропустила это!

3. @the down-voter: не могли бы вы, пожалуйста, пояснить, что не так с предлагаемым решением. Спасибо