【问题标题】:Gradle "manifest requires a placeholder substitution" error but manifestPlaceholders supplies a valueGradle“清单需要占位符替换”错误,但 manifestPlaceholders 提供了一个值
【发布时间】:2016-09-18 23:37:20
【问题描述】:

我正在尝试在 build.gradle android 扩展的 AndroidManifest.xml 文件中执行替换,但出现此错误:

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

这是清单文件的 sn-p:

...
     </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]
    }

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

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

}

但我仍然遇到同样的错误。

当 manifestPlaceholders 中提供了占位符替换时,为什么会出现需要替换占位符的错误?

【问题讨论】:

    标签: android gradle android-gradle-plugin


    【解决方案1】:

    你只需要添加到数组中。你正在替换它。这样做:

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

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

    【讨论】:

    • 非常感谢!
    • @jesobremonte:先生,我们把哪一部分放在了上面?
    • 根据您的需要在 defaultConfig {..} 或单个 productFlavors { flavorName{ .. } } 中。
    • @jesobremonte:先生,我们必须在编码和版本变量中放入什么值先生请告诉我?
    • 这真的取决于您在构建中需要的任何值,我无法回答。以上只是一个示例,您需要应用您需要设置的内容。请参阅此文档以了解如何使用它:developer.android.com/studio/build/manifest-build-variables
    【解决方案2】:

    对于那些由于库清单中定义的manifestPlaceholders 而遇到清单合并/清单注入问题的人,问题来自于您需要在库清单中为manifestPlaceholders 定义一个值。当您在消费应用程序中注入您的真正价值时,该价值不会被覆盖。为了解决这个问题,您应该只在您的库中为 debug 构建定义那些 manifestPlaceholders 值。

    像这样:

    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']
    }
    

    【讨论】:

    • 伙计,我希望这能奏效,android 决定解决下一个错误。
    • 我试过了,我认为它有效,不知道为什么你也被否决了。不过,我还有很多问题要解决。
    【解决方案3】:

    这个

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

    应该是这样的

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

    【讨论】:

      【解决方案4】:

      您需要将 applicationId 占位符添加到应用程序 gradle。更新到 Gradle 2.2.0-alpha1 后,集成 Firebase 会发生这种情况

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

      见:Unable to get provider com.google.firebase.provider.FirebaseInitProvider

      【讨论】:

      • 啊,确实,对不起...我对这个问题视而不见。我没有它,它解决了错误消息,但我仍然没有从 Android Studio 中获得任何 APK ......只有,现在也没有错误/警告
      【解决方案5】:

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

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

      【讨论】:

      • 我添加了值而不用 ${ ... } 包装它
      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 2018-10-23
      • 1970-01-01
      • 2018-10-14
      • 2023-01-01
      相关资源
      最近更新 更多