Я знаю, что я могу использовать debugCompile
, чтобы вытащить dependency
для debug build
. Есть ли хороший, оптимизированный способ сделать code initialization
, который требуется также? Без зависимостей другие варианты не скомпилируются.
Включить Stetho только в варианте сборки отладки
Ответ 1
У вас есть несколько вариантов.
Вариант 1: Включить Stetho для всех сборок (используя compile
вместо debugCompile
) и инициализировать его только в классе 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
в вашем исходном наборе main
, который вообще не ссылается на Stetho.
Затем вам нужен класс Application
в вашем исходном наборе debug
, который инициализирует Stetho, как обычно.
Вы можете увидеть пример этой настройки в примере Stetho. В частности, здесь основной класс приложения, а здесь отлаживается класс приложений. Также обратите внимание, что они настраивают манифесты в каждом наборе источников, который выбирает, какой класс приложения использовать.
Ответ 2
Проверьте ответ @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
в версии debug/release.
В 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
}
}
Ответ 3
Использование 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'