Почему ProGuard сохраняет метод onCreate ()? - PullRequest
6 голосов
/ 08 мая 2011

Я пытаюсь обернуть голову вокруг этого, но я просто не понимаю, почему это происходит: согласно файлу proguard.cfg по умолчанию я определяю следующее правило:

-keep public class * extends android.app.Activity

Насколько я понимаю, это означает: сохраняйте любой класс Activity в качестве точки входа, но не стесняйтесь сжимать / запутывать / оптимизировать все, что находится внутри него (в противном случае я должен был бы использовать, например, подстановочный знак <methods> для методы сохранения тоже не так ли?).

Теперь моя тестовая активность выглядит так:

public class MyActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        ...
    }

    public void unusedMethod() {
    }
}

Если я теперь экспортирую подписанный APK и вызову ProGuard, он удалит unusedMethod, как и ожидалось, но сохранит метод onCreate и не будет скрывать его имя. Почему это?

1 Ответ

9 голосов
/ 08 мая 2011

Ваше понимание параметров конфигурации верно. Однако ProGuard не может удалить или переименовать ваш метод onCreate, поскольку он переопределяет метод onCreate в android.app.Activity. Переименование это сломало бы приложение. Методы, которые не переопределяют библиотечные методы, такие как unusedMethod, могут быть безопасно удалены, встроены или, по крайней мере, переименованы.

Метод M следует переименовать, если вы не укажете для него опцию -keep. Вы можете проверить это с помощью опции -whyareyoukeeping.

...