我正在为使用第三方库的应用配置Proguard。它是最佳实践" (为了避免将来难以发现的错误)包括以下行:
-keep class 3rd_party_lib_name.** {*;}
是否每个第三方开源库都没有来自开发者的特定Proguard指令?
另外,一个相关问题:我应该使用哪些案例的一般准则
-keep class
在哪种情况下我应该使用
-keep public class
非常感谢
答案 0 :(得分:6)
一般来说,proguard和代码混淆的主要问题是修改了类名,方法和字段名。 (即myExplicitMethodName()
成为a()
)
修改类名,方法名或字段时,无法使用反射API访问它(即Class.classForName(...)
,...)
了解这一点,-keep
可以使用反射API调用的所有类和库是最佳做法。
对于第三方库,如果您不知道他们是否使用了反射API:那么-keep
对于您自己的代码:希望您知道在哪些类中使用它。因此,对这些类使用-keep
。
请注意,像dagger或jackson这样的流行框架会在您自己的类上使用反射API,因此如果您使用它们,请小心!
答案 1 :(得分:3)
在优化和模糊处理方面,您可以使用的选项越少,结果就越好。如果您没有时间找到最佳配置,您可以采取更保守的方法。最保守的解决方案是保留库中的所有类,字段和方法,因此任何内部反射都将继续有效:
-keep class 3rd_party_lib_name.** {*;}
稍微不那么保守,但通常足够:保留所有公共API:
-keep public class 3rd_party_lib_name.** {
public *;
}
更不保守:只保留公共课程,但不一定是他们的领域或方法:
-keep public class 3rd_party_lib_name.**
一些实验可以顺利进行。
正如ben75所提到的,这并不能说明第三方图书馆对你自己的代码进行反思。