jjzjj

android - Android Studio 中应用级 gradle 文件中 "postprocessing" block 内的 'release' block 是什么?

coder 2023-12-11 原文

下面是应用级gradle文件的 fragment 。

 buildTypes {
    release {

        postprocessing {
            removeUnusedCode false
            removeUnusedResources false
            obfuscate false
            optimizeCode false
            proguardFile 'proguard-rules.pro'
        }
    }
}

在这里,'postprocessing' 在 gradle 文件中似乎是新的。这是什么意思? Android Studio 在添加“setMinifyEnabled true”时显示错误。

工作室错误: 错误:setMinifyEnabled true 方法不能与postprocessing

一起使用

最佳答案

postprocessing block (新的后处理 DSL)是 proguard-android.txtproguard-android-optimize.txt<>(proguard-android.txtproguard-android-optimize.txt 在构建时生成并存储在构建目录中)。

<强>1。 proguard-rules.pro - 你自己的规则

buildTypes {
    release {            
        proguardFile 'proguard-rules.pro'
    }
}

<强>2。 proguard-android.txt - 标准默认规则

buildTypes {
    release {            
        proguardFile getDefaultProguardFile('proguard-android.txt')
    }
}

<强>3。 proguard-android-optimize.txt - 优化的默认规则

buildTypes {
    release {            
        proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
    }
}

<强>4。 proguard-android.txt - 标准默认规则,proguard-rules.pro - 你自己的规则

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

<强>5。 proguard-android-optimize.txt - 优化的默认规则,proguard-rules.pro - 你自己的规则

buildTypes {
    release {            
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

6. removeUnusedCode、removeUnusedResources、obfuscate、optimizeCode - 简单易用的默认规则配置

buildTypes {
    release {
        postprocessing {
            removeUnusedCode false
            removeUnusedResources false
            obfuscate false
            optimizeCode false
        }
    }
}

7. removeUnusedCode、removeUnusedResources、obfuscate、optimizeCode - 简单易用的默认规则配置,proguard-rules.pro - 你自己的规则

buildTypes {
    release {
        postprocessing {
            removeUnusedCode false
            removeUnusedResources false
            obfuscate false
            optimizeCode false
            proguardFile 'proguard-rules.pro'
        }
    }
}

<强>8。 removeUnusedCode、removeUnusedResources、obfuscate、optimizeCode - 简单易用的默认规则配置,proguard-defaults.txt - 默认规则(不禁用任何操作,包括优化配置,与新的“postProcessing”DSL block 一起使用)

buildTypes {
    release {
        postprocessing {
            removeUnusedCode false
            removeUnusedResources false
            obfuscate false
            optimizeCode false
            proguardFile getDefaultProguardFile('proguard-defaults.txt')
        }
    }
}

<强>9。 removeUnusedCode, removeUnusedResources, obfuscate, optimizeCode - 简单易用的默认规则配置,proguard-defaults.txt - 默认规则(不禁用任何操作,包括优化配置,与新的“postProcessing”DSL block 一起使用),proguard- rules.pro - 你自己的规则

buildTypes {
    release {
        postprocessing {
            removeUnusedCode false
            removeUnusedResources false
            obfuscate false
            optimizeCode false
            proguardFiles getDefaultProguardFile('proguard-defaults.txt'), 'proguard-rules.pro'
        }
    }
}

您还可以在后处理 block 中使用下面的 PostprocessingOptions:

//Test ProGuard rule files
testProguardFile 'test-proguard-rules.pro'
testProguardFiles 'test-proguard-rules-1.pro', 'test-proguard-rules-2.pro'    
//ProGuard rule files to be included in the published AAR.
//These proguard rule files will then be used by any application project that consumes the AAR (if ProGuard is enabled).
//This is only valid for Library project. This is ignored in Application project.
consumerProguardFile 'consumer-proguard-rules.pro'    
consumerProguardFiles 'consumer-proguard-rules-1.pro', 'consumer-proguard-rules-2.pro'

来自 com.android.tools.build:gradle:3.1.0-alpha08 的 PostprocessingOptions.java:

/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.android.build.gradle.internal.dsl;

import static com.google.common.base.Verify.verifyNotNull;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.annotations.VisibleForTesting;
import com.android.build.gradle.ProguardFiles;
import com.android.build.gradle.internal.scope.CodeShrinker;
import com.android.utils.HelpfulEnumConverter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.gradle.api.Project;

/** DSL object for configuring postProcessing: removing dead code, obfuscating etc. */
public class PostprocessingOptions {
private static final String AUTO = "auto";
private static final HelpfulEnumConverter<CodeShrinker> SHRINKER_CONVERTER =
        new HelpfulEnumConverter<>(CodeShrinker.class);

@NonNull private final Project project;

private boolean removeUnusedCode;
private boolean removeUnusedResources;
private boolean obfuscate;
private boolean optimizeCode;

private List<File> proguardFiles;
private List<File> testProguardFiles;
private List<File> consumerProguardFiles;

@Nullable private CodeShrinker codeShrinker;

@Inject
public PostprocessingOptions(@NonNull Project project) {
    this(
            project,
            ImmutableList.of(
                    ProguardFiles.getDefaultProguardFile(
                            ProguardFiles.ProguardFile.NO_ACTIONS.fileName, project)));
}

@VisibleForTesting
PostprocessingOptions(@NonNull Project project, List<File> proguardFiles) {
    this.project = project;
    this.proguardFiles = Lists.newArrayList(proguardFiles);
    this.testProguardFiles = new ArrayList<>();
    this.consumerProguardFiles = new ArrayList<>();
}

public void initWith(PostprocessingOptions that) {
    this.removeUnusedCode = that.isRemoveUnusedCode();
    this.removeUnusedResources = that.isRemoveUnusedResources();
    this.obfuscate = that.isObfuscate();
    this.optimizeCode = that.isOptimizeCode();
    this.proguardFiles = Lists.newArrayList(that.getProguardFiles());
    this.testProguardFiles = Lists.newArrayList(that.getTestProguardFiles());
    this.consumerProguardFiles = Lists.newArrayList(that.getConsumerProguardFiles());
    this.codeShrinker = that.getCodeShrinkerEnum();
}

public boolean isRemoveUnusedCode() {
    return removeUnusedCode;
}

public void setRemoveUnusedCode(boolean removeUnusedCode) {
    this.removeUnusedCode = removeUnusedCode;
}

public boolean isRemoveUnusedResources() {
    return removeUnusedResources;
}

public void setRemoveUnusedResources(boolean removeUnusedResources) {
    this.removeUnusedResources = removeUnusedResources;
}

public boolean isObfuscate() {
    return obfuscate;
}

public void setObfuscate(boolean obfuscate) {
    this.obfuscate = obfuscate;
}

public boolean isOptimizeCode() {
    return optimizeCode;
}

public void setOptimizeCode(boolean optimizeCode) {
    this.optimizeCode = optimizeCode;
}

public List<File> getProguardFiles() {
    return proguardFiles;
}

public void setProguardFiles(List<Object> proguardFiles) {
    this.proguardFiles = new ArrayList<>();
    for (Object file : proguardFiles) {
        this.proguardFiles.add(project.file(file));
    }
}

public void proguardFile(Object file) {
    this.proguardFiles.add(project.file(file));
}

public void proguardFiles(Object... files) {
    for (Object file : files) {
        proguardFile(file);
    }
}

public List<File> getTestProguardFiles() {
    return testProguardFiles;
}

public void setTestProguardFiles(List<Object> testProguardFiles) {
    this.testProguardFiles = new ArrayList<>();
    for (Object file : testProguardFiles) {
        this.testProguardFiles.add(project.file(file));
    }
}

public void testProguardFile(Object file) {
    this.testProguardFiles.add(project.file(file));
}

public void testProguardFiles(Object... files) {
    for (Object file : files) {
        testProguardFile(file);
    }
}

public List<File> getConsumerProguardFiles() {
    return consumerProguardFiles;
}

public void setConsumerProguardFiles(List<Object> consumerProguardFiles) {
    this.consumerProguardFiles = new ArrayList<>();
    for (Object file : consumerProguardFiles) {
        this.consumerProguardFiles.add(project.file(file));
    }
}

public void consumerProguardFile(Object file) {
    this.consumerProguardFiles.add(project.file(file));
}

public void consumerProguardFiles(Object... files) {
    for (Object file : files) {
        consumerProguardFile(file);
    }
}

@NonNull
public String getCodeShrinker() {
    if (codeShrinker == null) {
        return AUTO;
    } else {
        return verifyNotNull(SHRINKER_CONVERTER.reverse().convert(codeShrinker));
    }
}

public void setCodeShrinker(@NonNull String name) {
    if (name.equals(AUTO)) {
        codeShrinker = null;
    } else {
        codeShrinker = SHRINKER_CONVERTER.convert(name);
    }
}

/** For Gradle code, not to be used in the DSL. */
@Nullable
public CodeShrinker getCodeShrinkerEnum() {
    return codeShrinker;
}
}

来自 com.android.tools.build:gradle:3.1.0-alpha08 的 ProguardFiles.java:

...
public enum ProguardFile {
    /** Default when not using the "postProcessing" DSL block. */
    DONT_OPTIMIZE("proguard-android.txt"),

    /** Variant of the above which does not disable optimizations. */
    OPTIMIZE("proguard-android-optimize.txt"),

    /**
     * Does not disable any actions, includes optimizations config. To be used with the new
     * "postProcessing" DSL block.
     */
    NO_ACTIONS("proguard-defaults.txt"),
    ;

    @NonNull public final String fileName;

    ProguardFile(@NonNull String fileName) {
        this.fileName = fileName;
    }
}
...

关于android - Android Studio 中应用级 gradle 文件中 "postprocessing" block 内的 'release' block 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47510109/

有关android - Android Studio 中应用级 gradle 文件中 "postprocessing" block 内的 'release' block 是什么?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  7. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  10. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

随机推荐