133

我想从 ProGuard 中排除一些文件路径。例子com.myapp.customcomponents

我怎样才能做到这一点?我讨厌为这个目录中的每个自定义组件文件放置 -keep 标志。

我尝试了以下方法,但它不起作用:

-keep public class com.myapp.customcomponents.*
4

4 回答 4

273

您没有指定它不起作用的方式。您的配置将所有公共类的名称保留在指定包中:

-keep public class com.myapp.customcomponents.*

以下配置保留指定包及其子包中所有公共类的名称:

-keep public class com.myapp.customcomponents.**

以下配置保留指定包及其子包中所有公共/受保护类/字段/方法的名称:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}
于 2011-02-05T00:59:15.027 回答
73

在 ProGuard 配置的底部添加以下行:

-keep class com.facebook.** { *; }

相应地替换包名称,这里的包com.facebook将从 ProGuard 中排除。

于 2013-01-04T12:58:07.153 回答
8

What worked for me using Android Studio 4.0 is:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

Double asterisks (**) in other answers did not work for me. I also tried the above configuration with R8, works fine.

于 2020-07-12T16:30:40.567 回答
1

许多人似乎建议-keep class com.myapp.customcomponents.** { *; }将路径排除在处理之外。看这里:

  1. 从 proguard 中排除包
  2. 使 Proguard 完全忽略包
  3. 防止目录被混淆

这个解决方案的问题是仍然存在一定程度的混淆,这可能会破坏您的代码。您可以在映射打印输出中看到映射:

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

我选择的解决方案是一个两步过程。首先,使用injars过滤器来选择我要处理的包路径。可以将其他包路径添加为库。

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

其次,将处理后的 jar 与原始 jar 合并,但只合并那些被跳过的路径。

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

The result is a merged jar that is the combination of the processed package path and the skipped paths. This exercise is invalid, if someone can provide a way to skip processing of certain paths completely (which I haven't found).

于 2020-02-03T20:53:29.447 回答