如何解决Android ProGuard中的NoSuchFieldException
我尝试使用反射在android.view.ScaleGestureDetector中获取字段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();
}
但它始终具有NoSuchFieldException,我发现它可能是由ProGuard引起的。 因此,我编辑了proguard-rules.pro,添加了一些代码:
-keepclassmembers class android.view.ScaleGestureDetector {
private <fields>;
}
或
-keepclassmembers class android.view.ScaleGestureDetector {
private *;
}
它仍然有NoSuchFieldException。这里有些东西不对吗?谢谢!
解决方法
如the ScaleGestureDetector
source code所示:
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P,trackingBug = 123768938)
private int mMinSpan;
UnsupportedAppUsage
意味着如果您的targetSdkVersion
大于28(Build.VERSION_CODES.P
,则根本无法访问mMinSpan
,即使通过{ {3}}。正如该页面所提到的,尝试访问这些非SDK字段时应该使用NoSuchFieldException
。
当然,再看Restrictions on non-SDK interfaces:
mMinSpan = viewConfiguration.getScaledMinimumScalingSpan();
并且at the source code 是API 29中公共API的一部分(正是当您无法通过反射访问该字段时)。因此,您可以在API 28或更低版本上运行基于反射的代码,并在API 29或更高版本上使用公共API:
ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
in minSpan = viewConfiguration.getScaledMinimumScalingSpan();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。