欢迎光临
我们一直在努力

如何解决Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported

在进行AI模型边缘侧部署(如使用TensorFlow Lite或PyTorch Mobile)时,我们通常需要使用最新的Android Gradle Plugin (AGP) 版本来确保依赖兼容性和构建效率。当项目升级到AGP 7.0及以上版本时,开发者经常会遇到以下构建错误:


1
Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported

这个错误标志着AGP对项目包名(Package Name)和应用命名空间(Namespace)管理方式的重大改变。解决这个问题是确保AI模型能够成功集成到Android应用中的关键前提。

1. 错误根源分析:AGP 7.0+的命名空间管理

在AGP 7.0之前,Android应用的 Java/Kotlin 命名空间(即代码中的 package 声明)是通过 AndroidManifest.xml 根标签中的 package=”…” 属性来设置的。

然而,这种做法在大型多模块项目中容易引起混淆,因为它将代码命名空间、R资源生成命名空间和实际的应用ID (Application ID) 混为一谈。AGP 7.0将这三者明确分离:

  1. 应用ID (Application ID): 用于Google Play Store识别应用,定义在 build.gradledefaultConfig 块中。
  2. 命名空间 (Namespace): 定义生成的 R 类和代码包的根路径,现在必须定义在 build.gradle 文件中。
  3. Manifest文件: package 属性被废弃并移除,仅用于 XML 声明。

因此,AGP 7.0及更高版本不再允许通过 AndroidManifest.xml 设置命名空间,并强制要求将其迁移到模块级别的 build.gradle 文件中。

2. 解决方案:迁移命名空间配置

解决此问题只需要两个步骤:从 AndroidManifest.xml 中移除废弃的属性,并在 build.gradle 中添加新的 namespace 声明。

步骤一:修改 AndroidManifest.xml

找到你的项目或模块的 AndroidManifest.xml 文件,并移除根 标签中的 package 属性。

旧 Manifest (导致错误):


1
2
3
4
5
6
7
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mldeploymentapp">  <!-- 移除此行! -->

    <application
        ...
    </application>
</manifest>

新 Manifest (正确):


1
2
3
4
5
6
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        ...
    </application>
</manifest>

步骤二:配置 build.gradle (模块级别)

打开模块级别的 build.gradle 文件(例如 app/build.gradle),在 android { … } 块中显式添加 namespace 属性,其值应为原先在 AndroidManifest.xml 中设置的包名。

旧 build.gradle (缺少 namespace):


1
2
3
4
5
6
7
8
9
10
11
android {
    compileSdk 33

    defaultConfig {
        applicationId "com.example.mldeploymentapp"
        minSdk 24
        targetSdk 33
        // ...
    }
    // ...
}

新 build.gradle (添加 namespace):


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
    compileSdk 33

    // 必须添加新的 namespace 属性
    namespace 'com.example.mldeploymentapp'

    defaultConfig {
        // applicationId 保持不变
        applicationId "com.example.mldeploymentapp"
        minSdk 24
        targetSdk 33
        // ...
    }
    // ...
}

注意: 如果你的项目是库模块(Library Module),则只需要设置 namespace。如果它是应用模块(Application Module),你需要确保 namespacedefaultConfig 中的 applicationId 保持一致,除非你有意区分这两者。

3. 重新同步和部署

完成以上修改后,执行 Gradle 同步 (Sync Project with Gradle Files)。如果配置正确,此前的构建错误将会消失,你就可以继续专注于 AI 模型集成和部署的后续工作,例如配置 TFLite 依赖,导入模型文件,并编写推理逻辑。

这种结构上的清理使得 Android 项目的构建流程更加健壮,特别是在使用如 PyTorch Mobile 或 TensorFlow Lite 等复杂依赖,且需要适配多种构建变体(Flavors)的 AI 部署场景中,其优势更为明显。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » 如何解决Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址