Java Android ProGuard中的NoSuchFieldException

Java 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

我尝试在android.view.scalegestruedetector中使用反射来获取字段mMinSapn

    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();