2014-09-03 47 views
4

我正在为使用第三方库的应用程序配置Proguard。难道是“最佳实践”(为了避免将来难以发现的错误),以包括行:Android Proguard - 保持所有第三方库的最佳做法?

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

为不具有其开发的具体说明Proguard的每一个第三方的开源库?

此外,一个相关的问题:是有这情况下,我应该使用

-keep class 

,并在何种情况下我应该使用

-keep public class 

千恩万谢

回答

6

主要的一般准则一般来说,proguard和代码混淆的问题是修改了类名,方法和字段名称。 (即myExplicitMethodName()成为a()

当一个类名,方法名或字段被修改,则无法使用它的反射API访问(即Class.classForName(...),...)

知道了,这是一个最佳实践-keep所有可以使用反射API调用的类和库。

对于第三方库,如果你不知道,如果他们使用或不反射API:然后-keep

对于自己的代码:希望你在你使用的类就知道了。所以对这些类使用-keep

请注意,像匕首或杰克逊这样的流行框架在您自己的类中使用反射API,所以如果使用它们,请小心!

3

就优化和混淆而言,您可以使用的维护选项越少,效果就越好。如果您没有时间来寻找最佳配置,则可采取更保守的方法。最保守的解决方案是保存所有类,字段和库的方法,所以任何内部反射将继续努力:

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

略少于保守,但通常是足够的:保留所有的公共API:

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

即使是不太保守的:只保留公共类,但不一定是他们的字段或方法:

-keep public class 3rd_party_lib_name.** 

一些实验可以去ALO ng的方式。

正如ben75所提到的,这并没有说明第三方库在自己的代码上执行反射。

+0

这看起来不错。我的问题主要是无论我采用哪种方法,我都无法立即告诉它是否打破了我的应用程序 - 错误可能会在几个月后出现在某个模块中,我永远无法分辨出它是由此造成的。这是我担心的主要问题。 – Jon 2014-09-07 15:58:59

相关问题