つまり、GSONライブラリを使用して、ランタイム中に一部のHTCデバイスでJSONをシリアライズ/デシリアライズすると、クラッシュしました。 この動作の理由は、一部のHTCデバイスのファームウェアにGSONの独自のバージョンがあり、これはプロジェクトで使用したものよりも古いためです。 そして、Android Javaクラスローダーは、クラスをメモリにロードするときに、プロジェクト内のバージョンではなく「システム」バージョンを優先します。
さらに、一部のデバイスでは、Android開発の世界でかなり人気のあるライブラリであるOkHttpにも同様の問題があります。
この問題を解決するには、 JarJarユーティリティを使用してGSON (またはその他のライブラリ)を再パッケージ化する必要があります。 再パッケージ後、アーティファクトは新しいパッケージ構造になります。これは、プロジェクトのインポートディレクティブで使用する必要があります。 これを行うには、元のパッケージではなく、再パッケージ化されたjarをプロジェクトに接続する必要があります。
このタスクを自動化したいと思った結果、 Maven Centralで利用可能なGradle JarJarプラグインが登場しました 。 このプラグインを使用すると、JarJarを使用してjarライブラリとそれらを再パッケージ化するためのルールを指定できます。
プラグインをスクリプトの依存関係に追加します。
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'] }