如何替换 Android Gradle 构建文件中已弃用的 PackagingOptions

Hec*_*tor 9 android android-studio android-gradle-plugin

我已经迁移到 gradle 8 我的 android 构建 gradle 文件显示

plugins {
    id 'com.android.application' version '8.1.0-alpha01' apply false
    id 'com.android.library' version '8.1.0-alpha01' apply false
    id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
    id 'com.google.dagger.hilt.android' version '2.44.2' apply false
}

tasks.register('clean') {
    delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的模块 gradle.build 文件中,packagingOptions 突出显示为已弃用

packagingOptions {
    resources {
        excludes += '/META-INF/{AL2.0,LGPL2.1}'
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我以为我已经找到了这个解决方案

packagingOptions {
    resources.excludes.add('/META-INF/{AL2.0,LGPL2.1}')
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的!已弃用的 PackagingOptions 排除的正确替代品是什么?

我使用的android studio版本是

Android Studio Giraffe | 2022.3.1 Canary 1
Build #AI-223.4884.69.2231.9486165, built on January 13, 2023
Runtime version: 17.0.5+0-17.0.5b653.23-9410051 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 12.6.1
GC: G1 Young Generation, G1 Old Generation
Memory: 4096M
Cores: 12
Metal Rendering is ON
Registry:
    external.system.auto.import.disabled=true
    ide.text.editor.with.preview.show.floating.toolbar=false
    ide.images.show.chessboard=true

Non-Bundled Plugins:
    com.android.aas (3.5.1)
Run Code Online (Sandbox Code Playgroud)

这似乎可以修复它

packagingOptions.resources.excludes.add('/META-INF/{AL2.0,LGPL2.1}')
Run Code Online (Sandbox Code Playgroud)

小智 18

此方法已弃用,这是文档

    @Deprecated("Renamed to packaging", replaceWith = ReplaceWith("packaging"))
    fun packagingOptions(action: Packaging.() -> Unit)


    val packaging: Packaging

    fun packaging(action: Packaging.() -> Unit)

Run Code Online (Sandbox Code Playgroud)

老的:

packagingOptions {
    resources {
        excludes += '/META-INF/{AL2.0,LGPL2.1}'
    }
}
Run Code Online (Sandbox Code Playgroud)

代替:

packaging {
    resources {
        excludes += "/META-INF/{AL2.0,LGPL2.1}"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,对我来说,“packaging.resources.excludes”[显示已被弃用](https://i.imgur.com/hCTARpd.png),而“packagingOptions.resources.excludes”[看起来不错](https:// i.imgur.com/cEUmmPr.png)再次。他们会把它改回来吗?`8.1.0-alpha08` (4认同)

Fan*_*dez 8

在 Kotlin 中AGP 8.0,我只是添加exludes了前缀it弃用警告现在已经消失了。

packaging {
        resources {
            it.excludes += "/META-INF/{AL2.0,LGPL2.1}"

        }
    }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述


Blu*_*ell 1

它并没有说packaginOptions已弃用:

https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/PackagingOptions

https://developer.android.com/reference/tools/gradle-api/8.0/com/android/build/api/dsl/PackagingOptions

它说excludes已弃用:

在此输入图像描述

有趣的是,7.0 文档包括excludeshttps://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/PackagingOptions#excludes:kotlin.collections.MutableSet)。

7.2 只有excludehttps://developer.android.com/reference/tools/gradle-api/7.2/com/android/build/api/dsl/PackagingOptions#exclude(kotlin.String)),但解释了用什么来交换它:

该函数已被弃用。此方法已被弃用。请改用 resources.excludes.add() 或 jniLibs.excludes.add() 。对 .so 文件模式使用 jniLibs.excludes.add(),对所有其他文件模式使用 resources.excludes.add()。

这就是你所做的。

如果您阅读 8.0 文档并点击resources.excludes https://developer.android.com/reference/tools/gradle-api/8.0/com/android/build/api/dsl/ResourcesPackagingOptions#excludes()

它给出了一个例子:

排除的模式集。与任何这些模式匹配的 Java 资源都不会打包在 APK 中。

示例:android.packagingOptions.resources.excludes += "**/*.exclude"

所以你可以尝试一下。(看起来你有)。

您确定它突出显示为已弃用,而不是像incubating8.0 文档中所写的那样突出显示吗?https://developer.android.com/reference/tools/gradle-api/8.0/com/android/build/api/dsl/PackagingOptions