2016-05-21 1 views
5

Я пытаюсь выполнить замену в файле AndroidManifest.xml от андроида расширения build.gradle, но я получаю эту ошибку:Gradle «манифест требует замещения заполнителя» ошибки, но manifestPlaceholders предоставляет значение

AndroidManifest.xml:89:16 Error: 
    Attribute uses-library#com.company.platform.${encoding}@name at AndroidManifest.xml:89:16 requires a placeholder substitution but no value for <encoding> is provided. 
/Users/Company/Desktop/Checkout/android/Project/app/src/main/AndroidManifest.xml:0:0 Error: 
    Validation failed, exiting 
:app:processDebugManifest FAILED 

Это фрагмент файла манифеста:

... 
    </receiver> 
    <uses-library android:name="com.company.platform.${encoding}" /> 
</application> 
... 

И это пропущено из build.gradle:

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 
    defaultConfig { 
     applicationId "com.company.app" 
     minSdkVersion 23 
     targetSdkVersion 23 
     versionName cityVersion 
     setProperty("archivesBaseName", "City_$versionName") 
     manifestPlaceholders = [encoding: "some value"] 
     manifestPlaceholders = [version: cityVersion] 
    } 

Я также попытался добавить manifestPlaceholders в buildTypes т.е.

buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     manifestPlaceholders = [encoding: deviceEncoding] 
     manifestPlaceholders = [version: cityIDVersion] 
    } 
    debug { 
     manifestPlaceholders = [encoding: deviceEncoding] 
     manifestPlaceholders = [version: cityIDVersion] 
    } 

}

Но я все еще получаю ту же ошибку.

Зачем возникает ошибка в отношении необходимости замены замещающего, когда он предусмотрен в манифесте?

ответ

18

Вам нужно просто добавить в массив. Вы заменяете его. Сделайте это:

manifestPlaceholders = [encoding: "some value", version: cityVersion] 

Объявив manifestPlaceholders дважды за тот же вкус/построить тип, ваши заменяют предыдущую. После того, как предыдущий был заменен, ваша сборка завершилась неудачно, потому что свойство больше не существует.

+0

Большое вам спасибо! –

+0

правильный ответ для меня – floatingmuseum

1

Вам необходимо добавить applicationId placeholder к графе приложения. Это происходит с интеграцией Firebase, после обновления до 2.2.0 Gradle-альфа1

android { 
    ... 
    defaultConfig { 
     applicationId "com.example.my.app" 
     ... 
    } 
} 

См: Unable to get provider com.google.firebase.provider.FirebaseInitProvider

+0

Его уже там. – Gruntcakes

+0

А, действительно, извините ... Я уставился на эту проблему.У меня его не было, что решило сообщение об ошибке, но я все еще не получаю APK из Android Studio ... только, теперь также нет ошибок/предупреждений –

0

я оставил $ {} символы вокруг моего значения:

<meta-data android:name="net.example" android:value="${XXXX}" /> 
+0

Что вы пытаетесь сказать? Я не получаю это ... – Sakiboy

+0

Я добавил значение, не обернув его $ {...} –

0

Для тех из вас работает в/проблемы проявляются нагнетательных манифеста о слиянии из-за manifestPlaceholders определены в библиотеках манифеста, проблема исходит от факт, что вам нужно определить значение для manifestPlaceholders в манифесте ваших библиотек. Это значение не становится переопределенным, когда вы вводите свою реальную ценность в приложение-потребитель. Чтобы обойти это, вы должны определить только те значения manifestPlaceholders для debug, которые строятся в вашей библиотеке.

Как так:

android.buildTypes.debug.manifestPlaceholders = [ 
    authScheme: 'clientAppReplaces', authHost: 'clientAppReplaces' 
] 

Делая это, вы сможете построить свою библиотеку. В то же время предоставляя клиентскому приложению правильные значения для manifestPlaceholders. Разрешить вашей библиотеке делать все, что тяжелый подъем должен. Это возможно, потому что библиотеки строятся как версии релизов (если не указано иное).

Client приложение build.gradle Пример:

defaultConfig { 
    applicationId "com.app.manifestPlaceholders" 
    minSdkVersion 16 
    targetSdkVersion 27 
    versionCode project.ext.versionCode 
    versionName project.ext.versionName 

    manifestPlaceholders = [authScheme: 'customSchemeValue', authHost: 'hostValue'] 
}