web-dev-qa-db-fra.com

Comment accéder à une valeur BuildConfig dans mon fichier AndroidManifest.xml?

Est-il possible d'accéder à une valeur BuildConfig à partir de AndroidManifest.xml?

Dans mon fichier build.gradle, j'ai:

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 est défini dans mes fichiers gradle.properties:

# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX

Pour utiliser Facebook Connect dans mon application, je dois ajouter cette ligne à mon fichier AndroidManifest.xml:

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

Je veux remplacer @string/applicationId par le champ BuildConfig FACEBOOK_APP_ID défini dans gradle, comme ceci:

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

Est-ce possible d'utiliser BuildConfig? Si non, comment puis-je y parvenir?

123
anthony

Remplacer

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

avec

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

then reconstruisez votre projet (Android Studio -> Construire -> Reconstruire le projet).

Les deux commandes produisent toutes les deux des valeurs générées - composées de Java dans le premier cas et de Android dans la deuxième - lors de la génération du projet, mais la deuxième méthode générera une valeur de ressource string accessible à l’aide de la commande @string/FACEBOOK_APP_ID syntaxe. Cela signifie qu'il peut être utilisé dans le manifeste aussi bien que dans le code.

170
stkent

Un autre moyen d'accéder aux valeurs Gradle Build Config à partir de votre fichier AndroidManifest.xml consiste à utiliser des espaces réservés comme ceci:

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

et ensuite dans votre manifeste:

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

Voir plus de détails ici: https://developer.Android.com/studio/build/manifest-build-variables.html

(Ancien lien juste pour référence: http://tools.Android.com/tech-docs/new-build-system/user-guide/manifest-merger )

79
GregoryK

remarque: lorsque vous utilisez resValue, la valeur peut être remplacée par inadvertance par le fichier de ressources strings (par exemple, pour une autre langue).

Pour obtenir une vraie valeur constante que vous pouvez utiliser dans le manifeste et dans le code Java, utilisez à la fois manifestPlaceholders et buildConfigField: p. Ex.

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

        addConstant("FACEBOOK_APP_ID", "xxxxx")
    }

accès dans le fichier manifeste:

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

de Java:

BuildConfig.FACEBOOK_APP_ID

Si la valeur constante doit être spécifique à buildType, l'assistant addConstant doit être peaufiné (pour fonctionner avec une sémantique de fermeture groovy), par exemple,

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

Accédez aux propriétés build.gradle de votre manifeste comme dans l'exemple suivant:

Par exemple, vous avez une propriété "applicationId" dans votre build.gradle et vous souhaitez y accéder dans votre AndroidManifest:

enter image description here

Accédez à "applicationId" dans AndroidManifest:

<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>

De même, nous pouvons créer des ressources de chaîne pour d'autres constantes et y accéder dans des fichiers de code aussi simples que:

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

@stkent c'est bien mais oublie d'ajouter qu'il faut reconstruire votre projet après coup

Remplacer

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

avec

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

ensuite

Android Studio -> Build -> Rebuild Project

Ceci permettra à Android de générer la ressource de chaîne accessible via

R.string.FACEBOOK_APP_ID
2
F.O.O

Une autre option: utiliser un fichier de ressources de chaîne différent pour remplacer toutes les valeurs dépendantes de la saveur:

Étape 1: Créez un nouveau dossier dans le dossier "src" avec le nom de votre saveur, im my case "stage"

Étape 2: Créez des fichiers de ressources pour tous les fichiers dépendants de la variante, par exemple:

enter image description here

Étape 3: J'utilise également différentes icônes, de sorte que vous voyez également les dossiers mipmap. Pour cette requête, seul le "strings.xml" est important. Vous pouvez maintenant écraser toutes les ressources de chaîne importantes. Vous devez uniquement inclure ceux que vous souhaitez remplacer. Tous les autres seront utilisés à partir du "strings.xml" principal. Ils apparaîtront dans Android Studio comme ceci:

enter image description here

Étape 4: Utilisez les ressources de chaîne dans votre projet et détendez-vous:

enter image description here

2
Björn Kechel