[每当我在项目中创建请求和响应模型时,我都会将它们添加到proguard中,我要格外小心,因此proguard不会在Release环境中删除我的模型。但这对我来说似乎不是一个好习惯,所以我只想知道它是在哪个基础上将任何类声明为未使用的类。
ProGuard会删除您的代码不直接使用的所有内容。
仅当您的代码使用反射时,才需要添加规则,而ProGuard无法知道您实际使用的是什么。假设您有此类:
class User {
String name;
String phoneNumber;
public String getName() {
return name;
}
}
如果直接拨打user.getName()
,就可以了。但是您也可以这样称呼它:
Class.forName("com.app.User").getMethod("getName").invoke(user); // same as user.getName()
[ProGuard无法理解您在做什么,并且很可能会删除User
类或至少getName()
方法,以为您没有使用它。
现在您很可能自己不使用反射,但是第三方库可以使用,通常是JSON解析器和HTTP客户端,例如,它们可以使用反射从JSON字段名称初始化模型。
由于这种可能性,强烈建议添加规则以确保ProGuard不会删除您的模型。推荐的方法是创建一个适用于所有模型的规则,通常是将它们全部放在同一文件夹中,在此com/app/models
:
-keep class com.app.models.** { *; }