Android报错Didn‘t find class “android.view.x“问题解决原理剖析

 更新时间:2023年03月28日 11:26:06   作者:BennuCTech  
这篇文章主要为大家介绍了Android报错Didn‘t find class “android.view.x“问题解决及原理剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

今天同事提到了一个问题,我们的一款App在debug包时没有问题,但是在release包时就是crash,报错如下:

可以看到问题是Didn‘t find class “android.view.x“,但是实际上我们代码中并没有这个类,由于是release包的问题,所以第一时间想到的是混淆问题,检查了一番后发现与混淆无关,经过上网查询发现有人提到说将build.gradle中的shrinkResources设置为false即可解决,经过尝试发现确实解决了问题,但是为什么呢?

shrinkResources

要弄明白问题,首先就要知道shrinkResources是如何工作的。

当我们启用了资源压缩(Resource Shrinking),当打包是会去检查每个资源是否被引用,如果没有被引用,则会进行优化,但是它有两种模式Safe和Strict。

Safe

在这种模式下,除了直接引用,使用动态代码引用的资源(比如使用Resources.getIdentifier()引用资源)也会被保留,这样就不会造成太大的问题。

Strict

在严苛模式下,只有直接引用的资源被保留,其他资源就会被压缩。注意这里是压缩而不是删除,具体表现就是如果是图片,则保留该图片文件,但是内容则为空,如下:

可以看到处理过的图片都是67b大小,且没有内容,这样大大减少了空间。

而如果是xml文件,则内容同样为空,如下:

可以看到内容变成了,大小都是47b,也是极大的减少了空间。

android.view.x

这样我们就知道Didn‘t find class “android.view.x“问题所在了,一定是我们使用的布局被压缩了,根据crash日志找到NavigateActivity的onCreate方法,这里有如下代码:

mLayoutId = ResourceUtils.getLayoutId(this, "activity_main");
...
View rootView = View.inflate(this, mLayoutId, null);
...
setContentView(rootView);

这个activity_main正是通过Resources.getIdentifier()动态引用的,在release包中查看这个布局发现已经是空的了,所以就会报上面的错误。

所以当我们将shrinkResources设置为false后,因为不会执行资源压缩,所以问题解决。

自定义保留

但是在默认情况下资源压缩(Resource Shrinking)的模式是Safe,不应该出现这样的问题,那么说明我们没有从根本上解决问题,我们继续来看。

怎么可以改变资源压缩(Resource Shrinking)的模式,答案是配置自定义保留文件,在res/raw下新建一个keep.xml文件,在其中就可以设置自定义保留策略,一个示例代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
           tools:discard="@color/selector_tint_color"
           tools:keep="@layout/activity_test1,@layout/activity_test2"
           tools:shrinkMode="strict"/>

其中:

  • discard:表示对文件做严格检查,逗号分隔
  • keep:表示保留文件,逗号分隔
  • shrinkMode:则可以设置资源压缩(Resource Shrinking)的模式,包括strict和safe两种

所以我们知道通过keep.xml可以改变资源压缩(Resource Shrinking)的模式,但是我们并没有这个文件,这时候想到是不是某些三方库在搞鬼,检查apk包我们在res/raw下果然看到一个keep.xml文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/hms_download_progress,@drawable/screen_off"
    tools:shrinkMode="strict"
    />

明显是华为hms库中的,经过一个个筛查发现如下

联想到我们刚刚升级了该库,所以一定是这个库开发者在新版本加入了这个东西,但是它影响很大,只能说相当的不负责任了。

总结

通过上面的剖析,我们了解了资源压缩(Resource Shrinking)到底是什么,同时也知道问题所在,所以其实我们可以不将shrinkResources设置为false,而是在项目中新建一个keep.xml文件,将shrinkMode改回safe就好,当然也可以在keep中添加出错的文件,但是这样只解决这一个问题,不保证后续没有其他动态引用,所以最好就是将模式改回safe即可。

最后大家在升级三方库后一定要仔细测试,以防被坑!

以上就是Android报错Didn‘t find class “android.view.x“问题解决原理剖析的详细内容,更多关于Android报错解决剖析的资料请关注脚本之家其它相关文章!

相关文章

  • Android Fragment实现底部通知栏

    Android Fragment实现底部通知栏

    这篇文章主要为大家详细介绍了Android Fragment实现底部通知栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • android ocr——身份证识别的功能实现

    android ocr——身份证识别的功能实现

    本篇文章主要介绍了android ocr——身份证识别的功能实现,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • Android  两个Fragment之间的跳转和数据的传递实例详解

    Android 两个Fragment之间的跳转和数据的传递实例详解

    这篇文章主要介绍了Android 两个Fragment之间的跳转和数据的传递实例详解的相关资料,这里说明实现的思路及实现方法,需要的朋友可以参考下
    2017-07-07
  • Kotlin标准函数与静态方法应用详解

    Kotlin标准函数与静态方法应用详解

    Kotlin中的标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数。例如let这个标准函数,他的主要作用就是配合?.操作符来进行辅助判空处理
    2022-12-12
  • AndroidStudio4.1 自定义模板的使用方法

    AndroidStudio4.1 自定义模板的使用方法

    这篇文章主要介绍了AndroidStudio4.1 自定义模板的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Android编程之杀毒的实现原理及具体实例

    Android编程之杀毒的实现原理及具体实例

    这篇文章主要介绍了Android编程之杀毒的实现原理及具体实例,结合实例形式分析了Android杀毒功能的原理与简单实现技巧,需要的朋友可以参考下
    2015-12-12
  • Android实现生成二维码并保存到相册

    Android实现生成二维码并保存到相册

    这篇文章主要介绍了如何利用Android实现二维码的生成,并且保存到本地相册。文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编学习一下
    2022-04-04
  • Android发生ANR后的信息采集过程

    Android发生ANR后的信息采集过程

    这篇文章主要为大家介绍了Android发生ANR后的信息采集过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Android控件之TabHost用法实例分析

    Android控件之TabHost用法实例分析

    这篇文章主要介绍了Android控件之TabHost用法,以完整实例形式较为详细的分析了TabHost控件实现选项卡的相关技巧,需要的朋友可以参考下
    2015-09-09
  • Android中PopupMenu组件的使用实例

    Android中PopupMenu组件的使用实例

    本篇文章主要介绍了Android中PopupMenu组件的使用实例,详细的介绍了PopupMenu组件的使用,具体一定的参考价值,有兴趣的可以了解一下
    2017-07-07

最新评论