使用proguard时如何保留/排除特定的包路径?

时间:2011-01-28 16:14:54

标签: android proguard

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

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

我尝试过以下操作但不起作用:

-keep public class com.myapp.customcomponents.*

4 个答案:

答案 0 :(得分:210)

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

-keep public class com.myapp.customcomponents.*

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

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

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

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

答案 1 :(得分:44)

在proguard.config

的底部添加以下行
-keep class com.facebook.** { *; }
-dontwarn com.facebook.**

相应地更换包名,此处com.facebook将从proguard中排除

答案 2 :(得分:2)

使用Android Studio 4.0对我有用的是:

select count(id) from so_rum
    where body @@ to_tsquery('english','string & string . . . ')

其他答案中的双星号(**)对我不起作用。我还尝试了R8的上述配置,效果很好。

答案 3 :(得分:1)

很多人似乎建议使用-keep class com.myapp.customcomponents.** { *; }作为排除路径的一种方法。看到这里:

  1. exclude packages from proguard
  2. Make Proguard completely ignore package
  3. Prevent a directory from proguard obfuscation

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

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,它是已处理的程序包路径和跳过的路径的组合。如果有人可以提供一种方法来完全跳过某些路径的处理(我没有找到),则此练习无效。