Android gradle aarは依存を伝えることができません

1932 ワード

まずgradle依存のいくつかの一般的なキーワードを見てみましょう
 
新しい構成
破棄された構成
動作
本Module
上層モジュール
implementation
compile
依存項目は、コンパイル時にモジュールに対して使用可能であり、実行時にモジュールの消費者に対してのみ使用可能である.大規模なマルチプロジェクト構築では、implementationではなくapi/compileを使用すると、構築システムの再コンパイルが必要なプロジェクト量を削減できるため、構築時間を大幅に短縮できます.ほとんどのアプリケーションおよびテストモジュールでは、この構成を使用する必要があります.
コンパイル&実行
うんてん
api
compile
依存項目は、コンパイル時にモジュールに使用可能であり、コンパイル時および実行時にモジュールの消費者にも使用可能である.この構成の動作は、compile(現在は破棄されています)と同様です.一般的には、ライブラリモジュールでのみ使用する必要があります.アプリケーションモジュールは、APIを個別のテストモジュールに公開しない限り、implementationを使用する必要があります.
コンパイル&実行
コンパイル&実行
compileOnly
provided
依存項目は、コンパイル時にモジュールにのみ使用でき、コンパイル時または実行時に消費者には使用できません.この構成の動作は、provided(現在は破棄されています)に似ています.
コンパイル
-
runtimeOnly
apk
依存項目は、実行時にモジュールおよびその消費者にのみ使用できます.この構成の動作は、apk(現在は破棄されています)に似ています.
うんてん
うんてん
 
 
 
 
 
上の表の「コンパイル」は、このModuleでのコンパイル時にlibを使用できることを示し、「実行」は、このModuleが実行時にlibを使用できることを示しています.例えば、A依存B、B依存Cは、Bで「implementation」依存を使用する場合「implementation'com.google.code.gson:2.6.2」を使用し、Bはコンパイルおよび実行時にgsonライブラリ内のコードを使用することができる.ただし,Aは実行時のみgsonライブラリのコードを使用することができ,コンパイル時,すなわちコードを書く場合はgsonライブラリのコードを参照することはできない.
上記の依存伝達は、リモート依存にのみ適用されます.たとえば、「implementation'com.example.android:app-magic:12.3'」です.しかし、ローカルaar依存性、例えば「implementation files('libs/foo.jar','libs/bar.jar')」は異なります.
Moduleでimplementationキーワードを使用してリモートライブラリに依存しました.たとえば「implementation'com.google.code.gson:gson:2.6.2'」です.その後、Moduleをaarにパッケージ化し、他のModuleに依存します.実行時に「java.lang.NoClassDefFoundError:gson」という異常が発生します.これはおかしいのではないでしょうか.私はライブラリを依存していたのに、aarに電話した後、間違ったことを報告しました.現在のModule実行時にこのエラーは発生しません.なぜなら、リモート依存はxxxに格納されるからである.pomファイルの場合、aarにパッケージ化された後はこれらの特性はありません.だからもちろんこの依存を伝えることはできません.しかしjar/aarローカル依存で入ってきた場合はaar内部に打ち込まれているので使用できます.