为啥在将我的 Flutter 应用程序迁移到 Android 嵌入 v2 后没有提供 $applicationName 的值?

Posted

技术标签:

【中文标题】为啥在将我的 Flutter 应用程序迁移到 Android 嵌入 v2 后没有提供 $applicationName 的值?【英文标题】:Why is the value for $applicationName not supplied after migrating my Flutter app to Android embedding v2?为什么在将我的 Flutter 应用程序迁移到 Android 嵌入 v2 后没有提供 $applicationName 的值? 【发布时间】:2021-12-22 01:57:11 【问题描述】:

我试图迁移一个已弃用的颤振应用程序,但在按照 github 上提供的步骤进行操作后,我得到了这个

C:\Users\personal\androidStudioProjects\flash-chat-flutter\android\app\src\main\AndroidManifest.xml:10:9-42 Error:
    Attribute application@name at AndroidManifest.xml:10:9-42 requires a placeholder substitution but no value for <applicationName> is provided.
C:\Users\personal\AndroidStudioProjects\flash-chat-flutter\android\app\src\debug\AndroidManifest.xml Error:
    Validation failed, exiting

【问题讨论】:

你能添加你的 AndroidManifest.xml 文件吗? 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

我遇到了同样的错误:

您需要将此添加到您的 build.gradle (YourFlutterProject/android/app/build.gradle)

buildTypes 
    release 
        manifestPlaceholders = [applicationName: "android.app.Application"]
    

    debug 
        manifestPlaceholders = [applicationName: "android.app.Application"]
    
    build
        manifestPlaceholders = [applicationName: "android.app.Application"]
    

【讨论】:

你不需要这样做;该框架为您完成。事实上,框架需要动态地进行,以便正确处理多索引场景。根据我的回答,您只需要避免覆盖框架提供的值。【参考方案2】:

我也遇到了这个问题。就我而言,这是因为我设置了 manifestPlaceholders 的“通常”方式,通过分配 = (所有示例似乎都这样做):

android/app/build.gradle:

android 
    ⋮
    defaultConfig 
        applicationId "com.example.my_app"
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        // This right here!
        manifestPlaceholders = [someKey: "@string/some_value"]
    
    ⋮

事实证明,multidex support 引入了动态确定应用程序名称的需求,因此清单中的 $applicationName 占位符。

该值由 Flutter Gradle 插件 here 通过 manifestPlaceholders 确定,因此如果您通过重新分配来替换该值,那么您将遇到此问题。解决方法很简单:将您的值添加到带有+= 的现有值中,如下所示:

android 
    ⋮
    defaultConfig 
        applicationId "com.example.my_app"
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        // Fixed now! Note the plus!
        manifestPlaceholders += [someKey: "@string/some_value"]
    
    ⋮

【讨论】:

以上是关于为啥在将我的 Flutter 应用程序迁移到 Android 嵌入 v2 后没有提供 $applicationName 的值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在将应用程序部署到 Heroku 时出现此错误?

为啥迁移到 ARC 后我的应用程序充满了内存泄漏?

为啥我无法将我的代码推送到 BitBucket?

为啥在将 msys gcc 从 9.2 更新到 10.1.0 后我的所有 std 命名空间都损坏了

Flutter 升级到 v1.14.7-pre.83 并迁移到 AndroidX 后只显示白屏

迁移到 M1 Mac 后在 iOS 上运行 Flutter App 时出错