防止 Proguard 删除片段的空构造函数
Posted
技术标签:
【中文标题】防止 Proguard 删除片段的空构造函数【英文标题】:Prevent Proguard from removing empty constructor of fragment 【发布时间】: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
【问题讨论】:
【参考方案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 开始以完全模式清除构造函数,需要禁用它。以上是关于防止 Proguard 删除片段的空构造函数的主要内容,如果未能解决你的问题,请参考以下文章
Proguard - PersistenceException:构造函数与类不匹配