【问题标题】:Does Proguard remove methods used in only one place? [method inlining]Proguard 是否删除仅在一个地方使用的方法? [方法内联]
【发布时间】:2015-11-04 19:05:42
【问题描述】:

我正在考虑使用 Proguard,因为我的应用更接近生产以使其更轻。

在 Android 上,除了低存储设备外,还有 65K 方法限制。我知道 Proguard 会删除未使用的方法,但它会删除仅在一个地方使用的方法吗?我的意思是,我正在编写一些方法只是为了使代码更清晰,但它会节省一个方法调用(返回 CPU 和 RAM 的最昂贵的操作之一,我研究了微码)和一个最大计数为 65K 的方法以及最终包中的一些字节。

Proguard 是否检测到此类情况并删除方法?我必须自己配置吗?如果是这样,stacktrace 去混淆怎么办?

【问题讨论】:

    标签: java android performance proguard android-proguard


    【解决方案1】:

    由于使用了代码,它不会删除它们。

    如果你启用了method/inlining/unique optimization,它将内联这样的方法:方法调用被移除,方法代码被插入到方法调用所在的位置。

    如果是这样,stacktrace 去混淆怎么办?

    如果内联方法中存在异常,它将显示在方法调用站点(调用被删除的位置)的堆栈跟踪中。

    【讨论】:

    • 就是这样!我以前不知道它被称为方法内联。非常感谢您的回答!
    • 我有一个类只有一次拍摄方法,但这些静态方法只在另一个类中使用。你知道 Proguard 在内联方法后是否仍会删除该类?
    • 做个实验一探究竟。构建一个 proguarded 包并使用例如apktool 对其进行逆向工程并研究剩下的字节码和没有的字节码。
    • 阅读您的评论让我意识到,在逆向工程之后,我可以检查课程是否仍然存在。但是,我会使用 Show Java 而不是 apktool 来查看 java 而不是 smali ;)
    【解决方案2】:

    如果使用 proguard 不会删除该方法。

    而且,如果您已经知道一种这样的方法,为什么不直接构建一个启用 proguard 的 apk 并测试应用程序中调用该方法的功能并自行检查?

    【讨论】:

    • laalto 已经找到了答案,但我很好奇……你如何测试一个方法是否被内联,或者 Proguard 是否进行了任何其他优化?
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多