Intereting Posts

Как я могу получить доступ к значению 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 определенным в градиенте, например:

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

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

Другой способ доступа к значениям 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 )

Access 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); 

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

Шаг 1. Создайте новую папку в папке «src» с названием вашего вкуса, im мой случай «этап»,

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

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

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

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

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

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

Примечание: когда вы используете 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 

@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