Java Android ProGuard中的NoSuchFieldException
我尝试在android.view.scalegestruedetector中使用反射来获取字段mMinSapnJava Android ProGuard中的NoSuchFieldException,java,android,proguard,scale,Java,Android,Proguard,Scale,我尝试在android.view.scalegestruedetector中使用反射来获取字段mMinSapn ScaleGestureDetector sgd = new ScaleGestureDetector(view.getContext(), sl); try { Field field = sgd.getClass().getDeclaredField("mMinSpan"); field.setAccessibl
ScaleGestureDetector sgd = new ScaleGestureDetector(view.getContext(), sl);
try {
Field field = sgd.getClass().getDeclaredField("mMinSpan");
field.setAccessible(true);
field.set(sgd,1);
} catch (Exception e) {
e.printStackTrace();
}
但它总是没有这样的例外,我发现它可能是由ProGuard引起的。
所以我编辑了我的proguard规则。pro,添加一些代码:
-keepclassmembers class android.view.ScaleGestureDetector {
private <fields>;
}
它仍然没有这样的例外。这里有些不对劲吗?谢谢大家! 如图所示:
unsupportedapsuage
表示如果您的targetSdkVersion
大于28(在Build.VERSION\u CODES.P
中,您根本无法访问mMinSpan
,即使是通过反射(如所述)。正如该页所述,在尝试访问这些非SDK字段时,预计会出现NoSuchFieldException
)
当然,再看看:
并且是API 29中公共API的一部分(恰好在您无法通过反射访问字段时)。因此,您可以在API 28或更低版本上运行基于反射的代码,并在API 29或更高版本上使用公共API:
ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
in minSpan = viewConfiguration.getScaledMinimumScalingSpan();
太好了!我得到了值,但如何更改它?它似乎没有setScaledMinimumScalingSpan()方法。
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 123768938)
private int mMinSpan;
mMinSpan = viewConfiguration.getScaledMinimumScalingSpan();
ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
in minSpan = viewConfiguration.getScaledMinimumScalingSpan();