Did not find class android support design widget CoordinatorLayout

最近要维护一个旧项目,接了新的功能,但新功能需要用到新的模块,所以吧啦啦的把旧有的代码都替换为新的Androidx了,原本编译没有报错,心想不太难,但是运行起来,直接挂了。。。。下面是错误的代码:

2019-12-20 15:51:31.670 8729-8729/com.reach.reachplayer E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.reach.reachplayer, PID: 8729
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.reach.reachplayer/com.reach.reachplayer.MainActivity}: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class android.support.design.widget.CoordinatorLayout
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302)
        at android.app.ActivityThread.-wrap12(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891)
        at android.os.Handler.dispatchMessage(Handler.java:108)
        at android.os.Looper.loop(Looper.java:166)
        at android.app.ActivityThread.main(ActivityThread.java:7425)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
     Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class android.support.design.widget.CoordinatorLayout
     Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class android.support.design.widget.CoordinatorLayout
     Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.design.widget.CoordinatorLayout" on path: DexPathList[[zip file "/data/app/com.reach.reachplayer-QQnkS0v4W79B6CnLlq0a-Q==/base.apk"],nativeLibraryDirectories=[/data/app/com.reach.reachplayer-QQnkS0v4W79B6CnLlq0a-Q==/lib/arm, /data/app/com.reach.reachplayer-QQnkS0v4W79B6CnLlq0a-Q==/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib, /product/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.view.LayoutInflater.createView(LayoutInflater.java:613)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:801)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:477)
        at com.android.internal.policy.HwPhoneWindow.setContentView(HwPhoneWindow.java:321)
        at android.app.Activity.setContentView(Activity.java:2839)
        at com.reach.reachplayer.BaseActivity.setContentView(BaseActivity.java:20)
        at com.reach.reachplayer.MainActivity.onCreate(MainActivity.java:74)
        at android.app.Activity.performCreate(Activity.java:7372)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302)
        at android.app.ActivityThread.-wrap12(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891)
        at android.os.Handler.dispatchMessage(Handler.java:108)
        at android.os.Looper.loop(Looper.java:166)
        at android.app.ActivityThread.main(ActivityThread.java:7425)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

 

在网上找了很多方法,概括起来就是两种方法,一是AndroidManifest里的主题,另一种就是在build.gradle里添加新的依赖,但都是没有作用。

 

后来想到是替换了新的androidx,那既然这样,可以把红框里的替换为androidx:

替换androidx的一段代码如下面所示:

androidx.coordinatorlayout.widget.CoordinatorLayout

替换后的截图: 

 

后记,替换为androidx后,有很多地方都出错了,报的都是和这个类似的错误,如下所示:

所以解决办法都是把报错的xml文件替换为androidx即可~

<think>嗯,用户要我解析一个安卓系统的错误日志:"E FrameEvents: updateAcquireFence: Did not find frame."。从日志级别来看,开头的"E"表示这是个严重错误(Error级别),发生在FrameEvents模块中。 用户提供了几个站内引用,虽然不直接相关,但很有参考价值。比如引用[1]提到安卓框架层排查要顺着调用链找到根源,引用[3]展示了不匹配的警告日志格式,引用[5]的"Did not find"句式特别值得注意。这些线索暗示我应该从渲染流程入手。 仔细拆解这个错误信息:"updateAcquireFence"应该是SurfaceFlinger更新同步栅栏的操作,"Did not find frame"直译是找不到帧。在安卓图形系统中,acquire fence是缓冲队列里的同步机制——生产者(App)填充完图形缓冲区后会设置这个栅栏,消费者(SurfaceFlinger)需要等待栅栏释放才能读取。找不到帧意味着SurfaceFlinger在预期位置没拿到可用的缓冲区。 可能的原因有几个方向:首先是缓冲区生命周期问题,比如App过早释放了缓冲区;其次是VSync信号同步异常,导致SurfaceFlinger在错误时间点获取;还有可能是GraphicBuffer内存泄漏耗尽了缓冲区池。考虑到错误发生在updateAcquireFence阶段,第一种情况概率最大。 想到用户提到过自定义控件的问题(引用[1]),需要额外关注视图渲染是否异常。比如复杂动画中反复创建/销毁SurfaceView,或者非UI线程操作Canvas导致缓冲区状态混乱。建议用户重点检查onDraw方法耗时和同步栅栏操作。 排查步骤可以分三步走:先用Systrace抓帧分析缓冲区状态;然后检查RenderThread日志是否存在异常;最后针对可疑视图简化布局测试。如果只在特定机型出现,可能像引用[1]那样涉及API版本兼容问题——比如高版本新增的栅栏操作在低版本不存在。 突然意识到这个错误可能和Choreographer有关。当VSync信号到来时,如果主线程阻塞导致doFrame超时,可能会出现BufferQueue状态紊乱。用户此前没提ANR日志,但可以建议同步检查traces.txt文件。 </think>这个错误信息 `E FrameEvents: updateAcquireFence: Did not find frame.` 表明在 Android 图形系统(通常是 `SurfaceFlinger` 或合成器相关模块)处理帧缓冲区同步时出现了问题。以下是详细的解析和排查方向: --- ### **错误核心分析** 1. **错误来源 (`FrameEvents`)**: * `FrameEvents` 日志标签常用于 Android 图形系统的帧事件跟踪模块,负责记录帧缓冲区的生命周期事件(如申请、提交、释放)。 * 错误发生在 `updateAcquireFence` 操作中,该操作用于更新缓冲区的 **Acquire Fence**(一种同步机制,确保消费者(如显示合成器)在生产者(如 App 渲染线程)完成写入后才能读取缓冲区内容)。 2. **关键失败原因 (`Did not find frame`)**: * 系统在尝试更新某个缓冲区的同步栅栏(Fence)时,**无法定位到预期的帧(GraphicBuffer)**。 * 可能原因包括: * **缓冲区丢失或提前释放**:App 渲染后未正确提交帧,或缓冲区被意外释放。 * **缓冲区队列(BufferQueue)状态异常**:生产者(App)与消费者(SurfaceFlinger)间的缓冲区同步机制出错。 * **VSync 信号处理异常**:导致帧生命周期管理混乱。 * **驱动层/硬件兼容性问题**:特定设备的图形驱动实现存在缺陷。 --- ### **排查方向与解决方案** #### **1. 检查应用渲染逻辑** * **自定义视图/动画**:若涉及自定义 `View` 或复杂动画(尤其是 `SurfaceView`/`TextureView`),检查: * 是否在非 UI 线程操作了 `Canvas` 或缓冲区(违反单生产者原则)。 * 是否正确处理了 `onDraw()` 中的耗时操作,避免阻塞主线程导致丢帧。 * **参考引用[1]**:排查自定义控件构造函数或布局膨胀过程是否引发连锁问题(如低版本 API 兼容性)[^1]。 #### **2. 分析缓冲区生命周期** * **GraphicBuffer 泄漏/复用错误**: * 使用 Android GPU 检查工具(如 `dumpsys gfxinfo`)查看缓冲区队列状态。 * 检查代码中是否存在未释放的 `Surface`、`EGLSurface` 或 `Bitmap`。 * **同步栅栏(Fence)超时**:若 `Acquire Fence` 未在规定时间释放,系统可能丢弃帧并报此错误。 #### **3. 系统层与驱动兼容性** * **设备/系统版本特异性**: * 若仅在特定机型或 Android 版本出现(如旧设备或定制 ROM),可能是图形驱动或 HAL 层问题。 * **参考引用[4][5]**:类比环境配置缺失(如 `HADOOP_HOME`),检查设备是否缺少图形栈关键组件(如 Vulkan 驱动)[^4][^5]。 * **更新系统补丁**:厂商可能修复过图形合成器(`SurfaceFlinger`)的相关 Bug。 #### **4. 工具辅助诊断** * **捕获系统日志**: ```bash adb logcat -b all | grep -E "FrameEvents|SurfaceFlinger|BufferQueue" ``` * **使用 Systrace**: ```bash python systrace.py gfx view -a <your.package.name> ``` 重点观察 `VSync`、`dequeueBuffer`/`queueBuffer`、`acquireFence` 事件流。 --- ### **临时缓解措施** 1. **简化界面渲染**: * 禁用复杂动画或过度绘制布局(通过开发者选项中的 **“显示过度绘制区域”** 检查)。 * 使用 `HardwareLayer`(`View.setLayerType()`) 缓存静态视图。 2. **调整窗口属性**: * 对 `Activity` 设置 `android:hardwareAccelerated="false"` 关闭硬件加速(仅作测试,可能影响性能)。 3. **更新图形驱动**:从设备厂商获取最新 GPU 驱动(若支持)。 --- ### **根本解决建议** ```mermaid graph TD A[错误日志] --> B{是否自定义视图?} B -->|是| C[检查构造/渲染线程] B -->|否| D{是否多设备重现?} D -->|是| E[排查系统/驱动兼容性] D -->|否| F[检查缓冲区生命周期] C --> G[修复跨版本API调用] E --> H[更新系统/驱动] F --> I[优化dequeue/queue逻辑] G --> J[验证修复] H --> J I --> J ``` > **关键点**:此错误通常指向 **图形缓冲区同步机制断裂**,需结合应用代码与系统环境综合排查。若仅在调试版本出现,可能是 `Choreographer` 的调试追踪误报。 --- ### 相关问题 1. 如何通过 `Systrace` 分析 Android 图形渲染性能问题? 2. `Acquire Fence` 在 Android 图形管线中的作用是什么? 3. 自定义 `View` 导致 `BufferQueue` 异常的常见原因有哪些? 4. 如何诊断 Android 系统服务(如 `SurfaceFlinger`)的稳定性问题?
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值