首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓系统的NoSuchFieldException ProGuard

安卓系统的NoSuchFieldException ProGuard
EN

Stack Overflow用户
提问于 2020-08-26 05:52:13
回答 2查看 516关注 0票数 0

我尝试使用反射获取android.view.ScaleGestureDetector中的字段android.view.ScaleGestureDetector

代码语言:javascript
复制
    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引起的。因此,我编辑了我的守护规则. add,添加了一些代码:

代码语言:javascript
复制
-keepclassmembers class android.view.ScaleGestureDetector {
private  <fields>;
}

代码语言:javascript
复制
-keepclassmembers class android.view.ScaleGestureDetector {
 private *;
}

它仍然有NoSuchFieldException.Something在这里是不对的?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-26 06:04:45

源代码所示

代码语言:javascript
复制
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 123768938)
private int mMinSpan;

UnsupportedAppUsage意味着,如果targetSdkVersion大于28 ( Build.VERSION_CODES.P,则根本无法访问mMinSpan,甚至可以通过反射访问mMinSpan,正如对非SDK接口的限制所解释的那样)。正如该页面所提到的,在尝试访问这些非SDK字段时,需要有一个NoSuchFieldException

当然,再看一遍在源代码中

代码语言:javascript
复制
mMinSpan = viewConfiguration.getScaledMinimumScalingSpan();

getScaledMinimumScalingSpan() 是API 29中公共API的部分(确切地说,您不能通过反射访问字段)。因此,您可以在API 28或更低版本上运行基于反射的代码,并在API 29和更高版本上使用公共API:

代码语言:javascript
复制
ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
in minSpan = viewConfiguration.getScaledMinimumScalingSpan();
票数 3
EN

Stack Overflow用户

发布于 2022-07-20 08:43:43

我将ScaleGestureDetector类从compileSdkVersion 30复制到我的项目中。

同时,改变了mMinSpan

发自:

代码语言:javascript
复制
mMinSpan = viewConfiguration.getScaledMinimumScalingSpan();

至:

代码语言:javascript
复制
mMinSpan = 0;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63591250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档