3

为了限制调试代码进入我的发布 APK,我尝试使用DebugMyApplication子类进行调试构建,但MyApplication在发布中使用普通类。

Application是否可以在 Debug 与 Release 版本中使用备用子类?我试过了:

  1. 在 src/debug 的根目录中定义一个 AndroidManifest.xml 文件,其中包含<application>元素的替代定义。Gradle 警告我 Main manifest 有 X 但 library 有 Y 并且DebugMyApplication未使用。
  2. 将 Application 子类的完全限定名称声明为可以在我的调试 res 文件中单独定义的资源,但<application android:name="@string/xyz"/>被解释为文字包名称而不是引用。

有关我更广泛目标的一些背景信息:

提供一个备用 Dagger 模块,该模块提供一些在发布 APK 中找不到的静态模拟 Web 服务响应。子类化我的应用程序的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 在他的带有 Dagger 的 Android 应用程序演示文稿中介绍了这种技术

于 2014-02-28T21:30:51.653 回答
1

您可以通过创建 MyDebugApplication 类并将其添加到 DEBUG 源文件夹并设置为您的调试类型添加 Application 子类

<application
    android:name="com.example.MyDebugApplication"
    tools:replace="android:name">
</application>

作为 DEBUG 源文件夹中 AndroidManifest.xml 文件中的应用程序标记。

如果您的主源集中已经有一个应用程序子类 MyApplication,您可以使 MyDebugApplication 扩展 MyApplication。

于 2016-03-04T02:57:38.323 回答