迁移到AndroidX后启动Activity报RuntimeException崩溃如何解决?
问题根源
崩溃触发自你项目引入的老旧全局字体库uk.co.chrisjenx:calligraphy,该库已停止维护,最后版本发布于2017年,完全不兼容AndroidX体系下的新版AppCompat库。它通过反射获取AppCompat内部字段实现全局字体替换,迁移AndroidX后新版ActionBarOverlayLayout的内部字段结构发生变化,反射返回空值触发空指针,最终导致布局充气失败。
可行解决建议
- 优先方案:替换为Android官方全局字体方案
- 在
res目录下新建font文件夹,将你的自定义字体文件放入该目录 - 打开项目的主题配置文件,在App全局主题中添加以下配置:
<item name="android:fontFamily">@font/你的字体文件名</item> <item name="fontFamily">@font/你的字体文件名</item> - 移除项目中所有Calligraphy相关依赖、Application初始化代码、Activity的
attachBaseContext包装逻辑即可。
- 在
- 备选方案:替换为兼容AndroidX的Calligraphy分支版本
- 移除旧版Calligraphy依赖,替换为当前社区维护的兼容版本:
implementation 'io.github.inflationx:calligraphy3:3.1.1' implementation 'io.github.inflationx:viewpump:2.0.3' - 在Application的
onCreate方法中初始化新的配置:ViewPump.init(ViewPump.builder() .addInterceptor(new CalligraphyInterceptor( new CalligraphyConfig.Builder() .setDefaultFontPath("你的字体路径") .setFontAttrId(R.attr.fontPath) .build())) .build()); - 在BaseActivity的
attachBaseContext方法中,将原来的CalligraphyContextWrapper.wrap(context)替换为ViewPump.wrap(context)。
- 移除旧版Calligraphy依赖,替换为当前社区维护的兼容版本:
- 临时验证方案
可先注释掉所有Calligraphy相关的初始化和Context包装逻辑,运行项目确认崩溃消失后,再选择以上长期方案落地。
内容的提问来源于stack exchange,提问作者Kiran Rai Chamling
相关产品推荐
相关产品推荐

