android - 为什么我们必须从 ProGuard 混淆中排除库?

标签 android android-proguard

我知道规则是,如果我们希望 ProGuard 正常工作,我们应该从 ProGuard 混淆中排除(例如不混淆)库。这就是所有教程停止的地方。

这背后的原因是什么?是不是因为它的包名和我们的项目不一样?我知道这是强制性的,因为当我忘记将此类库排除在 ProGuard 混淆之外时,我遇到了恐怖的故事。

这条规则适用于我们自己的图书馆项目吗?它们也有不同的包名称,但是虽然公共(public)项目不需要混淆,但我们自己的库确实必须混淆。

显然,我有完整的 ProGuard 知识,无法制定高质量的混淆计划,因为我上面提出的问题没有给我清晰易懂的答案。

最佳答案

库项目可以被混淆和最小化。无需完全排除库的混淆或缩小。

某些库确实需要特殊规则来确保它们正常工作,其原因也适用于您自己的库。这些问题并非源于它们是图书馆这一事实,而是与图书馆的工作有关。

例如,GSON 要求您添加以下行:

-keepattributes Signature

他们的sample proguard file方便地提供了这样的解释:

# Gson uses generic type information stored in a class file when working with fields.
# Proguard removes such information by default, so configure it to keep all of it.

出于类似的原因,您需要告诉 proguard 忽略 GSON 将序列化或反序列化的模型。由于 GSON 使用反射工作,因此您需要确保成员字段没有被混淆,否则 GSON 将不知道要查找哪些字段。

虽然我似乎记得过去使用 Facebook 时遇到过问题,但他们的 documentation currently explicitly states您不需要对 Proguad 做任何特殊的事情。

关于android - 为什么我们必须从 ProGuard 混淆中排除库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30790591/

相关文章:

android - 尝试生成发行版APK时出现Proguard错误

Android 支持库不兼容

Android Studio 项目已经注册

android - proguard 之后 parse.com 不工作

java - 如何设置 ProGuard 规则使我的核心更难进行逆向工程

android - 生成签名的APK错误

android - 我如何结合使用 db4o 来存储数据和 Lucene 来索引数据以进行快速搜索?

android - 如何将最新数据 append 到 android 中的自定义基本适配器 ListView ?

android - getTitle() 使用 Web URL,而不是 webView.getTitle();

库的 Android Studio consumerProguardFiles 不起作用