Gradle“manifest需要占位符替换”错误,但manifestPlaceholders提供了一个值

时间:2016-05-21 21:19:20

标签: android gradle android-gradle

我正在尝试从build.gradle android扩展程序在AndroidManifest.xml文件中执行替换,但是收到此错误:

cast

这是清单文件的片段:

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

这是一个剪辑build.gradle:

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

我也尝试在buildTypes中添加manifestPlaceholders,即

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中提供占位符替换时需要占位符替换?

5 个答案:

答案 0 :(得分:27)

您只需添加到数组即可。你正在取代它。这样做:

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

通过为相同的flavor / build类型声明manifestPlaceholders两次,您将替换前一个。在替换上一个之后,您的构建失败,因为该属性不再存在。

答案 1 :(得分:1)

这个

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

应该是这样

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

答案 2 :(得分:0)

您需要将applicationId占位符添加到应用程序gradle。在更新到Gradle 2.2.0-alpha1

之后,Firebase的集成会发生这种情况
android {
    ...
    defaultConfig {
        applicationId "com.example.my.app"
        ...
    }
}

请参阅:Unable to get provider com.google.firebase.provider.FirebaseInitProvider

答案 3 :(得分:0)

我在我的值周围留下了$ {}符号:

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

答案 4 :(得分:0)

对于那些由于库清单中定义的manifestPlaceholders而遇到清单合并/清单注入问题的人,问题来自于您需要为manifestPlaceholders中的manifestPlaceholders定义一个值你的图书馆清单。当您在消费应用程序中注入实际值时,该值不会被覆盖。要解决此问题,您应该只为库中的debug版本定义android.buildTypes.debug.manifestPlaceholders = [ authScheme: 'clientAppReplaces', authHost: 'clientAppReplaces' ] 个值。

像这样:

manifestPlaceholders

通过这样做,您将能够构建您的库。同时让客户端应用程序为build.gradle提供正确的值。允许你的图书馆做所有那些繁重的工作。这是可能的,因为库构建为发布版本(除非另有定义)。

客户端应用defaultConfig { applicationId "com.app.manifestPlaceholders" minSdkVersion 16 targetSdkVersion 27 versionCode project.ext.versionCode versionName project.ext.versionName manifestPlaceholders = [authScheme: 'customSchemeValue', authHost: 'hostValue'] } 示例:

let currentRow = $(event.target)[0].parentElement
let data = $(currentRow).data('id')