ProGuard - 如何正确使用于Android?哪些类和库需要保留?

7
我会尽力帮助您翻译关于使用ProGuard进行Android构建的相关知识。我不确定哪些内容需要保留(不进行混淆),哪些内容需要进行混淆。 我的应用程序中使用了几个库,其中一些列在下面:
com.android.support:appcompat
com.android.support:design
io.reactivex:rxandroid
io.reactivex:rxjava 
com.jakewharton.rxbinding
com.trello:rxlifecycle

问题1:

我应该混淆上面的库吗?它们已经是开源的了..使用proguard规则保留所有支持库是否不明智:

keep class android.support.** { *; }

我可以用类似的方式处理io.reactivex和jakewharton库

问题2:

除了支持和外部库之外,我还有为此应用程序编写的特定于应用程序的类。在AndroidManifest.xml中提到的类名及其公共成员是否可以保留,让其他代码混淆。

如果我漏掉了什么或者我的理解不正确,请告诉我。重申一下,这不是关于如何在技术上做到这一点的问题,而更多地是关于混淆/优化/缩小的包括和排除什么以及更具体的原因....毫无疑问,在构建后将进行espresso测试。

1个回答

2
问题1:我是否应该混淆这些库?
答案是肯定的。如果你添加了-keep <library>规则,那么整个库将包含在你的APK中,导致APK过大,可能会出现64k方法限制的问题,需要使用Multidex。最好应用库提供的ProGuard规则。通常可以在库的源代码或网站(如https://github.com/krschultz/android-proguard-snippets)中找到.pro文件。
问题2:在AndroidManifest.xml中提到的类名及其公共成员是否可以保留,让其他代码进行混淆?
Android插件已经为您做了这件事。插件扫描所有需要保留名称的类(例如Activities、Services、BroadcastReceivers、Views等),并且不会对它们进行混淆。这包括您在AndroidManifest.xml中声明的所有内容。

谢谢,我忽略了ProGuard的缩小选项。同意我们可以参考相关网站来配置ProGuard。但是对于Google特定库,例如com.android.support:appcompat,我们在哪里可以找到这些配置呢?关于您对第二个问题的回答,针对应用程序特定代码...您的意思是...我们不应该提供任何设置...针对我们自己的代码...?在这种情况下...在AndroidManifest中提到的应用程序特定代码始终是公开的,可以被反编译...? - user7154703
一些库,比如com.android.support:appcompat,不需要显式的规则来与ProGuard配合使用,因为Android插件指定的默认配置已经捕获了所有边缘情况(例如Views、Fragments),而其他库(如rxjava)可能需要显式的规则。这种情况因情况而异,最好的做法是查看每个库的文档中关于ProGuard规则的部分。 - Mike Laren
关于“我们自己的代码”,Android插件中的默认配置已经指定了许多规则,将应用于您的应用程序。通过启用“minify”,ProGuard将尽可能地混淆代码。但是,您对AndroidManifest的看法是正确的。某些类/方法/字段无法有效地混淆(例如Activity.onCreate(Bundle)总是会被调用,因为它是由外部调用的),因此您可以采取的一个技巧是尽可能将代码从活动/片段/视图中移出到单独的帮助器对象中,然后让ProGuard混淆它们 :) - Mike Laren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接