Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Dan DyerОтветов: 2

Кажется, что 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?

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

javaproguardobfuscation

Ответы

Ответ 1 · рейтинг 4 · sbridges

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

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

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

Ответ 2 · MatPag

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

-keeppackagenames

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы