uni-app中我想移除原生插件的一个receiver,通过根目录下创建的AndroidManifest.xml文件操作,但最终打包还是存在该问题,请问是什么原因

发布于 1周前 作者 itying888 来自 Uni-App

uni-app中我想移除原生插件的一个receiver,通过根目录下创建的AndroidManifest.xml文件操作,但最终打包还是存在该问题,请问是什么原因

根目录AndroidManifest.xml的内容

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="真实包名">
<application>
<receiver android:name="com.netease.nimlib.service.NimReceiver" android:exported="false" android:process=":core" tools:node="remove">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
</application>
</manifest>

1 回复

在uni-app项目中,如果你尝试通过根目录下创建的 AndroidManifest.xml 文件来移除原生插件的一个 receiver,但最终打包后发现该 receiver 仍然存在于生成的 AndroidManifest 中,这通常是由于以下几个原因:

  1. Manifest合并规则:Android的构建系统会将多个 AndroidManifest.xml 文件合并成一个最终的Manifest文件。uni-app在打包过程中,可能会使用插件提供的Manifest文件,这些文件可能会覆盖或添加一些配置。

  2. 插件优先级:uni-app的原生插件通常有自己的 AndroidManifest.xml 文件,这些文件在打包过程中具有更高的优先级,可能会覆盖你在根目录下创建的Manifest文件中的配置。

  3. 构建脚本配置:在某些情况下,构建脚本(如 webpackvite)或uni-app的打包工具可能会忽略或覆盖你的自定义Manifest文件。

为了解决这个问题,你可以尝试以下方法:

方法一:使用自定义Gradle脚本

你可以通过创建一个自定义的Gradle脚本来修改最终的Manifest文件。以下是一个示例,展示了如何在 app/src/main/ 目录下创建一个 AndroidManifest-patch.gradle 文件来移除特定的 receiver

android {
    // This closure is executed after the default manifest is merged
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def processManifest = output.getProcessManifest()
            processManifest.doLast {
                def manifestOutput = processManifest.manifestOutputFile
                def xml = new XmlSlurper().parse(manifestOutput)
                def receivers = xml.declaration() + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                                xml.application.children().findAll { it.name() == 'receiver' && it.attribute('android:name')?.text() == 'com.example.YourReceiver' }.collect { '' }*.join('\n')
                def newXml = new groovy.xml.MarkupBuilder().bind {
                    mkp.yield xml.declaration()
                    application(xml.application.attributes()) {
                        xml.application.children().findAll { it.name() != 'receiver' || !(it.attribute('android:name')?.text() == 'com.example.YourReceiver') }.each { child ->
                            mkp.yieldUnescaped(groovy.xml.XmlUtil.serialize(child))
                        }
                    }
                }
                new File(manifestOutput.parent, manifestOutput.name).write(newXml.toString())
            }
        }
    }
}

方法二:联系插件开发者

如果上述方法不可行,建议联系该原生插件的开发者,请求他们提供一个配置选项来禁用该 receiver,或者在插件的文档中查找是否有相关的配置说明。

通过这些方法,你应该能够成功地从最终的AndroidManifest中移除不需要的 receiver

回到顶部