Почему некоторые закрытые от пакетов классы не скрываются Proguard? - PullRequest
0 голосов
/ 10 октября 2018

Работая с проектом Android в Android Studio 3.2, включив Proguard и некоторые конкретные правила, я не могу выяснить следующее:

определенный пакет (и его подпакеты) в модуле библиотекииспользуемый клиентским кодом, сохраняется с помощью правила:

-keep public class com.mylib.mypackage.** {
    public protected *;
}

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

Вместо этого есть некоторые классы, реализующие открытые интерфейсы, чьи имена классов не запутываются, хотя я ожидаюим следует.Для полноты, их имена членов, когда они не являются частью интерфейса, эффективно запутываются.

Пример:

/* package */ class InternalComponent implements ExternalInterface {

  // ExternalInterface is kept: Ok
  // InternalComponent is kept: don't like, I'd like it renamed

  @Override
  public void ExternalMethod() {
    // this is kept: Ok
  }

  public void InternalMethod() {
    // this is renamed: Ok
  }
}

Я хотел бы подчеркнуть, что InternalComponent создается внутри некоторого другого (сохранено) и возвращается в клиентский код только через ExternalInterface.

Как я могу также запутать имена их классов, если это возможно?

Edit # 1
После ответа @emandt на выходные файлы Proguard я дважды проверил, и com.mylib.mypackage.InternalComponent указан в seeds.txt, в котором согласно в этом сообщении перечислены все элементы, соответствующие правилам хранения.Поэтому, по какой-то причине, вышеприведенное правило также выбирает закрытые для пакета классы, которые мне все еще кажутся неправильными.

Edit # 2 Тем временем я закончил тем же путемпредложено @shizhen.Для полноты, чтобы распространить исключение на любой пакет с именем internal, я изменил свое правило proguard следующим образом:

-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** { 
    public protected *;
}

(обратите внимание на первую часть перед запятой, с префиксом!)

Я отмечу ответ @shizhen, хотя мне хотелось бы узнать, почему в исходном правиле также выбираются компоненты, закрытые для пакетов.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы работаете над проектом Android Library ?Вероятно, да.

Боюсь, что для достижения вашей цели вам необходимо реорганизовать ваши пакеты в нечто вроде следующего:

Публичные интерфейсы

com.my.package.apiforusers

Частные / Внутренние реализации

com.my.package.apiforusers.internal

Тогда для ваших правил запутывания вы можете иметь его как ниже:

-keep public class com.my.package.apiforusers.* { public *; }

Так, что только публичные классы / интерфейсы сохраняются, и все эти внутри com.my.package.apiforusers.internal будут запутаны.

0 голосов
/ 10 октября 2018

В папке "/ build / output / mapping / release /" есть несколько файлов ("creation.txt", "seed.txt" и т. Д.), Которые содержат ПРИЧИНЫ, почему и какие классы / переменные / методы/ etc .. не обрабатываются / не сжимаются / не скрываются через утилиты ProGuard.

...