Исключить один файл класса в gradle Android Studio

В моих проектах мне нужно импортировать сторонний файл jar и Facebook SDK.

compile files('libs/SkinSDK.jar')
compile 'com.facebook.android:facebook-android-sdk:4.14.0'

Оба включают один и тот же класс BundleJSONConverter. Итак, я не могу создать подписанный APK. Он всегда показывает повторяющуюся запись com/facebook/internal/BundleJSONConverter.

Итак, я хочу исключить в Facebook или SkinSDK.jar. я пытался как

compile ('com.facebook.android:facebook-android-sdk:4.14.0') {
    exclude group: 'com.facebook.internal', module: 'BundleJSONConverter'
}

Он не работает и показывает ту же ошибку.


person saturngod    schedule 04.07.2017    source источник


Ответы (2)


Метод exclude замыкания конфигурации для зависимости исключает транзитивные зависимости. Итак, если зависимость вашего модуля зависит от других модулей, вы можете исключить их из своей сборки. Вы можете проверить транзитивные зависимости модуля 'com.facebook.android:facebook-android-sdk:4.14.0' на его Информационная страница репозитория Maven.

Если класс BundleJSONConverter существует в транзитивной зависимости, вы можете исключить конкретный модуль так же, как вы пытаетесь сделать это сейчас. Просто укажите group, module и version, как вы это делаете для зависимостей.

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

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

compile jarjar.repackage {
    from 'org.apache.hive:hive-exec:0.13.0.2.1.5.0-695'

    archiveBypass "commons*.jar"
    archiveExclude "slf4j*.jar"

    classDelete "org.apache.thrift.**"
    classRename 'org.json.**', 'org.anarres.hive.json.@1'
}
person Lukas Körfer    schedule 04.07.2017
comment
Не удалось получить неизвестное свойство jarjar, которое я получаю. Что делать? - person Nallamachu; 07.10.2020
comment
@Nallamachu Вам нужно включить плагин jar jar links. К сожалению, он недоступен через портал плагинов Gradle, поэтому вы не можете просто использовать замыкание plugins. Вместо этого ознакомьтесь с полным примером build.gradle. - person Lukas Körfer; 07.10.2020

Столкнулся с похожей ситуацией. Вот что я сделал, не элегантно, как я надеялся, но это работает:

  1. Переименуйте файл jar (SkinSDK.jar в вашем случае): .zip вместо .jar

  2. Зайдите «внутрь» zip-файла (я использую DoubleCommander, для этого есть много других утилит) или извлеките его во временную папку.

  3. Удалите повторяющийся класс, который вызывает проблему. Выйдите «вне» zip-файла.

  4. Переименуйте (или переупакуйте) файл из .zip в .jar. Скомпилировать.

Надеюсь, что это работает...

person Ari    schedule 05.07.2017
comment
Чтобы сократить эту процедуру: Нет необходимости переименовывать или перепаковывать архив. Любой файл jar является файлом zip, его можно открыть с помощью различных инструментов (например, 7-zip). - person Lukas Körfer; 10.07.2017
comment
Кроме того, задокументируйте это jar изменение файла! В противном случае вы столкнетесь с проблемами при обновлении внешней библиотеки. - person Lukas Körfer; 10.07.2017
comment
Обратите внимание, что вопрос был о том, чтобы сделать это с помощью gradle, а не вручную. - person ozma; 16.02.2021