Proguard: предотвращение конфликтов имен с предварительно обфусцированными библиотечными JAR-файлами

Кажется, что Proguard не предпринимает никаких попыток избежать конфликтов имен с классами в библиотечных JAR-файлах, когда он переименовывает/переупаковывает классы. Это правильно, или я просто не правильно настроил?

Я запутываю приложение для Android, которое использует последнюю версию Google AdMob SDK. Раньше я без проблем использовал старый AdMob SDK. Новый JAR-файл SDK содержит некоторые запутанные классы. Один из этих классов — a.class в пакете по умолчанию/без имени. Когда я запутываю свое приложение, Proguard переименовывает/переупаковывает один из моих классов, чтобы он также был a.class в безымянном пакете, несмотря на то, что он читал JAR AdMob как библиотечный JAR (поэтому он должен знать, что это вызовет коллизию). Как и ожидалось, моя сборка дает сбой, когда инструмент dx пытается объединить эти два класса с одинаковыми именами в одном файле .dex.

В качестве обходного пути я перенастроил Proguard так, чтобы он перемещал все мои классы в именованный пакет (всего одну букву), чтобы избежать конфликтов с классами Google, но мне интересно знать, есть ли лучшее решение или это ограничение текущей версии (4.6) Proguard?


person Dan Dyer    schedule 25.04.2011    source источник
comment
Не уверен, что тег Android необходим. Я столкнулся с этой проблемой в проекте Android, но она не специфична для Android.   -  person Dan Dyer    schedule 26.04.2011


Ответы (2)


Из руководства progaurd,

Если входной jar и библиотечный jar содержат классы в одном и том же пакете, запутанный выходной jar может содержать имена классов, перекрывающиеся с именами классов в библиотечном jar. Это наиболее вероятно, если библиотечный jar-файл был ранее запутан, поскольку тогда он, вероятно, будет содержать классы с именами «a», «b» и т. д. Поэтому пакеты никогда не должны быть разделены между входными jar-файлами и библиотечными jar-файлами.

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

person sbridges    schedule 26.04.2011

В закрытых библиотеках, чтобы предотвратить конфликт между несколькими запутанными модулями/библиотеками, вы должны использовать

-keeppackagenames

правило proguard для предотвращения полной переупаковки классов, в противном случае вы можете найти такие ошибки, как:

Дублированный класс a.a.a.a в [jetified-lib1] и a.a.a.a в [jetified-lib2]

person MatPag    schedule 05.03.2020