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を使用して可能ですか?そうでない場合、どうすればこれを達成できますか?
交換
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
構文を使用してアクセスできるリソース値。これは、コードと同様にマニフェストでも使用できることを意味します。
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 )
注:resValue
を使用すると、誤って文字列リソースファイルによって値が上書きされる可能性があります(たとえば、別の言語用)
マニフェストとJavaコードで使用できる真の定数値を取得するには、manifestPlaceholders
とbuildConfigField
の両方を使用します。
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")
}
次の例のように、マニフェストのbuild.gradleプロパティにアクセスします。
たとえば、build.gradleにプロパティ「applicationId」があり、AndroidManifestでアクセスしたい場合:
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);
@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
別のオプション:別の文字列リソースファイルを使用して、Flavorに依存するすべての値を置き換えます。
ステップ1:私の場合は「stage」というフレーバーの名前で「src」フォルダーに新しいフォルダーを作成します
ステップ2:たとえば、フレーバーに依存するすべてのファイルのリソースファイルを作成します。
ステップ3:別のアイコンも使用しているため、ミップマップフォルダーも表示されます。この質問では、「strings.xml」のみが重要です。これで、すべての重要な文字列リソースを上書きできます。オーバーライドするものだけを含める必要があり、他のすべてはメインの「strings.xml」から使用され、Android Studioに次のように表示されます。
ステップ4:プロジェクトで文字列リソースを使用し、リラックスします。