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

от автора

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

А именно: при использовании библиотеки 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'] } 

ссылка на оригинал статьи http://habrahabr.ru/post/260707/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *