【问题标题】:Alternate Application subclass for debug build in AndroidAndroid 中用于调试构建的备用应用程序子类
【发布时间】:2014-02-28 20:08:18
【问题描述】:

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

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

  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() 方法并更改模块列表声明似乎是最好的选择。

感谢您的帮助!

【问题讨论】:

    标签: java android android-gradle-plugin dagger


    【解决方案1】:

    我没有覆盖应用程序的答案,但我为您的更广泛目标提出了一个解决方案:

    |-- 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 演示文稿中介绍了这项技术

    【讨论】:

    • 太棒了!这只是我认为我可能需要的那种重定向。这很好用。谢谢。
    【解决方案2】:

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

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

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

    如果您的主源集中已经有一个 Application 子类 MyApplication,您可以让 MyDebugApplication 扩展 MyApplication。

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 2012-07-05
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多