Разрабатывая наш Мобильный Банк мы однажды столкнулись с такой проблемой.
А именно: при использовании библиотеки GSON для сериализации/десериализации в/из JSON на некоторых устройствах от HTC в рантайме мы получали креш. Причина такого поведения в том, что некоторые устройства от HTC имеют в своей прошивке свою версию GSON, которая более старая чем та которую использовали мы в своих проектах. А андроидовский java class loader при загрузке класса в память предпочитает «системную» версию, вместо версии в проекте.
Кроме того на некоторых устройствах существует аналогичная проблема с OkHttp — тоже довольно популярной библиотекой в мире андроид разработки.
Для решения проблемы необходимо переупаковать GSON (или любую другую библиотеку) с помощью утилиты JarJar. После переупаковки артефакт будет иметь новую структуру пакетов, которую необходимо использовать в директивах импорта в своем проекте. Для этого нужно подключить переупакованный jar к своему проекту вместо исходного.
Нам захотелось автоматизировать эту задачу и в итоге появился Gradle JarJar Plugin, доступный в Maven Central. Плагин позволяет указать jar-библиотеки и правила для переупаковки их с помощью JarJar.
Добавляем плагин в dependencies скрипта:
Подключаем его в модуле проекта:
Указываем список артефактов для переупаковки:
Настраиваем:
А именно: при использовании библиотеки GSON для сериализации/десериализации в/из JSON на некоторых устройствах от HTC в рантайме мы получали креш. Причина такого поведения в том, что некоторые устройства от HTC имеют в своей прошивке свою версию GSON, которая более старая чем та которую использовали мы в своих проектах. А андроидовский java class loader при загрузке класса в память предпочитает «системную» версию, вместо версии в проекте.
Кроме того на некоторых устройствах существует аналогичная проблема с OkHttp — тоже довольно популярной библиотекой в мире андроид разработки.
Для решения проблемы необходимо переупаковать GSON (или любую другую библиотеку) с помощью утилиты JarJar. После переупаковки артефакт будет иметь новую структуру пакетов, которую необходимо использовать в директивах импорта в своем проекте. Для этого нужно подключить переупакованный jar к своему проекту вместо исходного.
Нам захотелось автоматизировать эту задачу и в итоге появился Gradle JarJar Plugin, доступный в Maven Central. Плагин позволяет указать jar-библиотеки и правила для переупаковки их с помощью JarJar.
Добавляем плагин в dependencies скрипта:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'ru.tinkoff.gradle:jarjar:1.1.0'
}
}
Подключаем его в модуле проекта:
apply plugin: 'ru.tinkoff.gradle.jarjar'
Указываем список артефактов для переупаковки:
dependencies {
// Будет переупаковано с помощью JarJar
jarJar 'com.google.code.gson:gson:2.3'
// Результаты работы плагина находятся в build/libs, добавляем их в classpath проекта
compile fileTree(dir: './build/libs', include: ['*.jar'])
}
Настраиваем:
jarJar {
// Опциональный параметр - jarJar.jar используемый для переупаковки jar :)
jarJarDependency 'com.googlecode.jarjar:jarjar:1.3'
// Список правил
// первый параметр - имя артефакта, указанного в скоупе jarJar в dependencies проекта
// второй - правила для JarJar
rules = ['gson-2.3.jar': 'com.google.gson.** ru.tinkoff.core.gson.@1']
}