Включение ProGuard в Eclipse для Android

112

В новой документации по ProGuard для Android говорится о необходимости добавить строку в файл default.properties в домашнем каталоге проекта. Однако, открыв этот файл, я прочитал вверху:

# This file is automatically generated by Android Tools. 
# Do not modify this file -- YOUR CHANGES WILL BE ERASED! 

Я что-то упускаю?

Кроме того, есть ли способ включить ProGuard только для производственной сборки из Eclipse (например, при экспорте готового продукта)?

Тед Хопп
источник
Я согласен с вашей точкой зрения, что default.properties будет обновляться каждый раз. Таким образом, это интересный вопрос
Аман Алам
Вы должны принять ответ ligi, NeTeInStEiN больше не действует и сбивает с толку нового пользователя.
Гаурав Агарвал
2
Я изменил ответ, чтобы он был актуальным.
neteinstein
Ответ ligi все еще более ясен, чем ответ neteinstein, для более новых установок. Самое главное, он показывает proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt , нужны ли вам индивидуальные настройки для конкретного проекта.
ToolmakerSteve

Ответы:

76

просто продолжение, потому что я искал то же самое - и ответы здесь устарели - в последнее время базовая конфигурация proguard находится здесь, в каталоге sdk, поэтому вам нужно только поместить это в свой project.properties:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt

если вы хотите внести изменения для конкретного проекта, создайте файл proguard-project.txt и измените строку на:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 
лиги
источник
Глядя на мой проект (в версии r20, но сгенерированный в предыдущем выпуске), похоже, что он использует сочетание вышеперечисленных методов:
Том
26
Все еще довольно запутанно, потому что project.properties также говорит: # Этот файл автоматически создается Android Tools. # Не изменяйте этот файл - ВАШИ ИЗМЕНЕНИЯ БУДУТ УДАЛЕНЫ!
Тодд Пейнтон,
12
"вам нужно только поместить это в свой project.properties". Эта строка будет в project.properties, но по умолчанию прокомментирована. Просто не комментируйте.
Braj
113

Android SDK (r20 или выше)

Пожалуйста, проверьте предопределенный proguard.config, указанный в project.properties

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt

Дополнительная информация: http://proguard.sourceforge.net/manual/examples.html#androidapplication

В Gradle:

buildTypes {
 release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            ...
  }
 }

Здесь вы можете проверить файл proguard по умолчанию, который я постоянно обновляю: https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


Android SDK (r19 или ниже)

Вы можете добавить его в default.properties. Я добавляю вручную без проблем.

Если вы добавите строку:

proguard.config=proguard.cfg

Как уже говорилось, он будет использовать ProGuard только при экспорте подписанного приложения (Android Tools => Export Signed Application)

Если вы запустите проект с SDK до Android 2.3, proguard.cfgфайл не будет создан ( default.propertiesкак в 2.3>).

Чтобы включить его автоматическое создание, просто обновите SDK до Android 2.3 и создайте новый проект с существующими источниками (которые являются источниками текущего проекта).

Заливка proguard.cfgбудет создана автоматически.

Если все же вы хотите создать его вручную, вот что он должен содержать:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontwarn android.support.**
-verbose

-dontoptimize
-dontpreverify


-keepattributes *Annotation* 
-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 com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

 -keepclassmembers public class * extends android.view.View {
  void set*(***);
  *** get*();
 }

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

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
  public static <fields>;
}

Думаю, я ответил на все вопросы выше.

ОБНОВЛЕНИЕ :

Построчное объяснение:

#Use 5 step of optimization 
#-optimizationpasses 5

#When not preverifing in a case-insensitive filing system, such as Windows. This tool will unpack your processed jars,(if using windows you should then use):
-dontusemixedcaseclassnames

#Specifies not to ignore non-public library classes. As of version 4.5, this is the default setting
-dontskipnonpubliclibraryclasses

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).    
-dontoptimize
-dontpreverify

-dontwarn android.support.**

#Specifies to write out some more information during processing. If the program terminates with an exception, this option will print out the entire stack trace, instead of just the exception message.
-verbose

#The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. Note that the Dalvik VM also can't handle aggressive overloading (of static fields).
#To understand or change this check http://proguard.sourceforge.net/index.html#/manual/optimizations.html
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

#To repackage classes on a single package
#-repackageclasses ''

#Uncomment if using annotations to keep them.
#-keepattributes *Annotation*

#Keep classes that are referenced on the AndroidManifest
-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.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#Compatibility library 
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

#To maintain custom components names that are used on layouts XML.
#Uncomment if having any problem with the approach below
#-keep public class custom.components.package.and.name.**

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
 -keepclassmembers public class * extends android.view.View {
  void set*(***);
  *** get*();
}

#To remove debug logs:
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** w(...);
}

#To avoid changing names of methods invoked on layout's onClick.
# Uncomment and add specific method names if using onClick on layouts
#-keepclassmembers class * {
# public void onClickButton(android.view.View);
#}

#Maintain java native methods 
-keepclasseswithmembernames class * {
    native <methods>;
}


#To maintain custom components names that are used on layouts XML:
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
}
-keep public class * extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keep public class * extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

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

#To keep parcelable classes (to serialize - deserialize objects to sent through Intents)
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#Keep the R
-keepclassmembers class **.R$* {
    public static <fields>;
}

###### ADDITIONAL OPTIONS NOT USED NORMALLY

#To keep callback calls. Uncomment if using any
#http://proguard.sourceforge.net/index.html#/manual/examples.html#callback
#-keep class mypackage.MyCallbackClass {
#   void myCallbackMethod(java.lang.String);
#}

#Uncomment if using Serializable 
#-keepclassmembers class * implements java.io.Serializable {
#    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();
#}

ОБНОВЛЕНИЕ 2:

В самой последней версии ADT / Proguard -keepclasseswithmembersвместо-keepclasseswithmembernames

neteinstein
источник
1
@NeTeInStEiN Я обновился до SDK 16 (Android 4.x), добавил строку, proguard.config=proguard.cfgно файла proguard.cfg нигде не видно ... Несмотря на выполнение экспорта несколько раз, перезапуск Eclipse и т. Д. Есть идеи, почему? и как это исправить? Спасибо.
Bill The Ape
1
@NeTeInStEiN Неважно. Оказывается, надо было самому создать.
Bill The Ape
@NeTeInStEiN Когда я создаю проект, хотя его целью сборки является Android1.1, я обнаружил файл proguard.cfg, который создается автоматически.
hasanghaforian
1
@NeTeInStEiN Удивительный человек ... Цените ваше время и усилия, Ура !!
swiftBoy
1
@ user31231234124 Добавил запрошенную информацию.
neteinstein
10

По крайней мере, начиная с ADT 16, вы действительно можете добавить строку project.properties, и она будет сохранена. Вы можете попробовать изменить целевую версию SDK и увидеть, что project.propertiesона обновляется соответствующим образом, но добавленная строка все еще существует. Итак, я думаю, что предупреждение просто плохо сформулировано; это означает, что настройки в файле, например, targetбудут перезаписаны настройками проекта, а не наоборот.

usethe4ce
источник
4

Изменения в конфигурации ProGuard произошли в ADT версии 17. ProGuard был обновлен с 4.4 до 4.7, и разница в уже отмеченной ссылке на файл конфигурации была внесена. Обратите внимание, что существующие проекты останутся без изменений, оставив их без нового набора правил, включенного в эту и новые версии ADT. Соответствующий документ для более новой конфигурации, уже отмеченный ligi выше, доступен по адресу: -

http://tools.android.com/recent/proguardimprovements «Во-вторых, мы изменили способ обработки файлов конфигурации».

phillxnet
источник
3

Вы можете добавить строку в build.properties, как указано в default.properties.

Эрик Лафортюн
источник
Где build.properties? Или мне нужно его создать?
Тед Хопп
Он находится в каталоге проекта, рядом с default.properties (по крайней мере, с Android SDK r8).
Эрик Лафортюн
Вот где и искал, но такого файла нет ни в одном из моих проектов. Я использую последний плагин и только что создал проект уровня 8, чтобы проверить это.
Тед Хопп
4
Оказывается, использование build.properties работает только для сборок Ant, но не для сборок Eclipse.
Тед Хопп
Где build.properties в Android Studio Buld 2016?