Повторная упаковка .jar-s в Android.aar library

Исходный код

Библиотека

Проект, который использует Библиотеку

Описание проблемы

Я пишу библиотеку Android (.aar) в той библиотеке, в которой я использую библиотеки .jar.

введите описание изображения здесь

Во избежание дублирования зависимости я использую плагин ShadowJar для переупаковки, как показано ниже:

task shadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
    System.out.println("Relocating packages...")
    relocate 'retrofit'               , 'com.codecraft.retrofit'
    relocate 'org.simpleframework.xml', 'com.codecraft.org.simpleframework.xml'
    relocate 'com.squareup.okhttp'    , 'com.codecraft.com.squareup.okhttp'
}

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

dependencies {
    compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
    compile 'com.squareup.retrofit:converter-simplexml:2.0.0-beta1'
}

Но когда я пытаюсь запустить приложение на Android, я получил следующую ошибку

введите описание изображения здесь

Ошибка: предупреждение: игнорирование атрибута InnerClasses для анонимного внутреннего class Error: (com.bea.xml.stream.util.CircularQueue $1), который не поставляются с атрибутом Error: related AttlosingMethod. Этот класс вероятно, был создан компилятором Error: который не нацеливался на современный формат .class. Рекомендуемая ошибка: решение перекомпилируйте класс из источника, используя современный компилятор Ошибка: и без указания параметров типа "-target". следствие игнорирования ошибки: это предупреждение является тем, что отражающий операции над этим классом будут ошибочно. Ошибка: укажите, что это а не внутренний класс. Ошибка: проблема с обработкой "javax/xml/XMLConstants.class": ошибка: неправильное или ошибочное использование основной класс (java. * или javax. *) Ошибка: когда не строится ядро библиотека. Ошибка: это часто происходит из-за непреднамеренного включения ядра файл библиотеки Ошибка: в вашем проекте приложения при использовании среды IDE (например, Error: Eclipse). Если вы уверены, что не намеренно определение ошибки: основной класс, то это наиболее вероятное объяснение о какой ошибке: продолжайте. Ошибка: однако, вы действительно можете попробовать определить класс в ядре Ошибка: пространство имен, источник которого вы например, Ошибка: с виртуальной машины, отличной от Android проект. Это будет большая ошибка: наверняка не работает. Как минимум, это подвергает опасности ошибку: совместимость вашего приложения с будущими версиями платформы. Ошибка: также часто вызывает сомнительную законность. Ошибка: если вы действительно собираетесь создавать основную библиотеку, которая только Ошибка: соответствующий как часть создания полной виртуальной машины Ошибка: распределение, в отличие от компиляции приложения, - затем используйте Ошибка: опция "--core-library" для подавления этого сообщения об ошибке. Ошибка: если вы продолжаете использовать "--core-library", но на самом деле Ошибка: создание приложения, а затем предупредить, что ваш Ошибка приложения: в какой-то момент все равно не будет создана или запущена. Пожалуйста, будьте ошибкой: подготовлены для гневных клиентов, которые находят, например, что ваша ошибка: приложение перестает функционировать после обновления Ошибка работы: система. Вы будете виноваты в этой проблеме. Ошибка: если вы законно используете какой-либо код, который находится в Ошибка: основной пакет, тогда самая простая безопасная альтернатива у вас есть: Ошибка: переупаковка этого кода. То есть, переместите рассматриваемые классы в Ошибка: ваше собственное пространство имен пакетов. Это означает, что они никогда не будут in Error: конфликт с основными системными классами. JarJar - это инструмент, который может help Ошибка: вы в этом начинании. Если вы обнаружите, что не можете этого сделать, затем Ошибка: это указание, что путь, на котором вы находитесь, будет в конечном счете Ошибка: привести к боли, страданиям, печали и плачам. Ошибка: 1 ошибка; aborting: app: transformClassesWithDexForDebug FAILED Ошибка: выполнение выполнено для задачи ': Приложение: transformClassesWithDexForDebug'.

com.android.build.api.transform.TransformException: java.lang.RuntimeException:   com.android.ide.common.process.ProcessException:   java.util.concurrent.ExecutionException:   java.lang.UnsupportedOperationException

ОБРАТИТЕ ВНИМАНИЕ, что эта проблема не появилась в случае, если я добавляю только зависимую от модификации

dependencies {
        compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
    } 

В чем причина и как я могу решить эту ошибку?

Ответ 1

Когда вы включаете Jars в свой lib или приложение, вы можете включать файлы, которые уже были скомпилированы с использованием другой версии Java или с другой конфигурацией, чем ваша, и это может вызвать проблемы, подобные тем, которые вы испытываете.

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

Если вам не нужно использовать зависимости, рассмотрите возможность загрузки кода для используемой вами библиотеки (при условии, что они являются открытыми исходными кодами, и нет никаких юридических ограничений) и компиляция их с вашим приложением в качестве дополнительных модулей в вашем проекте вместо добавляя банку. Если вы это сделаете - вы должны определенно рассмотреть, что jmols написал о размере и методе lib.

Удачи!

Ответ 2

Исключение некоторых модулей помогло мне с той же ошибкой:

compile ('com.squareup.retrofit2:converter-simplexml:2.1.0'){
    exclude group: 'xpp3', module: 'xpp3'
    exclude group: 'stax', module: 'stax-api'
    exclude group: 'stax', module: 'stax'
}

источник ссылка