2015-05-11 12 views
46

'u dahil et debugCompile'u dependency'u debug build için kullanabileceğimi biliyorum. Gerekir code initialization yapmak için iyi, akıcı bir yolu var mı? Bağımlılıklar olmadan diğer varyantlar derlenemez.Stetho yalnızca hata ayıklama oluşturma varyantında

+0

Bu biraz karmaşıktır çünkü uygulamanız başladığında stetho başlatmanız/başlatmanız ve http istemcinizi stetho'ya iletmek üzere yapılandırmanız gerekir. Bunu, sınıflarınızın belirli sürümlerini hata ayıklama ve serbest bırakma kaynak klasörlerinde yaparak yapabilirsiniz, bu ideali bulamıyorum, ancak – njzk2

+3

çalışır. Manşondan "debug" kaynak kümesinde, özel bir "Uygulama" sınıfı oluşturun. ya da "Uygulamayı" (eğer başka bir yerde genişletmiyorsanız) veya özel "Uygulamanızı" (eğer ana kodunuzda kullanıyorsanız) genişletir. "Uygulamanızın" android: name: ''' 'debug' tezahürüdür.Gelişmiş bir 'Uygulama' normalde kullandığınız durumda, muhtemelen 'main' resourceet'inde bulunan 'debug' sourceetini anlatmak için bir 'tools: replaceNode' özniteliğine ihtiyacınız olacaktır. Yine de bunu denemedim: – CommonsWare

cevap

48

Birkaç seçeneğiniz var.

Seçenek 1: Tüm ayıklama kurar için Application sınıfta başlatmak sadece ve (compile yerine debugCompile kullanarak) oluşturur için Stetho ekleyin.

Bunu yapmak oldukça kolaydır. ayıklama kurar için Sadece Stetho içerir ve hata ayıklama ve sürüm yapılarında için farklı Application sınıfları oluşturmak:

if (BuildConfig.DEBUG) { 
    Stetho.initialize(
      Stetho.newInitializerBuilder(this) 
        .enableDumpapp(Stetho.defaultDumperPluginsProvider(this)) 
        .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this)) 
        .build() 
    ); 
} 

Seçenek 2: Application sınıfında, şöyle BuildConfig.DEBUG kontrol edin.

Gradle sayesinde, uygulamalar farklı derleme varyantları için farklı kaynak kümelerine sahip olabilir. Eğer üç farklı kaynak setine sahip olabilir Varsayılan olarak, sen bırakma ve hata ayıklama oluşturma türleri vardır:

  • hata ayıklama yalnızca hata ayıklama istediğiniz kodu için sadece sürümde istediğiniz kodu için
  • salınımını kurar kurar tüm istediğiniz kodu için
  • ana

Başvurunuz koduolası tüm şu anda inşakaynak kümesi. Uygulamanızdaki main klasörünün yanındaki debug adlı yeni bir klasör oluşturabilir ve hata ayıklama yapıları için eklemek istediğiniz her şey için main klasörünüzün yapısını yansıtabilirsiniz.

Bu durumda, main kaynak kümenizde Stetho'ya hiç başvurmayan bir Application sınıfı olmasını istiyorsunuz.

Ardından, normalde yaptığınız gibi Stetho'yu başlatan debug kaynak kümenizde bir Application sınıfı olmasını istiyorsunuz.

Bu kurulumun bir örneğini Stetho sample'da görebilirsiniz. Spesifik olarak, here's the main Application class ve here's the debug Application class. Ayrıca, hangi uygulama sınıfının kullanılacağını seçen her kaynak kümesinde bildirimler oluşturduğunu unutmayın.

+3

AFAIK, ilk yaklaşım 'debugCompile' ile çalışmayacaktır, çünkü bu kod 'main' içinde olacaktır ve bağımlılık' main' içinde olmayacaktır. – CommonsWare

+1

doğru-bu yüzden "Bu için Stetho dahil ilds- "Bunun debugCompile" yerine "derlemek" anlamına geldiği daha açık olmalıydım. Teşekkürler! –

+1

Şahsen ikinci yöntemi tercih ederim çünkü stetho kodunuz sonlandırılmamış olabilir. Dumpapps, ağ bağlantısı kullanmak isteyebilirsiniz ve üretimde denenmemiş/hata ayıklama kodunu göndermek istemezsiniz. –

66

@Tanis yanıtını kontrol edin.

sadece ayıklama sürümü üzerine kütüphane ekleyin:

Ayrıca böyle bir şey kullanabilirsiniz.

dependencies { 
    debugCompile 'com.facebook.stetho:stetho:1.1.1  
} 

sizin Başvurusunda yapabileceğiniz:
public class ExampleApplication extends Application { 

    @Override public void onCreate() { 
    super.onCreate(); 
    StethoUtils.install(this); 
    } 
} 

Sonra hata ayıklama/release sürümünde farklı StethoUtils sınıf oluşturabilirsiniz. src/release/java/

public class StethoUtils{ 

    public static void install(Application application){ 
     // do nothing 
    } 
} 
+1

Bu, önerilen yaklaşım olmalıdır. –

+0

Not: Herhangi bir özel derleme türü bildirirseniz, bunun için bir StethoUtils sınıfı oluşturmanız gerekir. Örneğin. src//java/ – bmul

+1

Bu, OkHttp önleme kodunuzun hata ayıklama/yayın sürümlerini de eklemeniz gerektiği anlamına gelir. – miguel

0

yılında 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()); 

    } 
} 

yılında

bir perferct fikir olabilir java yansıması kullanma:

:

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(); 
       } 
      } 
     } 

sonra stetho derlemek debug

+0

Muhtemelen tüm bu istisnaları yakalamak veya bir dizeyle bir sınıf yüklemek istemiyorum (paket adı değişebilir). Çok daha temiz çözüm, gerektiğinde gradiyeyi kullanmak ve bir debug varyantı enjekte etmektir. – Aceofspadez44

+0

Yansıma yönteminin en kolay olanı olduğuna inanıyorum ve kodun etrafında kod yazmadan bir Stetho kodunun sürüm oluşturmada bulunmadığını garanti ediyorum – for3st