3

Java で相対パッケージ パスを使用してインポートを行う方法があるかどうか疑問に思っています。このようなもの:

import *.fragments.MyFragment;

これは、メイン アプリに "MyFragment" の 1 つの定義を持たせたいホワイト ラベル アプリがあったが、プロダクト フレーバーでそれを別の定義にする必要がある場合に使用します。

4

2 に答える 2

4

いいえ。

クラスは完全に修飾されたものです。たとえばインポートできたとしても。すべてのパッケージの Object という名前のすべてのクラスの場合、ランタイムは、特定のステートメントでどのクラスを使用するかを認識している必要があります。完全修飾名がなければ、必要なクラスをランタイムが知る方法はまったくありません (これがまさに import ステートメントの目的です)。また、2 つのクラスが同じ正規名を共有している場合、それらは同じクラスです。

完全に言うと、バニラ Java では、実際には同じ名前の 2 つのクラスを同じランタイムにロードできます。ただし、異なる を指す別のクラスローダーを使用する必要がありjarsます。同じクラスローダー内の他のクラスをシャドウするようにクラスパスを巧みに作成することもできます (クラスパスで最初に来るクラスを取得します)。dexただし、Android ビルド システムでは、同じ正規名を持つ複数のクラスを使用できません。DexException以前はすべてが同じclasses.dexファイルに圧縮されていたため、 が得られます。この制限が multidex の世界で緩和されたかどうかはわかりません。

必要なことを行うには、フレーバー固有のソース セットを利用するだけです。したがってsrc/flavor1/java、クラスの 1 つの定義が含まれてsrc/flavor2/javaおり、同じクラスの別の定義が含まれています。これを行うと、クラスはメイン ソース セットで定義できなくなり、すべてのフレーバーのソース セットで個別に定義する必要があります。

フレーバーは通常、製品のタイプとflavor != variant. したがって、 anormalと awhitelabelフレーバーが必要です。通常のフレーバーでは、通常のフラグメントでビルドします。ホワイトレーベルのフレーバーでは、別のフラグメントで構築します。それはたった2つの異なるクラスです。

それを超えると、ビルド哲学をフレーバーや gradle の便利なソース セットの概念から切り離すために選択できる、昔ながらの依存性注入とインターフェイスに取り掛かります。

于 2016-02-17T22:46:02.913 に答える
0

@dcow's answer の拡張として - フレーバーを次元で組み合わせることができます。したがって、たとえば 4 つのフレーバーがあり、それらのビューのバリエーションが 2 つだけ必要な場合は、さらに 2 つのフレーバーを追加し、それらを 1 つのディメンションに設定し、最初のフレーバーを別のディメンションに設定します。その後、必要な組み合わせを作成します。

android {
    ...
    flavorDimensions "appversion", "appserver"

    productFlavors {
        free {
            applicationId = "com.myapp.free"
            dimension  "appversion"
        }
        paid {
            applicationId = "com.myapp.paid"
            dimension  "appversion"
        }
        server1{
            dimension  "appserver"
        }
        server2{
            dimension  "appserver"
        }
    }
}
于 2016-02-17T23:55:30.907 に答える