web-dev-qa-db-ja.com

デバッグビルドバリアントにのみStethoを含める

debugCompileを使用して、debug builddependencyのみをプルできることを知っています。必要なcode initializationを実行するための適切で効率的な方法はありますか?依存関係がないと、他のバリアントはコンパイルに失敗します。

56
theblang

いくつかのオプションがあります。

オプション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()
    );
}

オプション2:デバッグビルドにはStethoのみを含め、デバッグビルドとリリースビルドには異なるApplicationクラスを作成します。

Gradleのおかげで、アプリケーションはビルドバリアントごとに異なるソースセットを持つことができます。デフォルトでは、リリースおよびデバッグビルドタイプがあるため、3つの異なるソースセットを使用できます。

  • debugデバッグビルドでのみ必要なコード用
  • releaseリリースビルドでのみ必要なコードの場合
  • mainすべてのビルドで必要なコード用

アプリケーションコードは現在、すべてmainソースセットにあります。アプリケーションのdebugフォルダーの隣にmainという名前の新しいフォルダーを作成し、デバッグビルド用に追加するすべてのものについてmainフォルダーの構造をミラーリングできます。

この場合、Stethoをまったく参照しないApplicationソースセットにmainクラスが必要です。

次に、通常のようにStethoを初期化するApplicationソースセットにdebugクラスが必要です。

Stethoサンプル でこのセットアップの例を見ることができます。具体的には、 ここがメインApplicationクラス 、および ここがデバッグApplicationクラス です。また、使用するアプリケーションクラスを選択する各ソースセットにマニフェストを設定することに注意してください。

54
Tanis.7x

@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
   }
}
87

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'
4
ThomsonStan