我知道我可以使用debugCompile
来为debug build
仅提取dependency
。是否有一个很好的简化方法来执行code initialization
也是必需的?没有依赖关系,其他变体将无法编译。仅在调试版本变体中包含Stetho
回答
您有几个选项。
选项1:包括Stetho所有构建(使用debugCompile
compile
代替),并只用于调试版本在Application
类初始化。
这很容易做到。在你Application
类,检查BuildConfig.DEBUG
像这样:
if (BuildConfig.DEBUG) {
Stetho.initialize(
Stetho.newInitializerBuilder(this)
.enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this))
.build()
);
}
选项2:只包括Stetho建立调试,以及用于调试和发布版本创建不同Application
类。
感谢Gradle,应用程序可以为不同的构建变体提供不同的源集。默认情况下,你必须释放和调试版本的类型,所以您可以有三种不同的源集:
- 调试的代码,你只需要在调试版本
- 发布的代码,你只需要在释放建立
- 主要您在所有想要的代码构建
您的应用程序代码很可能所有目前在main
来源集。您可以简单地在应用程序中的main
文件夹旁边创建一个名为debug
的新文件夹,并对您要为调试版本添加的所有内容进行镜像,即main
文件夹的结构。
在这种情况下,您需要main
源集合中的Application
类,它根本没有引用Stetho。
然后,您需要debug
源设置中的Application
类,它像您平常那样初始化Stetho。
您可以在Stetho sample中看到此设置的示例。具体而言,here's the main Application class和here's the debug Application class。另请注意,他们在每个源集中设置了选择使用哪个应用程序类的清单。
AFAIK,第一种方法不能用于'debugCompile',因为代码将在'main'中,并且相关性不会存在于'main'中 – CommonsWare
你的正确 - 这就是为什么我说“包括Stetho所有bu ilds-“我应该更清楚这意味着使用'compile'而不是'debugCompile'。谢谢! –
我个人更喜欢第二种方法,因为您的stetho代码可能不会在刚刚启用时结束。您可能想要使用dumpapps,网络绑定,并且您不想在生产中发送未经测试/调试代码。 –
检查@Tanis答案。你
也可以使用这样的事情:
添加库仅在调试版本。
dependencies {
debugCompile 'com.facebook.stetho:stetho:1.1.1
}
在应用程序中,你可以做:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
StethoUtils.install(this);
}
}
然后你就可以在调试/发行版本中创建不同的StethoUtils
类。
在src/debug/java/
public class StethoUtils{
public static void install(Application application){
Stetho.initialize(
Stetho.newInitializerBuilder(application)
.enableDumpapp(Stetho.defaultDumperPluginsProvider(application))
.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(application))
.build());
}
}
在src/release/java/
public class StethoUtils{
public static void install(Application application){
// do nothing
}
}
使用Java反射机制可能是一个可圈可点的想法:
private void initStetho() {
if (BuildConfig.DEBUG) {
try {
Class<?> stethoClazz = Class.forName("com.facebook.stetho.Stetho");
Method method = stethoClazz.getMethod("initializeWithDefaults",Context.class);
method.invoke(null, this);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
那么我们就可以调试编译stetho:
debugCompile 'com.facebook.stetho:stetho:1.5.0'
可能不希望捕获所有这些异常或使用字符串加载类(程序包名称可能会更改)。更清洁的解决方案是使用gradle并在需要时注入调试变体。 – Aceofspadez44
我相信反射方法是最简单的方法,并且保证没有Stetho代码在发布版本中,而不用在代码周围编写代码 – for3st
- 1. 仅在调试版本中包含图形?
- 2. 在调试版本中包含资源
- 3. 仅在调试版本中阻止NuGet恢复软件包
- 4. 在库的Mac OS X SDK中包含一个调试版本
- 5. 作曲者:在版本URL中包含版本变量
- 6. ASP.NET MVC绑定 - 仅在调试模式下包含脚本
- 7. Application.Run()在不包含调试器的版本构建中运行方式不同于调试版本
- 8. UIFileSharingEnabled仅适用于调试版本
- 9. 在编译多个版本时,如何将方法调用仅包含在一个操作系统版本中?
- 10. Visual Studio调试版本是否包含任何个人信息?
- 11. 在NDK版本中包含libjpeg
- 12. 在Doxygen中包含POM版本?
- 13. 在requirements.txt中包含python版本?
- 14. 在py2exe版本中包含PYD/DLL
- 15. 在jar版本中包含git commit hash
- 16. 仅在应用程序版本中包含选定的本地化
- 17. 如何在包含lib的文件名中包含版本号?
- 18. REST API版本控制。在新版本中包含什么?
- 19. 如何在调试版本变体中使用库运行应用程序?
- 20. 当SQL包含变量时在pgAdmin中调试SQL
- 21. android proguard在调试版本?
- 22. 我的版本包含AppName.exe.config?
- 23. iOS设置包只出现在调试版本中的项目
- 24. C++调试版本
- 25. 实体框架仅包含条件
- 26. 仅在调试模式下包括类
- 27. 在intellij中调试多个库版本
- 28. 在Rails中调试jQueryUI版本
- 29. 在调试版本中找不到“libsupportjni.so”
- 30. 数据在调试版本中突然变为NULL
它有点复杂,因为您需要在您的应用程序启动时启动stetho并将您的http客户端配置为传输给stetho。您可以通过在调试和发布源文件夹中具有您的类的特定版本来实现这一点,但我不觉得这是理想的,但它可以工作 – njzk2
在'debug'源代码集中关闭袖口,创建一个自定义'Application'类要么扩展'Application'(如果你没有在其他地方扩展它)或扩展你自定义的'Application'(如果你在你的主代码中使用了'Application',请在'android:name'中注册''' 'debug' manifest。在通常情况下使用自定义'Application'的情况下,您可能还需要'tools:replaceNode'属性来告诉'debug'源代码集来替换'main'源代码集中的内容但是,还没有尝试过这种方式, –
CommonsWare