Android Proguard-保留所有第三方LIB是最佳实践吗?
我正在为使用第三方库的应用程序配置Proguard。包括以下内容是否为“最佳实践”(以避免将来难以发现的bug):Android Proguard-保留所有第三方LIB是最佳实践吗?,android,proguard,Android,Proguard,我正在为使用第三方库的应用程序配置Proguard。包括以下内容是否为“最佳实践”(以避免将来难以发现的bug): -keep class 3rd_party_lib_name.** {*;} 对于每一个第三方开源库,它的开发者都没有特定的Proguard指令 另外,还有一个相关的问题:对于哪些情况我应该使用通用指南 -keep class -keep public class 在哪些情况下我应该使用 -keep class -keep public class 非常感谢progu
-keep class 3rd_party_lib_name.** {*;}
对于每一个第三方开源库,它的开发者都没有特定的Proguard指令
另外,还有一个相关的问题:对于哪些情况我应该使用通用指南
-keep class
-keep public class
在哪些情况下我应该使用
-keep class
-keep public class
非常感谢proguard和代码混淆的主要问题通常是修改了类名、方法和字段名。(即,
myExplicitMethodName()
变成了a()
)
修改类名、方法名或字段时,不能使用反射API(即Class.classForName(…)
,…)访问它
知道了这一点,最好的做法是-保留所有可以使用反射API调用的类和库
对于第三方库,如果您不知道它们是否使用反射API:那么-保留
对于您自己的代码:希望您知道在哪些类中使用它。因此,对这些类使用-keep
请注意,一些流行的框架(如dagger或jackson)在您自己的类上使用反射API,因此如果您使用它们,请小心 在优化和模糊处理方面,您可以使用的保留选项越少,效果就越好。如果没有时间找到最佳配置,可以采取更保守的方法。最保守的解决方案是保留库中的所有类、字段和方法,因此任何内部反射都将继续工作:
-keep class 3rd_party_lib_name.** {*;}
稍微不太保守,但通常足够:保留所有公共API:
-keep public class 3rd_party_lib_name.** {
public *;
}
更不保守:只保留公共类,但不一定保留它们的字段或方法:
-keep public class 3rd_party_lib_name.**
一些实验可以进行下去
正如ben75提到的,这并不能解释第三方库对您自己的代码执行反射。这看起来不错。我的问题主要是,无论我采取哪种方法,我都无法立即判断它是否破坏了我的应用程序——几个月后,错误可能会出现在某个模块中,我永远无法判断它是由此引起的。这是我最担心的事情。