如何保持/排除一个特定的包路径时使用前卫?

我想从 ProGuard 中排除一些文件路径

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

我试过以下方法,但没有用:

-keep public class com.myapp.customcomponents.*
102056 次浏览

你没有详细说明它在哪些方面不起作用。您的配置将所有公共类的名称保存在指定的包中:

-keep public class com.myapp.customcomponents.*

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

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

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

-keep public class com.myapp.customcomponents.** {
public protected *;
}

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

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

相应地替换软件包名称,这里软件包 com.facebook将被排除在 ProGuard 之外。

很多人似乎推荐使用 -keep class com.myapp.customcomponents.** { *; }作为排除路径被处理的一种方法:

  1. 将包裹排除在前卫之外
  2. 使保卫者完全忽略包
  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

结果是一个合并的 jar,它是处理过的包路径和跳过的路径的组合。如果有人能够提供一种方法来完全跳过某些路径的处理(我还没有找到) ,那么这个练习就是无效的。

使用 Android Studio 4.0对我有效的方法是:

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

其他答案中的双星号(* *)对我不起作用。我也尝试了上面的配置与 R8,工程罚款。