如何通过编程确定Android应用程序是否被混淆?

如何通过编程确定Android应用程序是否被混淆?,android,Android,我有一个Android应用程序,不同的人在其中测试开发版本和发布版本。开发构建没有被混淆,我希望能够在运行时通过编程确定应用程序是否被混淆 有办法做到这一点吗?这里有一个想法:向代码库中添加一个根本不用的类。Proguard将混淆和/或删除它。因此,如果通过ProGuard运行,通过应用程序中的反射加载它应该会导致ClassNotFoundException。正如@Sean建议的那样,使用一个没有外部依赖的类 但请注意,ProGuard可以检测到反射的使用,所以您必须以某种方式从字符串名称加载类

我有一个Android应用程序,不同的人在其中测试开发版本和发布版本。开发构建没有被混淆,我希望能够在运行时通过编程确定应用程序是否被混淆


有办法做到这一点吗?

这里有一个想法:向代码库中添加一个根本不用的类。Proguard将混淆和/或删除它。因此,如果通过ProGuard运行,通过应用程序中的反射加载它应该会导致ClassNotFoundException。

正如@Sean建议的那样,使用一个没有外部依赖的类


但请注意,ProGuard可以检测到反射的使用,所以您必须以某种方式从字符串名称加载类,方法是不使用字符串文本资源:

选择一个在混淆后总是由ProGuard重命名的类。在下面的代码中,它的名称是ExampleClass.java。在运行时使用以下行检查其名称:

ExampleClass.java
...     
public static final boolean OBFUSCATED = !ExampleClass.class.toString().contains("ExampleClass");

就这些。不需要任何帮助程序类或方法,并且不会导致异常。

在我看来,我已经认真地尝试在这次尝试中发现缺陷。。。我就是做不到。这种情况并不经常发生。。。回答得很好,先生!这是正确的-查找由反射加载的类名是明智的,但如果您真的试图这样做,则可能会失败。例如,我认为,使用name=com这样的步骤来构建名称。;name+=mypackage。。。这意味着它找不到引用。这是正确的,因为ProGuard忽略了R文件。这就是我想的方法,所以我之前的评论,我不确定我是否理解你的意思?硬编码字符串资源文件中未使用的类名?是。或者使用任何其他动态方式生成字符串。