Motorola g stylus机型Typeface.native_instance空指针崩溃问题排查
崩溃触发原因
- 该崩溃是Android 12及以上版本部分摩托罗拉定制ROM的已知兼容性bug,崩溃发生在系统初始化应用主题字体的阶段,早于应用业务代码执行,根源是摩托罗拉对AOSP的
Typeface源码做了定制修改,读取主题配置的字体时未做非空校验,直接访问了空对象的native_instance字段。 - 核心触发条件是应用在全局主题配置中声明了自定义
fontFamily属性,或是通过反射、第三方框架修改了全局默认字体,系统加载自定义字体失败返回null后,后续赋值默认字体的逻辑直接访问空对象触发崩溃。 - 小部分场景是应用在
Application初始化阶段就加载了WebView,WebView修改系统字体缓存的逻辑和摩托罗拉ROM的字体初始化逻辑冲突触发异常。
修复方案
临时快速规避方案
- 首先排查全局主题配置文件
res/values/styles.xml中的AppTheme配置,移除全局的android:fontFamily/fontFamily属性配置,改为在代码中给需要自定义字体的控件单独设置字体,不要在全局主题层面配置自定义字体。 - 如果使用了第三方全局字体替换框架、或是自己实现了反射修改全局
Typeface的逻辑,先针对摩托罗拉机型关闭该逻辑,单独给控件设置字体即可。 - 在
Application的attachBaseContext方法最前端添加机型兼容判断,摩托罗拉Android 12以上机型默认走系统字体逻辑:
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); boolean isMotoAboveAndroid12 = Build.MANUFACTURER.equalsIgnoreCase("motorola") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S; if (!isMotoAboveAndroid12) { // 原有自定义全局字体加载逻辑 } }
永久兼容方案
- 改用Android官方的可下载字体能力实现自定义字体需求,不要使用本地打包字体+反射修改全局字体的方案,避免和系统字体初始化逻辑冲突。
- 若必须使用全局自定义字体,将全局字体配置下沉到Activity层面,重写所有Activity的
onCreate方法,在super.onCreate()执行之前给Activity设置带自定义字体的主题,不要在Application阶段修改系统字体缓存。 - 若崩溃伴随WebView初始化触发,将WebView的初始化时机延后到应用首帧渲染完成之后,不要在Application或者启动页的
onCreate阶段初始化WebView。
内容的提问来源于stack exchange,提问作者nitesh
相关产品推荐
相关产品推荐

