0

私はそれぞれに同じクラスのライブラリが2つあります。しかし、彼らはいくつかの異なる内容(メソッド/定数)を持っています。例えばコンパイルとランタイムに異なるライブラリを選択する

図書館1:

package com.test.package; 
Class A { 
    // only method signatures 
    public void methodA() { 
    } 

    public void methodB() { 
    } 
} 

ライブラリ2:

package com.test.package; 
Class A { 
    public void methodA() { 
      // some logic that MUST be executed to provide backward compatibility 
    } 
} 

私のアプリケーションは、ライブラリ1及びライブラリー2を使用し、com.test.package.ClassAを持つデバイスで実行されますが、com.test.package.ClassA.methodB()意志フレームワークの新しいリリースにのみ存在します。私は、アプリケーション1をコンパイルするためにライブラリ1を、methodA()の異なる実装を実行するためにライブラリ2を使用する必要があると述べています。

私はAndroid Studioで.jarと.aarライブラリ形式を使用してこれを実行しようとしましたが、いずれも私のために働いていませんでした。

Android Studioプロジェクトでこの設定を行うことはできますか?

私は図書館1と2の両方を構築しています、と私は、単純なJavaアプリケーション用のライブラリ2.

答えて

0

でmethodB()を追加することはできません、あなたはcompileruntime構成をリンク解除することによってこれを行うことができます。私は例示的なリポジトリhereを設定しました。

考え方はthis commitに表示されますが、compile設定の内容が含まれないようにruntimeの設定を手動でリセットすると説明できます。その後、ランタイムライブラリのバリエーションをruntime構成に含めることができます。

アプリケーションの build.gradleなりのようなもの:

apply plugin: 'application' 

mainClassName = 'my.package.MyAppClass' 

configurations.runtime.extendsFrom = [] // Reset runtime configuration 

dependencies { 
    compile 'my.group:my.artifact:2.0' // Library 1, with the new method 
    runtime 'my.group:my.artifact:1.0' // Library 2, without the method 
} 

Androidの場合、これはもう少し複雑になることができます。問題は、Android用のruntime設定がないことです(Robolectricなどを使用していない限り、あなたのコンピュータでは実行しないためです)。

おそらく使用できるいくつかの回避策があると思いますが、最初の提案は、他のライブラリへの依存関係を抽象化するラッパーライブラリを作成することです。このラッパー・ライブラリーは、最新のライブラリー・バージョン(ライブラリー1、新しいメソッド付き)でコンパイルすることができます。非推移依存関係としてそれを設定し、他のライブラリのバージョンを含めながら、あなたはその後、Androidアプリでラッパーライブラリを含めることができます

dependencies { 
    compile 'my.group:my.wrapped.artifact:0.1' { 
     transitive = false // Don't include dependencies of the wrapper 
          // i.e., don't include version 2.0 of the lib. 
    } 
    compile 'my.group:my.artifact:1.0' 
} 

非推移のGradleにはないので、これは、依存関係を設定することにより、理由は動作するはずです再帰的にラッパー・ライブラリーの依存関係が含まれているため、ラッパーをコンパイルするために使用されたバージョンは(理論上)APKには含まれていません。したがって、競合を起こさずに古いバージョンを追加することができます。

例は、同じリポジトリのAndroid branchの下に設定されています。まず、2つのJavaライブラリが作成されます。その後、コンパイル時のライブラリを囲むためにan Android library is createdexample activity is createdは、ラッパー・ライブラリーの使用時にコンパイル時ライブラリーを使用する方法を示しています。次に、latest commitは、ラッパーライブラリ(最新のライブラリでコンパイルする)を使用するようにアプリケーションを設定する方法を示しますが、実行時に代わりに古いライブラリをインクルードするように強制します。

希望するもの=)

関連する問題