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

Розробляючи наш Мобільний Банк одного разу ми зіткнулися з такою проблемою.

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

Зараз при складанні проекту gradle-му, гугл навіть люб'язно вас попереджає про потенційну небезпеку, якщо ви використовуєте GSON:
WARNING: Dependency org.json:json:20080701 is ignored debug for 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']
}


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.