Android разработка — Gradle JarJar plugin

27011c43384c47d28d5b60c25f4b941f.pngРазрабатывая наш Мобильный Банк мы однажды столкнулись с такой проблемой.

А именно: при использовании библиотеки GSON для сериализации/десериализации в/из JSON на некоторых устройствах от HTC в рантайме мы получали креш. Причина такого поведения в том, что некоторые устройства от HTC имеют в своей прошивке свою версию GSON, которая более старая чем та которую использовали мы в своих проектах. А андроидовский java class loader при загрузке класса в память предпочитает «системную» версию, вместо версии в проекте.

В настоящий момент при сборке проекта gradle-ом, гугл даже любезно вас предупреждает о потенциальной опасности, если вы используете GSON:

WARNING: Dependency org.json: json:20080701 is ignored for debug as it may be conflicting with the internal version provided by Android.
In case of problem, please repackage with jarjar to change the class packages


Кроме того на некоторых устройствах существует аналогичная проблема с 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']
}

© Habrahabr.ru