web-dev-qa-db-ja.com

AndroidManifest.xmlファイルのBuildConfig値にアクセスするにはどうすればよいですか?

AndroidManifest.xmlからBuildConfig値にアクセスすることは可能ですか?

私のbuild.gradleファイルには、次のものがあります。

defaultConfig {
    applicationId "com.compagny.product"
    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"

    // Facebook app id
    buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
}

FACEBOOK_APP_IDは私のgradle.propertiesファイルで定義されています:

# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX

アプリでFacebook Connectを使用するには、次の行をAndroidManifest.xmlに追加する必要があります。

<meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/applicationId"/> 

@string/applicationIdをgradleで定義されたBuildConfigフィールドFACEBOOK_APP_IDで次のように置き換えたい:

<meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="FACEBOOK_APP_ID"/> 

BuildConfigを使用して可能ですか?そうでない場合、どうすればこれを達成できますか?

123
anthony

交換

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

その後、 プロジェクトの再構築 (Android Studio-> Build-> Rebuild Project)。

2つのコマンドは両方とも生成値を生成します-最初の場合はJava定数、2番目の場合はAndroidリソースで構成されますが、2番目のメソッドはstring@string/FACEBOOK_APP_ID構文を使用してアクセスできるリソース値。これは、コードと同様にマニフェストでも使用できることを意味します。

170
stkent

AndroidManifest.xmlからGradle Build Config値にアクセスする別の方法は、次のようなプレースホルダーを使用することです。

Android {
    defaultConfig {
        manifestPlaceholders = [ facebookAppId:"someId..."]
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            manifestPlaceholders = [ facebookAppId:"anotherId..." ]
        }
    }
}

そして、あなたのマニフェストで:

<meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="${facebookAppId}"/> 

詳細はこちらをご覧ください: https://developer.Android.com/studio/build/manifest-build-variables.html

(参照用の古いリンク: http://tools.Android.com/tech-docs/new-build-system/user-guide/manifest-merger

79
GregoryK

注:resValueを使用すると、誤って文字列リソースファイルによって値が上書きされる可能性があります(たとえば、別の言語用)

マニフェストとJavaコードで使用できる真の定数値を取得するには、manifestPlaceholdersbuildConfigFieldの両方を使用します。

Android {
    defaultConfig {
        def addConstant = {constantName, constantValue ->
            manifestPlaceholders += [ (constantName):constantValue]
            buildConfigField "String", "${constantName}", "\"${constantValue}\""
        }

        addConstant("FACEBOOK_APP_ID", "xxxxx")
    }

マニフェストファイルでのアクセス:

<meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="${FACEBOOK_APP_ID}"/>

javaから:

BuildConfig.FACEBOOK_APP_ID

定数値がbuildType固有である必要がある場合、ヘルパーaddConstantを微調整する必要があります(groovyクロージャセマンティクスを使用するには)。

buildTypes {
    def addConstantTo = {target, constantName, constantValue ->
        target.manifestPlaceholders += [ (constantName):constantValue]
        target.buildConfigField "String", "${constantName}", "\"${constantValue}\""
    }
    debug {
        addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-debug")
    }
    release {
        addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-release")
    }
31
TmTron

次の例のように、マニフェストのbuild.gradleプロパティにアクセスします。

たとえば、build.gradleにプロパティ「applicationId」があり、AndroidManifestでアクセスしたい場合:

enter image description here

AndroidManifestの「applicationId」にアクセスします。

<receiver
        Android:name="com.google.Android.gms.gcm.GcmReceiver"
        Android:exported="true"
        Android:permission="com.google.Android.c2dm.permission.SEND">
        <intent-filter>
            <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
            <category Android:name="${applicationId}" />
        </intent-filter>
    </receiver>

同様に、他の定数の文字列リソースを作成し、コードファイルで次のように簡単にアクセスできます。

context.getString(R.string.GCM_SENDER_ID);
6
Vinay

@stkentは良いですが、後でプロジェクトを再構築する必要があることを追加するのを忘れています

交換

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

それから

Android Studio -> Build -> Rebuild Project

これにより、Androidを介してアクセス可能な文字列リソースを生成できます

R.string.FACEBOOK_APP_ID
2
F.O.O

別のオプション:別の文字列リソースファイルを使用して、Flavorに依存するすべての値を置き換えます。

ステップ1:私の場合は「stage」というフレーバーの名前で「src」フォルダーに新しいフォルダーを作成します

ステップ2:たとえば、フレーバーに依存するすべてのファイルのリソースファイルを作成します。

enter image description here

ステップ3:別のアイコンも使用しているため、ミップマップフォルダーも表示されます。この質問では、「strings.xml」のみが重要です。これで、すべての重要な文字列リソースを上書きできます。オーバーライドするものだけを含める必要があり、他のすべてはメインの「strings.xml」から使用され、Android St​​udioに次のように表示されます。

enter image description here

ステップ4:プロジェクトで文字列リソースを使用し、リラックスします。

enter image description here

2
Björn Kechel