Android插件ResourcesNotFoundException

背景

之前遇到过一种ResourceNotFoundException,是因为在WebView初始化的时候,AssetManager被重新创建了,所有被添加的插件APK路径都被清空了,所以导致资源找不到。

而这一次遇到了一个Crash却是资源路径还在,但是Context无法找到该资源的问题,日志如下:

11-30 13:11:31.701 1250-1338/? A/WindowManager: Unhandled exception while laying out windows
    android.content.res.Resources$NotFoundException: Resource ID #0x7a04001d
        at android.content.res.Resources.getValue(Resources.java:1375)
        at android.content.res.Resources.loadXmlResourceParser(Resources.java:2894)
        at android.content.res.Resources.getAnimation(Resources.java:1191)
        at android.view.animation.AnimationUtils.loadAnimation(AnimationUtils.java:73)
        at com.android.server.wm.OppoAppTransition.loadAnimation(OppoAppTransition.java:192)
        at com.android.server.wm.OppoAppTransition.createOppoCustomAnimLocked(OppoAppTransition.java:376)
        at com.android.server.wm.OppoAppTransition.loadAnimation(OppoAppTransition.java:242)
        at com.android.server.wm.WindowManagerService.applyAnimationLocked(WindowManagerService.java:3804)
        at com.android.server.wm.WindowManagerService.setTokenVisibilityLocked(WindowManagerService.java:4898)
        at com.android.server.wm.WindowManagerService.handleAppTransitionReadyLocked(WindowManagerService.java:9902)
        at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLockedInner(WindowManagerService.java:10669)
        at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLockedLoop(WindowManagerService.java:9461)
        at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLocked(WindowManagerService.java:9403)
        at com.android.server.wm.WindowManagerService.access$400(WindowManagerService.java:203)
        at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:8282)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:179)
        at android.os.HandlerThread.run(HandlerThread.java:61)

跟踪问题

  1. 通过Android Studio解开插件的APK确认:
    • 资源的类型
    • 资源的ID
  2. 根据ID找到对应的资源名称确认:
    • 插件的APK中是存在这个资源的
    • AAPT将ID和资源名都打进了resources.arsc中。
  3. 搜索资源的引用:
    • 发现在Activity的Theme中的activityOpenEnterAnimation中使用了该动画
  4. 将该资源替换之后,发现还是报同样的错误
  5. 最后发现在Activity结束的时候,会在overridePendingTransition中使用该资源,导致的Crash

overridePendingTransition

原因

因为在ActivityManagerService带过去的PackageName是主包的PackageName,而不是插件的,所以在主包的resource.arsc中找不到对应的插件资源ID,所以导致的Crash。

解决方案

将使用到的资源,放置到主包即可

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券