首页 > 解决方案 > 在 AndroidManifest.xml 中使用 gradle 任务更改活动属性

问题描述

我想使用 gradle 文件为清单文件中的所有活动设置属性(android:configChanges="screenSize|smallestScreenSize|screenLayout"),我正在尝试如下:我在我的应用程序模块的构建中添加了一些代码片段.gradle 文件:

android.applicationVariants.all { variant ->
    print("check variant:${variant.getClass()}\n")
    variant.outputs.each { output ->
        print("check output all task:${output.getName()}\n")
        def processorTask = output.processManifestProvider.getOrNull()
        print("check processorTask:${processorTask.getName()}\n")
        //ProcessApplicationManifest
        //https://android.googlesource.com/platform/tools/base/+/studio-master-dev/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/ProcessApplicationManifest.java
        processorTask.doLast {task ->
            def directory = task.getBundleManifestOutputDirectory()
            def srcManifestFile = "$directory${File.separator}AndroidManifest.xml"
            print("check manifest file:$srcManifestFile\n")
            def manifestContent = new File(srcManifestFile).getText()
            def xml = new XmlParser(false, false).parseText(manifestContent)
            print("check manifest application:${xml.application.size()}")
            xml.application[0].activity.forEach{
                it.attributes().put('android:configChanges', 'screenSize|smallestScreenSize|screenLayout')
            }
            def serializeContent = groovy.xml.XmlUtil.serialize(xml)
            def targetFile = new File(srcManifestFile)
            targetFile.write(serializeContent)
        }

    }
}

执行命令后gradlew assembleDebug,它会生成一个文件和一个 apk。文件内容如下图

AndroidManifest.xml

图片的内容是我需要的,但是生成的apk文件的内容是这样的: apk 文件中的清单 它丢失了在gradle任务中添加的属性。我想知道如何使它工作,请帮忙。

我的环境

标签: androidgradleandroid-manifest

解决方案


几天后,我自己解决了这个问题,正确的方法:

project.afterEvaluate {
    def variants = null
    try {
        variants = android.applicationVariants
    } catch (Throwable t) {
        try {
            variants = libraryVariants
        } catch (Throwable tt) {}
    }
    if (variants != null) {
        variants.all { variant ->
            variant.outputs.each { output ->
                def task = output.processManifestProvider.get()
                if (task == null) {
                    return
                }
                task.doLast {
                    def manifestFile = new File(task.manifestOutputDirectory.get().getAsFile(),"AndroidManifest.xml")
                    if (manifestFile == null || !manifestFile.exists()) {
                        return
                    }
                    def parser = new XmlParser(false, true)
                    def manifest = parser.parse(manifestFile)
                    def app = manifest.'application'[0]
                    app.'activity'.each{act->
                        String value = act.attributes()['android:configChanges']
                        if (value == null) {
                            value = "keyboardHidden|orientation|screenSize"
                        } else {
                            String[] valueSplit = value.split("\\|")
                            if (!valueSplit.contains("keyboardHidden")) {
                                value+="|keyboardHidden"
                            }
                            if (!valueSplit.contains("orientation")) {
                                value+="|orientation"
                            }
                            if (!valueSplit.contains("screenSize")) {
                                value+="|screenSize"
                            }
                        }
                        act.attributes()["android:configChanges"] = value
                    }
                    manifestFile.setText(XmlUtil.serialize(manifest), "utf-8")
                }
            }
        }
    }
}

将此代码段添加到app/build.gradle.


好吧,上面的方法只适用于每个活动元素不包含属性android:configChanges或会得到另一个问题的情况,我在这里发布。


好吧,经过几次尝试,我自己解决了这个问题,并在我的另一个问题中发布了正确的答案。


推荐阅读