我知道我可以使用debugCompile
來爲debug build
僅提取dependency
。是否有一個很好的簡化方法來執行code initialization
也是必需的?沒有依賴關係,其他變體將無法編譯。僅在調試版本變體中包含Stetho
回答
您有幾個選項。
選項1:包括Stetho所有構建(使用debugCompile
compile
代替),並只用於調試版本在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 class和here's the debug Application class。另請注意,他們在每個源集中設置了選擇使用哪個應用程序類的清單。
AFAIK,第一種方法不能用於'debugCompile',因爲代碼將在'main'中,並且相關性不會存在於'main'中 – CommonsWare
你的正確 - 這就是爲什麼我說「包括Stetho所有bu ilds-「我應該更清楚這意味着使用'compile'而不是'debugCompile'。謝謝! –
我個人更喜歡第二種方法,因爲您的stetho代碼可能不會在剛剛啓用時結束。您可能想要使用dumpapps,網絡綁定,並且您不想在生產中發送未經測試/調試代碼。 –
檢查@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
}
}
使用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'
可能不希望捕獲所有這些異常或使用字符串加載類(程序包名稱可能會更改)。更清潔的解決方案是使用gradle並在需要時注入調試變體。 – Aceofspadez44
我相信反射方法是最簡單的方法,並且保證沒有Stetho代碼在發佈版本中,而不用在代碼周圍編寫代碼 – for3st
- 1. 僅在調試版本中包含圖形?
- 2. 在調試版本中包含資源
- 3. 僅在調試版本中阻止NuGet恢復軟件包
- 4. 在庫的Mac OS X SDK中包含一個調試版本
- 5. 作曲者:在版本URL中包含版本變量
- 6. ASP.NET MVC綁定 - 僅在調試模式下包含腳本
- 7. Application.Run()在不包含調試器的版本構建中運行方式不同於調試版本
- 8. UIFileSharingEnabled僅適用於調試版本
- 9. 在編譯多個版本時,如何將方法調用僅包含在一個操作系統版本中?
- 10. Visual Studio調試版本是否包含任何個人信息?
- 11. 在NDK版本中包含libjpeg
- 12. 在Doxygen中包含POM版本?
- 13. 在requirements.txt中包含python版本?
- 14. 在py2exe版本中包含PYD/DLL
- 15. 在jar版本中包含git commit hash
- 16. 僅在應用程序版本中包含選定的本地化
- 17. 如何在包含lib的文件名中包含版本號?
- 18. REST API版本控制。在新版本中包含什麼?
- 19. 如何在調試版本變體中使用庫運行應用程序?
- 20. 當SQL包含變量時在pgAdmin中調試SQL
- 21. android proguard在調試版本?
- 22. 我的版本包含AppName.exe.config?
- 23. iOS設置包只出現在調試版本中的項目
- 24. C++調試版本
- 25. 實體框架僅包含條件
- 26. 僅在調試模式下包括類
- 27. 在intellij中調試多個庫版本
- 28. 在Rails中調試jQueryUI版本
- 29. 在調試版本中找不到「libsupportjni.so」
- 30. 數據在調試版本中突然變爲NULL
它有點複雜,因爲您需要在您的應用程序啓動時啓動stetho並將您的http客戶端配置爲傳輸給stetho。您可以通過在調試和發佈源文件夾中具有您的類的特定版本來實現這一點,但我不覺得這是理想的,但它可以工作 – njzk2
在'debug'源代碼集中關閉袖口,創建一個自定義'Application'類要麼擴展'Application'(如果你沒有在其他地方擴展它)或擴展你自定義的'Application'(如果你在你的主代碼中使用了'Application',請在'android:name'中註冊''' 'debug' manifest。在通常情況下使用自定義'Application'的情況下,您可能還需要'tools:replaceNode'屬性來告訴'debug'源代碼集來替換'main'源代碼集中的內容但是,還沒有嘗試過這種方式, –
CommonsWare