3

DebugMyApplicationデバッグ コードがリリース APK に入るのを制限するために、デバッグ ビルドにサブクラスを使用しようとしていますがMyApplication、リリースでは通常のクラスを使用しています。

デバッグ ビルドとリリース ビルドで代替Applicationサブクラスを使用することは可能ですか? 私はもう試した:

  1. 要素の代替定義を使用して、src/debug のルートに AndroidManifest.xml ファイルを定義し<application>ます。Gradle は、メイン マニフェストには X がありますが、ライブラリには Y があり、使用されていないと警告していDebugMyApplicationます。
  2. Application サブクラスの完全修飾名を、デバッグ res ファイルで個別に定義できるリソースとして宣言します<application android:name="@string/xyz"/>が、参照ではなくリテラル パッケージ名として解釈されます。

私のより広い目標の背景については、次のとおりです。

リリース APK には見られない静的なモック Web サービス レスポンスを提供する代替の Dagger モジュールを提供します。アプリケーションのメソッドをサブクラス化getModuleList()し、モジュール リストの宣言を変更するのが最善の策のように思えました。

助けてくれてありがとう!

4

2 に答える 2

3

アプリケーションのオーバーライドに対する答えはありませんが、より広い目標の解決策を提案します:

|-- src
|   +-- debug
|       +-- java
|           +-- mypackage
|               +-- Modules.java
|               +-- MockModule.java
|   +-- main
|       +-- java
|           +-- mypackage
|               +-- MainModule.java
|   +-- release
|       +-- java
|           +-- mypackage
|               +-- Modules.java

src/debug/java/mypackage/Modules.java

public final class Modules {

  public static List<Object> getModules(App application) {
    ArrayList<Object> modules = new ArrayList<Object>();
    modules.add(new MainModule(application));
    modules.add(new MockModule());
    return modules;
  }
}

src/debug/java/mypackage/MockModule.java

@Module(
    overrides = true,
    library = true,
    injects = { MainActivity.class })
public class MockModule {

  @Provides MyType buildMock() {
    return //...
  }
}

src/release/java/mypackage/Modules.java

public final class Modules {

  public static List<Object> getModules(App application) {
    ArrayList<Object> modules = new ArrayList<Object>();
    modules.add(new MainModule(application));
    return modules;
  }
}

src/main/java/mypackage/App.java

public class App extends Application {

  private ObjectGraph graph;

  @Override public void onCreate() {
    super.onCreate();

    graph = ObjectGraph.create(Modules.getModules(this).toArray());
  }

  public void inject(Object object) {
    graph.inject(object);
  }
}

それがあなたのために働くかどうか私に知らせてください。

この手法は、Jake Wharton のAndroid Apps with Daggerプレゼンテーションで紹介されました。

于 2014-02-28T21:30:51.653 に答える