ProGuard - 如何正确使用 Android ?要保留哪些 类 和图书馆?

ProGuard - How to use correctly for Android ? Which classes and libraries to keep?

我正在努力提高我对 ProGuard 在 Android 构建中的使用的理解。我不太确定要准确保留(不混淆)什么以及要混淆什么。

我的应用程序中使用了几个库,下面列出了其中的一些

com.android.support:appcompat
com.android.support:design
io.reactivex:rxandroid
io.reactivex:rxjava 
com.jakewharton.rxbinding
com.trello:rxlifecycle

问题一:

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

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

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

问题二

除了支持和外部库,我还有特定于应用程序的 classes,为此应用程序编码。是否可以保留 AndroidManifest.xml 中提到的 class 名称,特别是它们的 public 成员,并混淆其余代码。

如果我遗漏了什么或者我的理解不正确,请告诉我。只是重复一遍,这不是关于如何在技术上做到这一点的问题,而是更多关于 obfuscation/optimization/ shrink 包含什么和排除什么的问题。更具体地说,它背后的原因....肯定是浓缩咖啡构建后测试。

Question 1: Should I obfuscate above libraries?

是的。如果您添加 -keep <library> 规则,那么整个库将包含在您的 APK 中,这会使它膨胀并可能导致问题,例如使您的应用程序超过 64k 方法限制并需要 Multidex。应用库提供的 ProGuard 规则总是一个好主意。您通常可以在库源代码或 https://github.com/krschultz/android-proguard-snippets 等网站中找到 .pro 文件。

Question 2: Is it ok to keep the class names which are mentioned in AndroidManifest.xml and specifically their public members, and let obfuscate rest of the code.

Android 插件已经为您做到了。该插件扫描所有 类 需要保留其名称(例如 Activities、Services、BroadcastReceivers、Views 等)并且不会混淆它们。这包括您在 AndroidManifest.xml.

中声明的所有内容