Android-猜日志,处理找不到RippleDrawable类的问题

Android程序无法再API 16下跑,但是可以在API 17下跑,Logcat内容如下:

09-27 07:08:18.608 7529-7529/com.tangula.android.base I/dalvikvm: Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.widget.ResourcesWrapper.getDrawable

09-27 07:08:18.608 7529-7529/com.tangula.android.base W/dalvikvm: VFY: unable to resolve virtual method 852: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;

09-27 07:08:18.608 7529-7529/com.tangula.android.base D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002

09-27 07:08:18.608 7529-7529/com.tangula.android.base I/dalvikvm: Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.widget.ResourcesWrapper.getDrawableForDensity

09-27 07:08:18.608 7529-7529/com.tangula.android.base W/dalvikvm: VFY: unable to resolve virtual method 854: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;

09-27 07:08:18.608 7529-7529/com.tangula.android.base D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002

09-27 07:08:18.608 7529-7529/com.tangula.android.base E/dalvikvm: Could not find class ‘android.graphics.drawable.RippleDrawable’, referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering

09-27 07:08:18.608 7529-7529/com.tangula.android.base W/dalvikvm: VFY: unable to resolve instanceof 249 (Landroid/graphics/drawable/RippleDrawable;) in Landroid/support/v7/widget/AppCompatImageHelper;

09-27 07:08:18.608 7529-7529/com.tangula.android.base D/dalvikvm: VFY: replacing opcode 0x20 at 0x000c

09-27 07:08:18.608 7529-7529/com.tangula.android.base I/dalvikvm: Could not find method android.content.Context.getColorStateList, referenced from method android.support.v7.content.res.AppCompatResources.getColorStateList

09-27 07:08:18.608 7529-7529/com.tangula.android.base W/dalvikvm: VFY: unable to resolve virtual method 667: Landroid/content/Context;.getColorStateList (I)Landroid/content/res/ColorStateList;

09-27 07:08:18.608 7529-7529/com.tangula.android.base D/dalvikvm: VFY: replacing opcode 0x6e at 0x0006

09-27 07:08:18.608 7529-7529/com.tangula.android.base I/dalvikvm: Could not find method android.content.Context.createDeviceProtectedStorageContext, referenced from method android.support.v4.content.ContextCompat.createDeviceProtectedStorageContext

09-27 07:08:18.608 7529-7529/com.tangula.android.base W/dalvikvm: VFY: unable to resolve virtual method 659: Landroid/content/Context;.createDeviceProtectedStorageContext ()Landroid/content/Context;

09-27 07:08:18.608 7529-7529/com.tangula.android.base D/dalvikvm: VFY: replacing opcode 0x6e at 0x0006

然后程序就结束了!!!

然后分析日志吧!上面的内容过滤一下ERROR级别的如下:

09-27 07:08:15.358 1883-1883/com.google.process.gapps E/NetworkScheduler.SR: Invalid parameter app

09-27 07:08:15.358 1883-1883/com.google.process.gapps E/NetworkScheduler.SR: Invalid package name : Perhaps you didn’t include a PendingIntent in the extras?

09-27 07:08:15.378 2036-2316/com.google.android.gms E/Drive.UninstallOperation: Package still installed com.tangula.android.base

09-27 07:08:15.458 2036-7497/com.google.android.gms E/IntentOperationSvc: Failed to instantiate Chimera operation impl, dropping operation

09-27 07:08:15.598 1883-1883/com.google.process.gapps E/NetworkScheduler.SR: Invalid parameter app

09-27 07:08:15.598 1883-1883/com.google.process.gapps E/NetworkScheduler.SR: Invalid package name : Perhaps you didn’t include a PendingIntent in the extras?

到这里为止都是com.google报错,而且还没有结束。一般来说这不是问题,大部分情况下可能是墙引起的。

09-27 07:08:16.028 7529-7529/? E/Trace: error opening trace file: Permission denied (13)

这里爆了没法打开trace文件,没有授权。看上去这个是日志相关的。应该也没有关系。

09-27 07:08:18.608 7529-7529/com.tangula.android.base E/dalvikvm: Could not find class ‘android.graphics.drawable.RippleDrawable’, referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering

09-27 07:09:43.198 2036-5093/com.google.android.gms E/CheckinTask: Checkin failed:
https://android.clients.google.com/checkin (request #0):

这里说找不到RippleDrawable类,这是啥?

java.net.ConnectException: failed to connect to
android.clients.google.com/74.125.204.102 (port 443) after 120000ms: isConnected failed: ECONNREFUSED (Connection refused)

09-27 07:10:03.328 2036-7808/com.google.android.gms E/ActivityThread: Failed to find provider info for com.google.android.wearable.settings

09-27 07:11:13.798 1883-2335/com.google.process.gapps E/GCM: Missing checkin config file

这里的情况应该是APP已经死了,连不上。

所以最大的问题是RippleDrawable这个问题。RippleDrawable是Android 5.0中提供的一个波纹特效,对应API级别是21。我们引用的AppCompact包是支持兼容到v7的。所以不应该出这个问题。于是测试了一下,API Level 17以上就没有问题,程序可以正常启动。

查资料,都没有说如何解决这个问题的。

应啃日志,发现出问题之前好像在读主题的资源

09-27 07:08:18.608 7529-7529/com.tangula.android.base W/dalvikvm: VFY: unable to resolve virtual method 852: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;

09-27 07:08:18.608 7529-7529/com.tangula.android.base D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002

注意其中的 (ILandroid/content/res/Resources$Theme;)

主题文件如下:

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:actionMenuTextColor">@android:color/white</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:actionMenuTextColor">@android:color/white</item>
    </style>

这里AppTheme是自动生成的,AppTheme.NoActionBar是自定义ActionBar的时候从网上抄过来的。我们怀疑程序启动的时候,加载主题的时候有些Ripple效果的资源被读取了,然后因为平台不兼容,导致程序崩溃。

经过各种实验之后发现问题是这样的:

AppTheme.NoActionBar没有指定parent,所以用了编译时候的指定的平台版本。也就是没用到AppCompact库中的内容。我的最低版本是16,编译和目标版本都是27,所以系统启动的时候,NoActionBar就会用版本27中的默认样式作为基础样式。这样也就有Ripple的问题了。

最后,解决办法就是给他指定一个AppCampat中的parent样式,例如:

    <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:actionMenuTextColor">@android:color/white</item>
    </style>

这样程序就可以在API Level是16的环境下启动了。

可能是因为我的模拟器或build环境没有清理干净,启动的时候,错误仍然还会出现,但是程序不会崩溃了!!!

而且不指定parent的时候也不会崩溃了。

不管怎么说,问题解决了。纪念一下吧。把过程记录下来,也给后来分析日志的同学们做一个参考。

The End!

    原文作者:临碣
    原文地址: https://zhuanlan.zhihu.com/p/45482314
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞