繁体   English   中英

Android项目如何使用/合并多个AndroidManifest.xml

[英]Android project How to use/merge multiple AndroidManifest.xml

我想将我的项目拆分为多个sourceSets,所以我想使用多个AndroidManifest.xml声明当前sourceSets的组件,使用build apk合并主要的AndroidManifest.xml,但是那里仅支持一个主要的AndroidManifest.xml设置,所以我该怎么办它?

为什么我要使用多个sourceSet? 因为如果使用多个模块,编译速度会很慢。

这是我的项目设置

  def moduleDirs = project.projectDir.listFiles()
            .findAll {
        def name = it.name
        // filter all inner's module
        it.isDirectory() && msExtension.modulePrefix.any { name.startsWith(it) }
    }

    Set<File> manifestSet = new HashSet<>()

    Set<String> modules = new HashSet<>()
    def sourceSetConf = { AndroidSourceSet sourceSet ->
        moduleDirs.each {
            def moduleName = it.name
            def dir = sourceSet.name
            sourceSet.assets.srcDirs "${moduleName}/src/${dir}/assets"
            sourceSet.java.srcDirs "${moduleName}/src/${dir}/java"
            sourceSet.res.srcDirs "${moduleName}/src/${dir}/res"
            sourceSet.aidl.srcDirs "${moduleName}/src/${dir}/aidl"

            // each AndroidManifest.xml
            def manifestFile = project.file("${moduleName}/AndroidManifest.xml")
            if (manifestFile != null && manifestFile.exists()) {
                manifestSet.add(manifestFile)
            }

            modules.add(moduleName)
        }
    }

    // for default main sources
    sourceSetConf(android.sourceSets.main)

    // for buildType sources
    android.buildTypes.each {
        def buildType = it.name
        android.sourceSets.getByName(buildType) {
            sourceSetConf(it)
        }
    }

    // for flavor sources
    android.productFlavors.each {
        def flavor = it.name
        android.sourceSets.getByName(flavor) {
            sourceSetConf(it)
        }
    }

我从gradle中看到了一些代码,其中多个模块合并了,但是仍然不知道如何

清单合并2
工艺清单

通过Android Studio使用多个模块。 在模块之间创建依赖关系。 要使ModuleA依赖ModuleB ,请将以下内容放入ModuleA build.gradle中:

dependencies {
  // ...
  compile project(':ModuleB')
  // ...
}

AndroiManifest.xml ModuleA时,这应该合并两个模块的AndroiManifest.xml

我只是使用ManifestMerger2来做到这一点。

 private static void merge(File reportFile, File mainManifest, File... libraryManifests) {
    if (libraryManifests == null || libraryManifests.length == 0) {
        return
    }

    ILogger logger = new StdLogger(Level.VERBOSE)
    Invoker manifestMergerInvoker = ManifestMerger2.newMerger(mainManifest, logger, MergeType.APPLICATION)
    manifestMergerInvoker.setMergeReportFile(reportFile)
    manifestMergerInvoker.addLibraryManifests(libraryManifests)

    println "start merge..."

    MergingReport mergingReport = manifestMergerInvoker.merge()

    println "end merge..."

    if (MergingReport.Result.SUCCESS) {
        XmlDocument xmlDocument = mergingReport.getMergedXmlDocument(MergingReport.MergedManifestKind.MERGED)
        try {
            String annotatedDocument = mergingReport.getActions().blame(xmlDocument)
            logger.verbose(annotatedDocument)
        } catch (Exception e) {
            logger.error(e, "cannot print resulting xml")
        }
        save(xmlDocument, mainManifest)
    }
}

private static void save(XmlDocument xmlDocument, File out) {
    try {
        Files.write(xmlDocument.prettyPrint(), out, Charsets.UTF_8)
    } catch (IOException e) {
        throw new RuntimeException(e)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM