java - 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。这里有什么不对吗?谢谢!
解决方案
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 123768938)
private int mMinSpan;
这UnsupportedAppUsage
意味着如果你有一个targetSdkVersion
大于 28 的值(Build.VERSION_CODES.P
你根本无法访问mMinSpan
,即使通过非 SDK 接口的限制所解释的反射也是如此。正如该页面所提到的,NoSuchFieldException
在尝试访问这些非 SDK 字段时需要a .
当然,再次查看源代码:
mMinSpan = viewConfiguration.getScaledMinimumScalingSpan();
并且是API 29 中公共 API 的一部分(恰好当您无法通过反射访问该字段时)。因此,您可以在 API 28 或更低版本上运行基于反射的代码,并在 API 29 或更高版本上使用公共 API:getScaledMinimumScalingSpan()
ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
in minSpan = viewConfiguration.getScaledMinimumScalingSpan();
推荐阅读
- excel - 读取显示的单元格值而不是公式产生的整个值
- javascript - 如何在模具中的对象上使用地图
- sql-server - 获取字符串直到第二次出现一个字符
- visual-studio-code - 是否有任何快捷方式可以折叠所有打开的窗格并专注于打开的文件
- xamarin.ios - uitextView 中的粗体和非粗体文本 - iOS
- c++ - 特定好友功能特化
- excel - 返回带有通配符的索引数组
- python-3.x - 如何使用 if-elif 正确附加列表?
- windows - 如何在我的项目中普遍集成 gtest(非 Cmake 项目)
- c - 如何使用 CGO 获得 realpath?