为了限制调试代码进入我的发布 APK,我尝试使用 DebugMyApplication
调试版本的子类,但正常的 MyApplication
发布中的类。
是否可以使用替代品 Application
Debug 与 Release 构建中的子类?我试过:
- 在 src/debug 的根目录中使用
<application>
的替代定义定义一个 AndroidManifest.xml 文件元素。 Gradle 警告我主 list 有 X 但库有 Y 和DebugMyApplication
未使用。 - 将 Application 子类的完全限定名称声明为可以在我的调试 res 文件中单独定义的资源,但是
<application android:name="@string/xyz"/>
被解释为文字包名称而不是引用。
关于我更广泛的目标的一些背景:
提供一个备用 Dagger 模块,该模块提供一些静态模拟 Web 服务响应,这些响应不会在发布的 APK 中找到。子类化我的应用程序的 getModuleList()
方法和更改模块列表声明似乎是最好的选择。
感谢您的帮助!
最佳答案
我没有应用程序覆盖的答案,但我为您的更广泛目标提出了一个解决方案:
|-- 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 中提出。介绍
关于java - 用于在 Android 中调试构建的替代应用程序子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22104862/