Подтвердить что ты не робот

Включить Stetho только в варианте сборки отладки

Я знаю, что я могу использовать debugCompile, чтобы вытащить dependency для debug build. Есть ли хороший, оптимизированный способ сделать code initialization, который требуется также? Без зависимостей другие варианты не скомпилируются.

4b9b3361

Ответ 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'