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?
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.
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 )
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")
}
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:
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);
@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
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:
É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:
Étape 4: Utilisez les ressources de chaîne dans votre projet et détendez-vous: