java ProGuard 删除(收缩)未使用的类

2024-04-06

假设我有这个 Java 应用程序:

package com.site;

public class MyAppBase {}

package com.site.free;

import com.site.MyAppBase;

public class MyApp extends MyAppBase {}

package com.site.pro;

import com.site.MyAppBase;

public class MyApp extends MyAppBase {}

package com.site;

public class Edition
{

    public static final int     FREE    = 1;
    public static final int     PRO     = 2;

    private static final int    EDITION = PRO;

    public static boolean is(final int edition)
    {
        return (EDITION == edition);
    }
}

package com.site;

public class EditionFactory
{

    public static MyAppBase get_app()
    {
        MyAppBase ret = null;

        if (Edition.is(Edition.FREE))
            ret = new com.site.free.MyApp();
        else if (Edition.is(Edition.PRO))
            ret = new com.site.pro.MyApp();

        return ret;
    }
}

现在,我试图摆脱非选定版本(在本例中它是免费的)的 ProGuard 配置的任何组合都不起作用。

我所说的“摆脱”是指让实际的类消失(以及从调用代码中消失)。

换句话说,像这样的调用:

final MyAppBase app = EditionFactory.get_app();

.. 经过 ProGuarding 后,目前正在翻译为:

if (a.a(1))
    localObject5 = new c(); // <<< FREE
else if (a.a(2))
    localObject5 = new d(); // <<< PRO

..虽然我希望它被翻译成这样:

localObject5 = new d(); // <<< PRO only in the code (as set at Edition.EDITION)

底线是 (除此之外,ProGuard 非常棒!),我似乎无法让它“看透”并理解 Edition.is() 是一个返回常量的布尔函数,这使得可以删除一些类。

我尝试过如下配置:

-keep,allowshrinking,allowoptimization public class * extends com.site.MyAppBase
-optimizationpasses 10

..没有任何作用。

另一方面,如果我引用 Edition.EDITION 并内联比较它(即没有任何“代理”函数),Java 编译器(v1.6)会检测到它并删除对未选择的版本/类的整个引用。
这导致 ProGuard 删除/缩小未使用的类,这很棒。

这里唯一的问题是关于维护 - 我很高兴能够继续使用 EditionFactory 风格。


未执行优化,因为 ProGuard 决定不内联该方法Edition#is,因此它无法简化由此产生的一系列指令。该方法不是内联的,因为它不是很短并且也被多次调用。您可以使用 ProGuard 的这个未记录的 JVM 选项来解决第一个标准:

-Dmaximum.inlined.code.length=16

或者,您可以通过确保该方法仅调用一次来解决第二个标准:

return Edition.is(Edition.FREE) ?
    new com.site.free.MyApp() :
    new com.site.pro.MyApp();

或者,您可以创建短函数 isFree() 和 isPro(),因为它们会返回常量,这些常量将被内联。

如果您期望进行一些特定的优化,最好检查已处理的代码,因为它们通常受到复杂的约束。

很高兴听到您喜欢 ProGuard。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java ProGuard 删除(收缩)未使用的类 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • 存根方法时出现 InvalidUseOfMatchersException

    我有这个 TestNG 测试方法代码 InjectMocks private FilmeService filmeService new FilmeServiceImpl Mock private FilmeDAO filmeDao Bef
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • 使用 $ 和字符值动态选择数据框列

    我有一个由不同列名组成的向量 我希望能够循环每个列名以从 data frame 中提取该列 例如 考虑数据集mtcars以及一些存储在字符向量中的变量名称cols 当我尝试从中选择一个变量时mtcars使用动态子集cols 这些工作都不是
  • 主窗口关闭时 QWidget 不会关闭

    我正在尝试创建一个主窗口 QWidget 当单击按钮时它会打开一个新的 QWidget 但是当我关闭主窗口时 最近打开的 QWidget 不会关闭 main cpp QApplication a argc argv MainWindow w
  • 有没有 recaptcha v2 关闭事件?

    我用这样的代码渲染 grecaptcha let callback const p new Promise resolve gt callback result gt resolve result grecaptcha render el
  • 使用 SQL Server CTE 扁平化层次结构系列

    寻找 SQL Server CTE 示例来创建层次结构 以便我可以输出所有系列 例如展平每个层次结构 例如 在家谱中 如果根从祖父母开始 我需要每个家庭成员的层次结构列表 其中包含成员详细信息 父母的行详细信息 喜欢 child1 row
  • 模型绑定下拉选择值

    我有一个模型 该模型有一个public List
  • 使用 Python 捕获 Mac OS X 系统音频输出

    我一直在尝试使用 劫持 Mac OS X 系统音频PyAudio http people csail mit edu hubert pyaudio 并在Python中保存为wav 也就是说 我不想从麦克风等输入设备进行录制 我想获取任何或所
  • 如何防止 Visual Studio 或 Docker 更改主机端口号?

    我已经对我的 Web 应用程序进行了 Docker 化 并且可以在 Visual Studio 中运行它 但是 它选择使用的主机端口号并不一致 在哪里将其配置为始终使用相同的端口号 我发现我可以通过编辑来做到这一点launchSetting
  • GC.Collect()

    好吧 我已经读过几个有关它的主题 但就这样吧 假设我有一个应用程序 基本上我会时不时地单击一个按钮 几分钟内会发生很多事情 然后它可能会再空闲一个小时 或者可能只是一分钟 在这一切结束之后 调用 GC Collect 不是一个很好的情况吗
  • Java EE、EJB 文件处理

    我正在开发一个网络应用程序 允许用户上传图片 然后系统将为他们生成拇指 我的问题依赖于这样一个事实 EJB 可以分布在多个服务器上 因此不允许直接处理文件 我可以将图像存储在数据库中 但我希望将它们作为文件存储在其中一台服务器中 我怎样才能
  • 将 Primefaces Jar 3.3 替换为 4.0 后,primefaces 计划事件颜色不起作用

    我使用 primefaces 4 0 并尝试更改 Primefaces Lazy Schedule 中事件的颜色 因此我有以下 xhtml 代码
  • JavaScript:扩展 Array.prototype 有什么危险?

    谷歌 JavaScript 风格指南建议不要延长Array prototype https google github io styleguide jsguide html disallowed features modifying bui
  • libgdal.so.20 问题 centos rgdal

    有人可以帮我理解 rgdal 的问题是什么吗 我为centos 6 64位安装了gdal 2 但没有成功安装rgdal 我试图找出问题所在 但在互联网上没有找到任何有用的信息 这是 Rstudio 服务器控制台 install packag
  • 获取异常实例类名

    我想知道这种情况下的异常实例是什么 try some risky actions catch Exception e System out println Get instance name there 我怎样才能实现这个目标 干得好 tr
  • Angular 10:无法编写参考

    我尝试按照 Angular 更新指南从 Angular 8 升级到 Angular 10 我的项目由核心应用程序 共享 2 个库 谷歌地图和共享组件 和一个额外的 apk fsm 2 个库 应用程序及其元数据 组成 核心和共享的构建正在通过
  • 对树数据进行分组、聚合和求和的最佳方法是什么?

    给定一个自引用表 Item Id pk ParentId fk 具有关联值的相关表 ItemValue ItemId fk Amount 和一些样本数据 Item ItemValues Id ParentId ItemId Amount 1
  • 提交某种类型的模型后运行函数

    我想在实例时运行一个函数Post模型已承诺 我想运行它any他们提交的时间 所以我不想在任何地方显式调用该函数 我怎样才能做到这一点 def notify subscribers post send email to subscribers
  • 在 oracle 树查询中连接其他表

    给定一个简单的 id description 表t1 比如 id description 1 Alice 2 Bob 3 Carol 4 David 5 Erica 6 Fred 以及一个父子关系表t2 比如 parent child 1
  • web2py 的多列唯一约束

    可以将特定列标记为 unique true 在 web2py 中处理多列唯一约束的最正确方法是什么 例如 假设我有一个汇率表 它可以包含 来源货币 目标货币 和 汇率 列 两行具有相同的来源和目的地货币是没有意义的 使 from to 组合
  • 共享主键

    我猜这是一个半常见的问题 但我在过去的问题列表中找不到它 我有一组需要共享主键索引的产品表 假设如下 product1 table id name category other fields product2 table id name c
  • java ProGuard 删除(收缩)未使用的类

    假设我有这个 Java 应用程序 package com site public class MyAppBase package com site free import com site MyAppBase public class My