输入法服务的启动流程:
输入法服务InputMethodService在应用进程创建时同时创建,
输入法应用程序(Latin IME)需要继承系统的InputMethodService服务,
服务创建过程中会创建绑定Context上下文,过程中会获取display信息。
最终会在DisplayManagerService中获取Display信息:
frameworks/base/services/core/java/com/android/server/display/DisplayManagerService.java:893
对比HDMI类型副屏发现Build-in类型副屏中DisplayInfo的flags被设置为
Display.FLAG_PRIVATE,导致getDisplayInfoInternal函数返回null,最终导致输入法服务启动报错。
查找赋值flags的代码如下,只有build-in类型的屏幕在初始化时会将flags默认赋值为FLAG_PRIVATE类型,设置vendor.display.builtin_presentation属性为true修改默认值。该属性设置后副屏可配置输入法,虚拟按键等功能。
frameworks/base/services/core/java/com/android/server/display/LocalDisplayAdapter.java:606