Как я могу получить доступ к значению BuildConfig в моем файле AndroidManifest.xml?

Можно ли получить доступ к значению BuildConfig из AndroidManifest.xml?

В моем файле 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 в своем приложении, я должен добавить эту строку в свой AndroidManifest.xml:

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

Я хочу заменить @string/applicationId на поле BuildConfig FACEBOOK_APP_ID, определенное в gradle, например:

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

Возможно ли это с помощью BuildConfig? Если нет, как я могу это достичь?

Ответ 1

Заменить

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

с

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

затем перестроить проект (Android Studio → Build → Rebuild Project).

Обе команды генерируют сгенерированные значения - состоящие из констант Java в первом случае и ресурсы Android во втором - во время сборки проекта, но второй метод генерирует значение ресурса string, к которому можно получить доступ, используя @string/FACEBOOK_APP_ID. Это означает, что он может использоваться как в манифесте, так и в коде.

Ответ 2

Другой способ получить доступ к Gradle значениям Build Config из вашего AndroidManifest.xml осуществляется с помощью заполнителей следующим образом:

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)

Ответ 3

note: при использовании 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

Если постоянное значение должно быть сконфигурировано по типу, вспомогательный addConstant должен быть изменен (для работы с семантикой семантического закрытия), например,

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")
    }

Ответ 4

Доступ к свойствам build.gradle в вашем манифесте, как показано в следующем примере:

Например, у вас есть свойство "applicationId" в вашем файле build.gradle, и вы хотите получить доступ к этому в вашем AndroidManifest:

введите описание изображения здесь

Доступ к "applicationId" в 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>

Аналогично, мы можем создавать строковые ресурсы для других констант и обращаться к ним в файлах кода так же просто, как:

context.getString(R.string.GCM_SENDER_ID);

Ответ 5

Другая опция: используйте другой файл строковых ресурсов, чтобы заменить все зависящие от Flavor значения:

Шаг 1: Создайте новую папку в папке "src" с именем вашего аромата, im my case "stage"

Шаг 2: Создавать файлы ресурсов для всех файлов, которые зависят от вкуса например:

введите описание изображения здесь

Шаг 3: Я также использую разные значки, поэтому вы также видите папки mipmap. Для этого важны только "strings.xml". Теперь вы можете перезаписать все важные строковые ресурсы. Вам нужно включить только те, которые вы хотите переопределить, все остальные будут использоваться из основного "strings.xml", он появится в Android Studio следующим образом:

введите описание изображения здесь

Шаг 4: Используйте строковые ресурсы в вашем проекте и расслабьтесь:

введите описание изображения здесь

Ответ 6

@stkent хорош, но забывает добавить, что вам нужно перестроить свой проект впоследствии

Заменить

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

с

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

затем

Android Studio -> Build -> Rebuild Project

Это позволит андроиду генерировать строковый ресурс, доступный через

R.string.FACEBOOK_APP_ID