【问题标题】:Prevent Proguard from removing empty constructor of fragment防止 Proguard 删除片段的空构造函数
【发布时间】:2012-11-18 09:02:42
【问题描述】:

你知道,Fragment 的所有子类都必须包含一个公共的空构造函数,但是当使用 proguard 时,这些构造函数将被删除。我已指定以下命令,但仍删除空构造函数。谁能帮我保留 Fragment 的空构造函数?谢谢你。

-keepclassmembers public class * extends android.support.v4.app.Fragment { 
   public <init>(***);
   #public <init>(); //already tried this
}

-keepclassmembers public class * extends com.xxx.MyFragment { 
   public <init>(***);
   #public <init>(); //already tried this
}

【问题讨论】:

    标签: android constructor fragment proguard


    【解决方案1】:

    这应该可行:

    -keepclassmembers public class * extends android.support.v4.app.Fragment { 
       public <init>(...);
    

    我相信即使这样也足够了:

    -keep public class * extends android.support.v4.app.Fragment
    

    因为保留类将迫使 proguard 保留默认构造函数。

    【讨论】:

    • 我不使用第二个选项,因为我不想保留所有 Fragment 子类。使用第一个选项,我在反编译时仍然没有看到空构造函数。哦,谢谢你的回答。
    • 你不应该担心看到构造函数。如果您只提供一个默认的空构造函数,则可以将其删除:它将由 java 编译器添加。 SDK 将创建您的片段时应该没有问题。您在运行时遇到任何问题吗?
    • 第二个设置确实足够了;它将保留所有扩展,并自动保留它们的无参数构造函数(假设它们存在于原始类中)。
    • 我认为如果没有提供空构造函数会出现问题,因为我之前遇到过这种情况,重新创建片段时应用程序将崩溃或以旧数据启动(如果未覆盖 onSaveInstanceState)。有没有办法在不保留整个片段的情况下保留空构造函数?
    • 我从 Android Studio 3.5.x 更新到 3.6.1 的观察结果:新的 R8 开始以完全模式清除构造函数,需要禁用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2013-04-10
    • 2016-11-18
    • 2023-04-07
    相关资源
    最近更新 更多