在运行时检测你是否被 ProGuarded?
Detect whether you are ProGuarded at runtime?
有没有办法检测(在运行时)您的应用程序是否被 ProGuarded?我的目标是根据应用程序是否 ProGuarded 设置一个布尔值。
这是一种解决方法,但反射可以通过一些途径解决这个问题。
一种方法是您首先确定一个 class,在混淆器的情况下是 obfuscated/minified。因此,假设您有一个 class com.package.Thing
,当启用混淆器时,它会被缩小以仅被称为 com.package.a
(或其他,这无关紧要)。然后用反射看看原来的class是否存在。
像这样:
boolean isProguardEnabled() {
try{
return Class.forName("com.package.Thing") == null;
catch(ClassNotFoundException cnfe) {
return true;
}
}
显然,这仅在您知道 class 将在启用混淆器时更改时才有效。
也许更一般地说,您可以寻找 class com.package.a
并将其用作启用混淆器的信号,当然假设您没有真正拥有 class 的名字 a
。默认情况下,proguard 将仅使用字母表来提供 class 名称,但您也可以在您的 proguard 配置中指定您自己的要使用的 class 名称列表(这提供了另一种方法来完成同样的技巧,查找您指定的 class 个名称之一)。
我认为如果您在 build variants/flavors 上设置布尔值会更容易 运行 ProGuard。
例如:如果您 运行 ProGuard 在 Release 和 Staging 但不在 Debug,在发布和暂存时将布尔变量设置为 true,但在调试时设置为 false。 This may help
有没有办法检测(在运行时)您的应用程序是否被 ProGuarded?我的目标是根据应用程序是否 ProGuarded 设置一个布尔值。
这是一种解决方法,但反射可以通过一些途径解决这个问题。
一种方法是您首先确定一个 class,在混淆器的情况下是 obfuscated/minified。因此,假设您有一个 class com.package.Thing
,当启用混淆器时,它会被缩小以仅被称为 com.package.a
(或其他,这无关紧要)。然后用反射看看原来的class是否存在。
像这样:
boolean isProguardEnabled() {
try{
return Class.forName("com.package.Thing") == null;
catch(ClassNotFoundException cnfe) {
return true;
}
}
显然,这仅在您知道 class 将在启用混淆器时更改时才有效。
也许更一般地说,您可以寻找 class com.package.a
并将其用作启用混淆器的信号,当然假设您没有真正拥有 class 的名字 a
。默认情况下,proguard 将仅使用字母表来提供 class 名称,但您也可以在您的 proguard 配置中指定您自己的要使用的 class 名称列表(这提供了另一种方法来完成同样的技巧,查找您指定的 class 个名称之一)。
我认为如果您在 build variants/flavors 上设置布尔值会更容易 运行 ProGuard。
例如:如果您 运行 ProGuard 在 Release 和 Staging 但不在 Debug,在发布和暂存时将布尔变量设置为 true,但在调试时设置为 false。 This may help