混淆是一个很强大的产品,在proguard中使用反射后很多情况需要使用-keep命令来屏蔽不混代码的混淆,但对以下情况需要特别注意:
Class.forName("SomeClass")
SomeClass.class
SomeClass.class.getField("someField")
SomeClass.class.getDeclaredField("someField")
SomeClass.class.getMethod("someMethod", new Class[] {})
SomeClass.class.getMethod("someMethod", new Class[] { A.class })
SomeClass.class.getMethod("someMethod", new Class[] { A.class, B.class })
SomeClass.class.getDeclaredMethod("someMethod", new Class[] {})
SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class })
SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class, B.class })
AtomicIntegerFieldUpdater.newUpdater(SomeClass.class, "someField")
AtomicLongFieldUpdater.newUpdater(SomeClass.class, "someField")AtomicReferenceFieldUpdater.newUpdater(SomeClass.class, SomeType.class, "someField")
网上说这些情况proguard
将会检测和处理。但最近我在android项目中使用后类是被处理了,但字符串表示的数据(比如这里的someField)并没有被处理,所以如果出现了报错找不到字段的那你最好和我一样在配置文件中屏蔽一下吧!方法很简单:
-keep public class yourClass
-keepclasseswithmembers class yourClass {
<fields>;
<methods>;
}