我想从ProGuard中排除一些文件路径。示例com.myapp.customcomponents
我该怎么做?我讨厌为这个目录中的每个自定义组件文件放置-keep标志。
我尝试过以下操作但不起作用:
-keep public class com.myapp.customcomponents.*
答案 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.** { *; }
作为排除路径的一种方法。看到这里:
此解决方案的问题在于,仍然存在某种程度的混淆,这可能会破坏您的代码。您可以在映射中看到映射打印输出:
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,它是已处理的程序包路径和跳过的路径的组合。如果有人可以提供一种方法来完全跳过某些路径的处理(我没有找到),则此练习无效。