仅在调试版本变体中包含Stetho

the*_*ang 56 android android-studio stetho

我知道,我可以使用debugCompile只在拉dependency了debug build.是否有一个好的,简化的方法来做到这code initialization一点也是必需的?如果没有依赖关系,其他变体将无法编译.

Gab*_*tti 91

检查@Tanis的答案.

你也可以使用这样的东西:

仅在调试版本上添加库.

dependencies {
   debugCompile 'com.facebook.stetho:stetho:1.1.1      
 }
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中,您可以:

public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    StethoUtils.install(this);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以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());

   }
}
Run Code Online (Sandbox Code Playgroud)

在 src/release/java/

public class StethoUtils{

   public static void install(Application application){
      // do nothing
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 这意味着您还必须包含OkHttp拦截器代码的调试/发布版本. (4认同)

Tan*_*.7x 54

你有几个选择.

选项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()
    );
}
Run Code Online (Sandbox Code Playgroud)

选项2:仅包括用于调试版本的Stetho,并Application为调试和发布版本创建不同的类.

感谢Gradle,应用程序可以为不同的构建变体提供不同的源集.默认情况下,您具有发布和调试版本类型,因此您可以拥有三个不同的源集:

  • 调试您在调试版本中只需要的代码
  • 发布您只想在发布版本中使用的代码
  • 主要用于所有构建中的代码

您的应用程序代码可能当前都在main源集中.您只需在应用程序中创建一个名为文件夹debug旁边的新文件main夹,并镜像main文件夹的结构,以便为调试版本添加所有内容.

在这种情况下,您希望源集中的Application类main根本不引用Stetho.

然后你想要一个源集中的Application类,debug像往常一样初始化Stetho.

您可以在Stetho示例中看到此设置的示例.具体来说,这是主要的Application类,这里是调试Application类.另请注意,他们在每个源集中设置了清单,用于选择要使用的Application类.

  • AFAIK,第一种方法不适用于`debugCompile`,因为该代码将在`main`中,并且依赖将不会存在于`main`中. (3认同)

小智 6

使用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();
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

然后我们可以调试编译stetho:

debugCompile 'com.facebook.stetho:stetho:1.5.0'
Run Code Online (Sandbox Code Playgroud)