应用启动即崩溃:Error inflating class android.support.text.emoji.widget.EmojiTextView
这个坑我之前帮团队排查过好几次,你的情况是典型的EmojiTextView在Android 7.0及以下系统的兼容性问题——因为API 25及以上系统原生对Emoji支持做了优化,而低版本系统需要额外的配置才能让Emoji组件正常工作,不然就会触发InflateException。
下面是一步步的解决方案:
1. 替换并更新Emoji依赖库
旧的support版本Emoji库在低版本系统上兼容性很差,建议直接切换到AndroidX的Emoji库。打开你Module级别的build.gradle,添加以下依赖:
implementation "androidx.emoji:emoji:1.2.0" implementation "androidx.emoji:emoji-appcompat:1.2.0"
如果之前用的是android.support.text.emoji.widget.EmojiTextView,一定要把XML里的控件全替换成AndroidX版本的androidx.emoji.widget.EmojiTextView,不然依赖和控件不匹配还是会崩。
2. 在Application中初始化Emoji支持
低版本系统不会自动加载Emoji所需的字体资源,必须提前初始化。创建或修改你的自定义Application类,在onCreate方法里添加初始化代码:
@Override public void onCreate() { super.onCreate(); // 针对API<=24的系统初始化Emoji兼容配置 EmojiCompat.Config config = new AppCompatEmojiCompatConfig(this); EmojiCompat.init(config); }
别忘了在AndroidManifest.xml里把android:name指向你的自定义Application类。
3. 检查资源混淆规则
如果你的项目开了资源混淆,很可能会把Emoji相关的字体资源给误删或者混淆掉。打开proguard-rules.pro,添加以下规则保护Emoji资源:
-keep class androidx.emoji.** { *; } -keep class androidx.core.text.** { *; } -keepresources string/emoji_font_metadata**
为什么SDK>24时正常?
Android 7.1(API 25)及以上系统原生集成了Emoji相关的系统服务和资源,不需要依赖第三方库的初始化就能加载EmojiTextView,所以不会出现崩溃。而API 24及以下系统没有这个原生支持,必须通过库的初始化来加载Emoji字体和相关组件。
内容的提问来源于stack exchange,提问作者Kevin Toner

