2015-05-11 28 views
46

我知道我可以使用debugCompile来为debug build仅提取dependency。是否有一个很好的简化方法来执行code initialization也是必需的?没有依赖关系,其他变体将无法编译。仅在调试版本变体中包含Stetho

+0

它有点复杂,因为您需要在您的应用程序启动时启动stetho并将您的http客户端配置为传输给stetho。您可以通过在调试和发布源文件夹中具有您的类的特定版本来实现这一点,但我不觉得这是理想的,但它可以工作 – njzk2

+3

在'debug'源代码集中关闭袖口,创建一个自定义'Application'类要么扩展'Application'(如果你没有在其他地方扩展它)或扩展你自定义的'Application'(如果你在你的主代码中使用了'Application',请在'android:name'中注册''' 'debug' manifest。在通常情况下使用自定义'Application'的情况下,您可能还需要'tools:replaceNode'属性来告诉'debug'源代码集来替换'main'源代码集中的内容但是,还没有尝试过这种方式, – CommonsWare

回答

48

您有几个选项。

选项1:包括Stetho所有构建(使用debugCompilecompile代替),并只用于调试版本在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 classhere's the debug Application class。另请注意,他们在每个源集中设置了选择使用哪个应用程序类的清单。

+3

AFAIK,第一种方法不能用于'debugCompile',因为代码将在'main'中,并且相关性不会存在于'main'中 – CommonsWare

+1

你的正确 - 这就是为什么我说“包括Stetho所有bu ilds-“我应该更清楚这意味着使用'compile'而不是'debugCompile'。谢谢! –

+1

我个人更喜欢第二种方法,因为您的stetho代码可能不会在刚刚启用时结束。您可能想要使用dumpapps,网络绑定,并且您不想在生产中发送未经测试/调试代码。 –

66

检查@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 
    } 
} 
+1

这应该是提供的方法。 –

+0

注意:如果您声明了任何自定义构建类型,您也需要为其创建一个StethoUtils类。例如。 src//java/ – bmul

+1

这意味着您还必须包含OkHttp拦截器代码的调试/发布版本。 – miguel

0

使用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' 
+0

可能不希望捕获所有这些异常或使用字符串加载类(程序包名称可能会更改)。更清洁的解决方案是使用gradle并在需要时注入调试变体。 – Aceofspadez44

+0

我相信反射方法是最简单的方法,并且保证没有Stetho代码在发布版本中,而不用在代码周围编写代码 – for3st

相关问题