Android Proguard - 是保持所有第三方库的最佳做法吗?

时间:2014-09-03 12:52:05

标签: android proguard

我正在为使用第三方库的应用配置Proguard。它是最佳实践" (为了避免将来难以发现的错误)包括以下行:

-keep class 3rd_party_lib_name.** {*;}

是否每个第三方开源库都没有来自开发者的特定Proguard指令?

另外,一个相关问题:我应该使用哪些案例的一般准则

-keep class 

在哪种情况下我应该使用

-keep public class
非常感谢

2 个答案:

答案 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所提到的,这并不能说明第三方图书馆对你自己的代码进行反思。