Ошибка по умолчанию в proguard.cfg? - PullRequest
0 голосов
/ 18 февраля 2011

Когда я создаю новый проект Android в Eclipse, создается следующий файл proguard.cfg по умолчанию:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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.android.vending.licensing.ILicensingService

-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 enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

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

Обратите внимание, что строка -optimizations комментирует остальную часть файла.Мне интересно, является ли это преднамеренным или это опечатка, и в этой строке последние два символа должны быть перевернуты:

-optimizations !code/simplification/arithmetic,!field/*,!class/merging*/

Я использую плагин ADT 9.0 и Eclipse 3.6.1.

Ответы [ 3 ]

1 голос
/ 19 февраля 2011

Хорошо. Теперь я чувствую себя немного глупо. Ответ в том, что здесь нет комментариев. Строка должна интерпретироваться так, как если бы она была разнесена следующим образом:

-optimizations !code/simplification/arithmetic,
               !field/*,
               !class/merging/*

* - это символ подстановки, и подсветка синтаксиса, сделанная форумом, в этом случае неверна.

0 голосов
/ 18 февраля 2011

Сдерживающие операторы используются для предотвращения удаления Proguard классов или членов класса на этапе сжатия и переименования их на этапе обфускации.

Activity - это класс, который вам, скорее всего, не нуженбыть удаленным из вашего проекта.На странице Android ProGuard написано

Для некоторых ситуаций достаточно стандартных конфигураций в файле proguard.cfg.Однако во многих ситуациях ProGuard сложно анализировать правильно, и он может удалить код, который, по его мнению, не используется, но в действительности необходим вашему приложению.Вот некоторые примеры:

  • Элемент списка: класс, на который есть ссылка только в файле AndroidManifest.xml

Поскольку эта часть закомментирована в конфигурации по умолчаниюЯ думаю, что это так, потому что строка с комментариями -keep Actions не позволила бы proguard устранить любую активность.

Короче говоря : опечаток нет

0 голосов
/ 18 февраля 2011

Вы уверены, что случайно не сделали это?

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

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-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 * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

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

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

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

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