出于性能目的,在 AppCompat 1.4.0 及更高版本中禁用文本视图中的 emoji2

Umy*_*Umy 8 performance android android-appcompat android-recyclerview

我将应用程序依赖项从 appcompat 1.3.1 更新到 appcompat 1.4.1,其中关键更改之一是:

默认情况下通过 androidx.emoji2 库启用可更新的表情符号支持

在我看来,我的应用程序中 RecyclerView 的流畅度变差了,Profiler 证实了这一点。我的 ViewHolder 中有 4 个 TextView,其 setText 方法一直是 onBind 中最慢的操作之一。但更新之后,情况就变得灾难性的:

onBind 现在平均需要 11ms,其中 7.3ms 是4 个 textview 的androidx.emoji2.viewsintegration.EmojiInputFilter.filter()总和androidx.emoji2.viewshelper.EmojiTransformationMethod.getTransormation()。我不像大多数开发人员那样需要表情符号支持,我需要应用程序顺利运行。有没有办法在不降级到 1.3.1 的情况下禁用 emoji2?

下面是一个 TextView 的分析器的屏幕截图。父 setText() 方法花费了 3.76 毫秒。“Summary”选项卡(右侧)和 getTransormation() 弹出窗口中提供了 filter() 方法的计时。

在此输入图像描述

Umy*_*Umy 7

我在 emoji2 页面上找到了答案: https: //developer.android.com/jetpack/androidx/releases/emoji2。“配置自动初始化”段落。

因此,要禁用 emoji2,我们应该将此代码添加到 AndroidManifest.xml 中的 <application> 标记中

 <provider
     android:name="androidx.startup.InitializationProvider"
     android:authorities="${applicationId}.androidx-startup"
     android:exported="false"
     tools:node="merge">
     <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer"
               tools:node="remove" />
 </provider>
Run Code Online (Sandbox Code Playgroud)

性能的提升是显而易见的: 在此输入图像描述 onBind 现在只需要 6.5 毫秒,而不是 11 毫秒。