22

いくつかの外部ライブラリを含むプロジェクトを Gradle で構成しようとしています。Gradle を使用すると、ビルド バリアントを使用してメイン アプリケーション用にさまざまな環境構成 (構成ファイル内のクラスを使用) をセットアップできるため、この変数に従ってコードを実行できます。

問題は、ライブラリ プロジェクトで同じことを行うにはどうすればよいかということです。このプロジェクト用にこのライブラリを作成しましたが、シナリオごとに異なるビルド バリアントをセットアップしたいと考えています。

例として: ライブラリでは、デバッグ モードで実行しているときに、すべてのログを出力して、開発中にそれらを確認できるようにします。リリースモードではいけません。

ファイルの構造:

src ----- > debug -> java -> config -> PlayerEnvConfig
            main -> com.mypackagename -> etc...
            release -> java -> config -> PlayerEnvConfig

デバッグ中のコード: パッケージ構成;

/**
 * Environment configuration for Release
*/
public final class PlayerEnvConfig {
    public static final boolean USE_REPORTING = true;
    public static final boolean USE_ANALYTICS = true;
    public static final boolean USE_LOGGING = false;
    public static final boolean USE_DEBUG_LOGGING = false;
    public static final boolean USE_DEBUGING = false;
}

リリース中のコード:

package config;

/**
 * Environment configuration for Release
*/
public final class PlayerEnvConfig {
    public static final boolean USE_REPORTING = true;
    public static final boolean USE_ANALYTICS = true;
    public static final boolean USE_LOGGING = false;
    public static final boolean USE_DEBUG_LOGGING = false;
    public static final boolean USE_DEBUGING = false;
}

問題は、メイン プロジェクトの場合、このビルド タイプを使用してさまざまなシナリオでアプリケーションを異なる方法で構成できることですが、ライブラリ プロジェクトで同じことを行うにはどうすればよいでしょうか?

現時点では、http://tools.android.com/tech-docs/new-build-system/user-guideで読んだことから、ライブラリはテスト中にデバッグモードのみを使用するためです。

何か案は?

ありがとう!

4

6 に答える 6

16

これは、 Googleコードの問題からの@bifmadeiの回答であり、私にとって役立ちます:

Obsolete 1 : 依存プロジェクトでこれを設定してみてください

android {
    publishNonDefault true
    ...
}

廃止 2: gradle 4.10.1以降、 publishNonDefault はデフォルトで true です。したがって、以下の推奨事項を使用してください。

これを使用するプロジェクトにこれを含めます

dependencies {
    releaseCompile project(path: ':theotherproject', configuration: 'release')
    debugCompile project(path: ':theotherproject', configuration: 'debug')
}

ここから取得: https://code.google.com/p/android/issues/detail?id=66805

implementation命令が分離さreleaseCompiledebugCompileて廃止されることに注意してください: https://stackoverflow.com/a/44364851/3379437

更新

前のステップからのアプローチは、引き続きカスタム ビルド構成で使用できます。

implementation project(path: ':theotherproject', configuration: 'staging')
于 2014-09-25T11:24:17.570 に答える
12

構成の何が問題なのかわかりませんが、必要性については別の方法で行います。

gradle ビルド ファイルでは、buildConfigキーワードを使用して、BuildConfig.java生成されたクラスに特定の行を追加できます。

したがって、次のようなことを追加できますbuild.gradle

    release {
        buildConfig "public static final String USE_REPORTING = true;"
    }
    debug {

        buildConfig "public static final String USE_REPORTING = false;"
    }

そして、1つだけ持っていPlayerEnvConfigます

public static final boolean USE_REPORTING = BuildConfig.USE_REPORTING;

またはそれ以上ではなく、クラスPlayerEnvConfigを直接使用します。BuildConfig


編集 更新以来、構文が変更されました:

buildConfigField "<type>", "<name>", "<value>"
于 2013-07-04T12:03:48.540 に答える
0

あなたが言及したように、これはライブラリプロジェクトでは不可能です。

ライブラリ プロジェクトをアプリケーション プロジェクトに変更するだけです。それはうまくいくようです(少なくとも理論的には、私は自分でテストしていません)。

もう 1 つの方法は、アプリケーション プロジェクトでそのクラスをオーバーライドすることです。マージが行われると、アプリケーション プロジェクト クラスが選択され、それらの値が使用可能になります。

于 2013-08-31T04:34:48.590 に答える
0

Scottが指摘するように、これは Gradle の既知の欠点です。回避策として、リフレクションを使用して (ライブラリではなく) アプリからフィールド値を取得するこのメソッドを使用できます。

/**
 * Gets a field from the project's BuildConfig. This is useful when, for example, flavors
 * are used at the project level to set custom fields.
 * @param context       Used to find the correct file
 * @param fieldName     The name of the field-to-access
 * @return              The value of the field, or {@code null} if the field is not found.
 */
public static Object getBuildConfigValue(Context context, String fieldName) {
    try {
        Class<?> clazz = Class.forName(context.getPackageName() + ".BuildConfig");
        Field field = clazz.getField(fieldName);
        return field.get(null);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}

たとえば、フィールドを取得するには、次DEBUGのように呼び出しますActivity

boolean debug = (Boolean) getBuildConfigValue(this, "DEBUG");

また、このソリューションをAOSP Issue Trackerで共有しました。

于 2014-08-27T01:42:56.473 に答える