Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • tutorial
  • jetpack

  • components

  • androidx

  • 动态化
  • apm

    • apm相关概念
    • Android稳定性治理
    • Android低端机性能优化
    • monkey测试
    • bitmap
    • 大对象监控
    • android内存
    • 移动端的网络优化
    • 记一次anr问题查询ThreadedRenderer
      • ThreadedRenderer(>10)
      • 代码赏析
        • 构造方法
    • 记一次shrink代码减包调研方案
    • proguard
    • R8
    • perfetto
    • mat
  • module

  • harmony

  • tool

  • other

  • kotlin

  • 《android》
  • apm
Jacky
2023-10-22
目录

记一次anr问题查询ThreadedRenderer

anr 堆栈
#00 pc 0000000000085e1c  /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28)
#01 pc 000000000028c158  /apex/com.android.art/lib64/libart.so!libart.so (offset 200000) (art::ConditionVariable::WaitHoldingLocks(art::Thread*)+148)
#02 pc 0000000000743148  /apex/com.android.art/lib64/libart.so!libart.so (offset 380000) (art::GoToRunnable(art::Thread*)+408)
#03 pc 0000000000742f7c  /apex/com.android.art/lib64/libart.so!libart.so (offset 380000) (art::JniMethodEnd(unsigned int, art::Thread*)+24)
android.graphics.HardwareRenderer.nPause(HardwareRenderer.java)
android.graphics.HardwareRenderer.pause(HardwareRenderer.java:502)
android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3884)
android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2837)
android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10520)
android.view.Choreographer$CallbackRecord.run(Choreographer.java:1623)
android.view.Choreographer.doCallbacks(Choreographer.java:1141)
android.view.Choreographer.doFrame(Choreographer.java:1012)
android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1585)
android.os.Handler.handleCallback(Handler.java:955)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loopOnce(Looper.java:206)
android.os.Looper.loop(Looper.java:296)
android.app.ActivityThread.main(ActivityThread.java:9000)
java.lang.reflect.Method.invoke(Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:569)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:976)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# ThreadedRenderer(>10)

public final class ThreadedRenderer extends HardwareRenderer {}

在 Android 10 中将 ThreadedRenderer 改写并继承自 HardwareRenderer 主要是为了改进系统的渲染性能和体验。这个改写带来了一些好处:

  • 性能优化: HardwareRenderer 是一个专注于硬件加速渲染的基类, 它提供了更高效的渲染机制。通过将 ThreadedRenderer 继承自 HardwareRenderer, 可以利用硬件加速渲染, 从而提高渲染性能。这对于处理复杂的 UI 和动画效果特别有帮助

  • 一致性: 通过使用 HardwareRenderer 作为基类, ThreadedRenderer 可以更一致地处理渲染操作, 无论是在软件渲染模式还是硬件加速模式下。这有助于确保应用程序在不同设备上的渲染行为一致, 提供更好的用户体验

  • 兼容性: 通过基于 HardwareRenderer 构建 ThreadedRenderer, 可以更容易地进行系统升级和改进。这样可以减少代码重复, 提高代码的可维护性, 并简化了系统的渲染架构

  • 硬件加速支持: 继承自 HardwareRenderer 的 ThreadedRenderer 更容易支持硬件加速, 这意味着应用程序可以更好地利用设备的 GPU 资源, 提高渲染速度和效率

总之, 将 ThreadedRenderer 改写并继承自 HardwareRenderer 主要是为了提高 Android 系统的渲染性能、一致性和兼容性。这有助于改进应用程序的用户体验, 并确保应用程序在不同设备和系统版本上都能正常工作

# 代码赏析

# 构造方法

下面是 ThreadedRenderer 构造方法的一段内容。解释

long rootNodePtr = nCreateRootRenderNode();
mRootNode = RenderNode.adopt(rootNodePtr);
mRootNode.setClipToBounds(false);
mIsOpaque = !translucent;
mNativeProxy = nCreateProxy(translucent, rootNodePtr);
1
2
3
4
5

以下是对代码的解释:

  • nCreateRootRenderNode(): 这个函数用于创建根渲染节点, 返回一个指向根渲染节点的指针, 然后将这个指针存储在 rootNodePtr 变量中

  • mRootNode = RenderNode.adopt(rootNodePtr): 这行代码将根渲染节点指针(rootNodePtr)包装成一个 RenderNode 对象, 并将其赋值给 mRootNode 变量。这个 mRootNode 对象表示应用程序界面的根渲染节点

  • mRootNode.setClipToBounds(false): 这行代码设置根渲染节点的 clipToBounds 属性为 false, 这意味着根渲染节点不会对其内容进行裁剪, 允许内容在渲染中超出根渲染节点的边界

  • mIsOpaque = !translucent: 这行代码根据 translucent 变量的值来确定应用程序界面是否是不透明的。如果 translucent 为 true, 则界面是透明的, 因此 mIsOpaque 被设置为 false, 表示不透明。如果 translucent 为 false, 则界面是不透明的, 因此 mIsOpaque 被设置为 true, 表示不透明

  • mNativeProxy = nCreateProxy(translucent, rootNodePtr): 这行代码用于创建渲染代理, 并将其指针存储在 mNativeProxy 变量中。渲染代理负责协调渲染操作, 将渲染请求传递给根渲染节点以及与硬件加速相关的操作

综合起来, 这段代码执行了创建和初始化渲染系统的根渲染节点和渲染代理的操作, 以便开始渲染应用程序界面。这些操作在 Android 渲染流程中非常重要, 因为它们确定了如何绘制应用程序的用户界面

上次更新: 2025/10/09, 23:53:03
移动端的网络优化
记一次shrink代码减包调研方案

← 移动端的网络优化 记一次shrink代码减包调研方案→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式