防止Proguard删除片段的空构造函数

33

你知道,所有Fragment的子类都必须包含一个public空构造函数,但在使用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个回答

52

这应该可以工作:

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

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

-keep public class * extends android.support.v4.app.Fragment
保留类会强制 Proguard 保留默认构造函数。

我不使用第二个选项,因为我不想保留所有的Fragment子类。使用第一个选项时,反编译时仍然看不到空构造函数。哦,谢谢你的回答。 - Wayne
你不必担心是否看到构造函数。如果只提供一个默认的空构造函数,它可以被删除:这将由Java编译器添加。当SDK创建你的片段时,不应该有任何问题。你在运行时遇到了什么问题吗? - Snicolas
2
第二个设置确实足够了;它会保留所有扩展和自动地保留它们的无参构造函数(假设它们存在于原始类中)。 - Eric Lafortune
如果没有提供空构造函数,我认为会出现问题,因为我以前遇到过这种情况,当片段重新创建时,应用程序将崩溃或启动旧数据(如果未覆盖onSaveInstanceState)。有没有一种方法可以保留空构造函数而不保留整个片段? - Wayne
我在从Android Studio 3.5.x更新到3.6.1的过程中发现:新的R8开始在完整模式下清除构造函数,需要禁用它。 - InI4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接