Проект Android Как использовать / объединить несколько AndroidManifest.xml - PullRequest
0 голосов
/ 11 июня 2018

Я хочу разделить свой проект на несколько исходных наборов, поэтому я хочу использовать несколько файлов AndroidManifest.xml для объявления текущего компонента sourceSets, использовать сборку apk и объединить основной файл AndroidManifest.xml, но при этом поддерживается только одна основная настройка AndroidManifest.xml, поэтому какя могу это сделать?

Почему я хочу использовать несколько исходных наборов?Потому что, если использовать несколько модулей, он компилируется так медленно.

Это настройки моего проекта

  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, который объединяет несколько модулей, но все еще не знаю, как

ManifestMerger2
ProcessManifest

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

Я просто использую 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)
    }
}
0 голосов
/ 11 июня 2018

Использование нескольких модулей через Android Studio.Создать зависимости между модулями.Чтобы ModuleA зависело от ModuleB, поместите в build.gradle из ModuleA следующее:

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

Это должно объединить AndroiManifest.xml из обоих модулей при построении ModuleA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...