WebView를 사용하면서 겪은 이슈

원티드 안드로이드앱 내부에서는 이벤트, 토픽, 뉴스 등의 정보는 URL을 통하여 웹뷰로 표시하고 있습니다. 최근에 겪었던 웹뷰 크래시 관련 이슈를 정리해 보았습니다.

이슈 내용

  • 겔럭시 S8 및 노트8 사용 유저가 시스템 업데이트 이 후 앱에서 이벤트, 콘텐츠 화면을 선택하면 앱이 중단되는 현상 발생

webview issue

이슈 분석

해당 이슈 확인 결과 아래와 같은 Log가 출력됩니다.

FATAL EXCEPTION: main Process: com.android.chrome:sandboxed_process0, PID:
         android.content.res.Resources$NotFoundException: Array resource ID #0x7f030027
             at android.content.res.Resources.obtainTypedArray(Resources.java:617)
             at android.content.res.Resources.preloadFonts(Resources.java:379)
             at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5815)
             at android.app.ActivityThread.-wrap1(Unknown Source:0)
             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
             at android.os.Handler.dispatchMessage(Handler.java:105)
             at android.os.Looper.loop(Looper.java:164)
             at android.app.ActivityThread.main(ActivityThread.java:6541)
             at java.lang.reflect.Method.invoke(Native Method)
             at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
             at com.android.internal.os.WebViewZygoteInit.main(WebViewZygoteInit.java:121)

webview setting

해당 이슈는 웹뷰를 Android System WebView를 사용하면서 Theme에 fontFamily를 지정하였을 때 발생 됩니다. Android System WebView 와 Google Play Service가 최신버전에서도 재현되고 있습니다.

처리 방법

Application Theme에 설정되어있는 fontFamily 속성을 뺍니다. 그리고 fontFamily 이 지정된 테마를 WebView가 사용되지 않는 Activity마다 테마 지정을 하면 정상 동작 됩니다.

외부 SDK 등을 이용하여 웹뷰를 호출하는 경우에도 함께 처리해 주어야 합니다. (페이스북 연동을 하는데, 페이스북 앱이 설치 안되있는 경우 등이 이에 해당됩니다.)

기타

위의 이슈가 발생되는 또 하나의 재현방법은 Downloadable Fonts 기능을 사용할 경우에도 발생합니다. AndroidManifest에 Application scope에 선언된 meta-data를 Activity scope에 선언하여도 이 현상은 동일하게 발생 되었었습니다. 더욱이 이 경우에는 외부 SDK에서 WebView를 사용하는 경우 처리해줄 수 있는 방법이 없습니다.

그리고 Android SDK에서 WebView 패키지 정보를 얻어오는 API가 있습니다. 해당 함수를 이용해서 확인하면 다음과 같습니다.

Android System WebView
- packageName : com.google.android.webview

Chrome
- packageName : com.android.chrome

해당 값을 이용하여 분기 처리하고 싶었으나, 해당 API는 26이상이어서 하위 호환을 유지할 수가 없습니다. 해당 API가 Support Library에 추가해보기를 기대해 보겠습니다. :)