gpt4 book ai didi

kotlin - Proguard 保留公共(public)类、字段和方法

转载 作者:行者123 更新时间:2023-12-02 12:15:39 25 4
gpt4 key购买 nike

我使用 Kotlin,我有很多内部类。
我想混淆和缩小除所有 public 之外的所有内容类。

Proguard 规则:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

-optimizationpasses 5
-overloadaggressively
-repackageclasses ''
-allowaccessmodification

-keep public class * {
public <methods>;
public <fields>;
}

不幸的是 -keep public class *表现出防御性并保留所有名称,也适用于内部类。

最佳答案

你的规则太宽泛了。

  • 与“-keepmembers”和“-keepclasseswithmembers”规则的组合相比,带有嵌套规则的单个“-keep”更广泛
  • 完整的“-keep”规则意味着“永远不要更改该方法的字节码”
  • 被保留的类和方法引用的类不能被删除、重命名或重新打包


  • 规则中的这一行保留了所有类和接口(interface):
    -keep public class * {

    我的意思是他们所有人。他们是否有公共(public)成员。

    使用 -keepclasseswithmembers反而!

    因为这些线
    {
    public <methods>;
    public <fields>;
    }

    您的所有公共(public)方法都将保持不变,这意味着 重新包装重命名方法,引用自您的公共(public)方法 不能进行!

    如果您希望至少进行一些重新打包,请确保允许 优化 (因为重新打包是作为优化步骤的一部分执行的):
    -keepmembers,allowoptimization public class * {
    public <methods>;
    public <fields>;
    }

    除了重新打包之外,这还将允许一些内联(这反过来有助于删除提供内联方法的类)。

    此外,对于 Android 应用程序,您最好将其重新打包到主包(应用程序包或其中包含最多不可移动类的包)而不是空包( '')。这是因为一些“导出”的类(事件、 View 、服务、其他东西,从 xml 文件中引用)不能被 Proguard 移到它们的包之外——aapt 动态生成特殊规则来防止这种情况发生。将访问模式从公共(public)更改为 protected /私有(private)的优化过程部分变得更有效率,更多的类可以放在一个包中。

    I want to obfuscate and shrink everything apart from all public classes.



    馊主意。你真的应该尽可能地混淆,尤其是公共(public)类(class)。如果你限制混淆,重新打包也受到限制!它会重命名它们!

    尽可能制定最具体的规则。

    如果要防止收缩:
    -keep,allowoptimization,allowobfuscation public class com.example.Example

    如果您想防止重命名,但允许剥离未使用的类:
    -keep,allowoptimization,allowshrinking public class com.example.*

    一般来说,避免通配符规则(裸 * )和 -keep规则:更喜欢特定类的规则和 -keepmembers/ -keepclasseswithmembers
    混淆应用程序和库的正确方法是完全不同的,但它们有一些共同点——你不应该关心公共(public)方法/类;只是尽可能地混淆/缩小/重新包装,直到更多的东西会破坏它。

    对于应用程序,您应该尽可能地混淆/重新打包。如果您不知道哪些包可以安全混淆,请从 opting known safe packages into obfuscation 开始.

    对于库 - 不要将 Proguard 应用于库本身(除非您试图通过默默无闻来实现安全性)。使用 aar 格式的特性—— consumer proguard files — 允许提供规则“段”,在最终的应用程序混淆期间应遵循这些规则。

    关于kotlin - Proguard 保留公共(public)类、字段和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48509393/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com