You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单Flavor下合并两个Android Manifest的解决方案咨询

解决方案:自动合并Mobile与TV的Manifest作为Any SourceSet的Manifest

针对手动维护any的Manifest易遗漏组件的问题,以下是两种可行的自动合并方案:

方案一:通过Gradle任务调用AAPT2合并Manifest

AAPT2是Android官方提供的资源处理工具,支持直接合并多个Manifest文件。你可以创建一个Gradle任务自动完成合并,并将生成的Manifest关联到any的sourceSet。

步骤1:修改SourceSet配置

将any的Manifest指向生成目录(而非手动维护的src目录),避免手动修改冲突:

sourceSets {
    getByName("any") {
        // 指向build目录下的生成文件,无需手动维护
        manifest.srcFile("build/generated/manifests/any/AndroidManifest.xml")
        java.srcDirs("src/platform/any/java")
        kotlin.srcDirs("src/platform/any/java")
        res.srcDirs("src/platform/any/res")
    }
    // mobile和tv的配置保持不变
    getByName("mobile") {
        manifest.srcFile("src/platform/mobile/AndroidManifest.xml")
        java.srcDirs("src/platform/mobile/java")
        kotlin.srcDirs("src/platform/mobile/java")
        res.srcDirs("src/platform/mobile/res")
    }
    getByName("tv") {
        manifest.srcFile("src/platform/tv/AndroidManifest.xml")
        java.srcDirs("src/platform/tv/java")
        kotlin.srcDirs("src/platform/tv/java")
        res.srcDirs("src/platform/tv/res")
    }
}

步骤2:添加合并Manifest的Gradle任务

在build.gradle(Groovy)中添加任务,调用AAPT2合并mobile和tv的Manifest:

task mergeAnyManifest {
    // 输入文件:mobile和tv的Manifest
    def mobileManifest = file("src/platform/mobile/AndroidManifest.xml")
    def tvManifest = file("src/platform/tv/AndroidManifest.xml")
    // 输出文件:生成的any Manifest
    def outputDir = file("build/generated/manifests/any")
    def outputManifest = file("${outputDir}/AndroidManifest.xml")

    // 声明输入输出,让Gradle能正确缓存任务
    inputs.files(mobileManifest, tvManifest)
    outputs.file(outputManifest)

    doLast {
        // 创建输出目录(如果不存在)
        outputDir.mkdirs()
        // 调用AAPT2合并命令
        exec {
            commandLine = [
                    "${android.sdkDirectory}/build-tools/${android.buildToolsVersion}/aapt2",
                    "merge",
                    "-o", outputManifest.absolutePath,
                    mobileManifest.absolutePath,
                    tvManifest.absolutePath
            ]
        }
    }
}

// 让构建前先执行合并任务
preBuild.dependsOn(mergeAnyManifest)

方案二:利用Android Gradle插件的Manifest合并API

如果需要更灵活的合并规则(比如处理冲突、自定义合并逻辑),可以直接使用Android Gradle插件提供的Manifest合并器API。

替换合并任务的doLast逻辑

将方案一中的doLast代码替换为以下内容:

doLast {
    outputDir.mkdirs()
    // 获取Android Gradle插件的Manifest合并器
    def manifestMerger = project.android.getManifestMerger()
    // 合并两个Manifest
    manifestMerger.merge(
            [mobileManifest, tvManifest], // 待合并的Manifest列表
            outputManifest,               // 输出文件
            project.android.defaultConfig.applicationId, // 应用ID
            new com.android.build.gradle.internal.manifest.ManifestMerger2.MergeType.APPLICATION,
            null // 可选的合并参数,可自定义冲突规则
    )
}

冲突处理注意事项

如果mobile和tv的Manifest中存在相同组件(如同名Activity),合并时会触发冲突。你可以在对应的Manifest中添加tools命名空间的属性来指定合并规则:

  • 保留某一方的配置:tools:replace="android:label,android:theme"
  • 合并属性:tools:merge="android:permission"

需要在Manifest的根元素中声明tools命名空间:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.your.package">

内容的提问来源于stack exchange,提问作者don11995

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:50:22