Ошибка в proguard.cfg по умолчанию?

Когда я создаю новый проект 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.


person Ted Hopp    schedule 18.02.2011    source источник


Ответы (3)


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

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

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

person Ted Hopp    schedule 18.02.2011
comment
как добавить комментарии в proguard.cfg? это вообще возможно? - person Someone Somewhere; 07.04.2011
comment
@Someone - отчасти поэтому я чувствую себя глупо. Файл proguard.cfg просто заменяет ввод параметров командной строки в командную строку (как Руководство по ProGuard разъясняет). Поскольку нет возможности встроить комментарии в командную строку, возможно, нет и возможности добавить комментарии к файлу. Жаль, потому что файл может быть довольно сложным, и комментарии, вероятно, могут быть полезны. - person Ted Hopp; 07.04.2011
comment
Я считаю, что строки, начинающиеся с #, являются комментариями. - person Paul Lammertsma; 03.08.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>;
}
person Robby Pond    schedule 18.02.2011
comment
Я не случайно сделал это; этот файл был сгенерирован автоматически. - person Ted Hopp; 19.02.2011
comment
Интересно, что он отличается от того, что у меня есть. На какую платформу вы ориентировались при создании проекта? (Я нацелился на SDK 1.6.) - person Ted Hopp; 19.02.2011

Операторы keep используются, чтобы запретить proguard удалять классы или члены классов на этапе сжатия и переименовывать их на этапе запутывания.

Activity — это класс, который вы, скорее всего, не хотите удалять из своего проекта. На странице ProGuard Android написано

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

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

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

Короче: без опечаток

person Maaalte    schedule 18.02.2011
comment
Оказывается, это вообще не комментарий. - person Ted Hopp; 19.02.2011