8

我使用下面的代码显然根据产品口味自动生成专业保护映射文件。

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            applicationVariants.all { variant ->
                if (variant.getBuildType().isMinifyEnabled()) {
                    variant.assemble.doLast {
                        copy {
                            from variant.mappingFile
                            into "${rootDir}/proguardTools"
                            rename { String fileName ->
                                "mapping-${variant.name}.txt"
                            }
                        }
                    }
                }
            }

        }
    }

将 android studio 升级到 3.0 后,它显示警告说isMinifyEnabled()已弃用,我找不到任何解决方案或替代方案isMinifyEnabled()。任何帮助提前谢谢?

在此处输入图像描述

4

2 回答 2

3

我的解决方案是替换variant.getBuildType().isMinifyEnabled()variant.mappingFile.exists().

我以前有的地方:

applicationVariants.all { variant ->
    if (variant.getBuildType().isMinifyEnabled()) {
        variant.assemble.doLast {
            (new File(variant.mappingFile.parent, "$archivesBaseName-$variant.baseName-mapping.txt")).delete()
            variant.mappingFile.renameTo(variant.mappingFile.parent +
                    "/$archivesBaseName-$variant.baseName-mapping.txt")
        }
    }
}

我将其替换为:

applicationVariants.all { variant ->
    variant.assemble.doLast {
        if (variant.mappingFile != null && variant.mappingFile.exists()) {
            def mappingFilename = "$archivesBaseName-$variant.baseName-mapping.txt"
            (new File(variant.mappingFile.parent, mappingFilename)).delete()
            variant.mappingFile.renameTo(variant.mappingFile.parent +
                    "/" + mappingFilename)
        }
    }
}

或者在你的情况下更换

applicationVariants.all { variant ->
    if (variant.getBuildType().isMinifyEnabled()) {
        variant.assemble.doLast {
            copy {
                from variant.mappingFile
                into "${rootDir}/proguardTools"
                rename { String fileName ->
                    "mapping-${variant.name}.txt"
                }
            }
        }
    }
}

和:

applicationVariants.all { variant ->
    variant.assemble.doLast {
        if (variant.mappingFile != null && variant.mappingFile.exists()) {
            copy {
                from variant.mappingFile
                into "${rootDir}/proguardTools"
                rename { String fileName ->
                    "mapping-${variant.name}.txt"
                }
            }
        }
    }
}

请注意我如何重新排列代码中的条件,以便仅在所有其他组装任务完成后才搜索映射文件。

于 2017-11-07T18:47:54.383 回答
3

来自Android Gradle Plugin 3.0的来源:


    /**
     * Returns whether minification is enabled for this build type.
     *
     * @return true if minification is enabled.
     * @deprecated remember that this flag means that some "ProGuard-like" tool has run, it does not
     *     say if the tool was used to obfuscate and/or minify. In build system code this
     *     information is available elsewhere and should be used instead of this method.
     */
    @Deprecated
    boolean isMinifyEnabled();

该文档含糊不清,并没有直接说明要使用什么。在责备中,我们可以看到,执行这些更改的是Michał Bendowski,我已要求他在 Twitter 中帮助解决这个问题。这是回复:

在此处输入图像描述

此外,我在最新提交中看不到@Deprecated注释(在撰写本文时它是),这意味着该 API并未在那里被弃用。android-8.0.0_r34

if作为修复,您可以在语句之前禁止该警告:


    //noinspection GrDeprecatedAPIUsage
    if (variant.getBuildType().isMinifyEnabled()) {
        ...
    }

于 2017-11-13T18:55:49.150 回答