2015-05-11 59 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

相關問題