代码之家  ›  专栏  ›  技术社区  ›  Kyle

Android dev的可下载字体和“Chrome已停止”错误

  •  9
  • Kyle  · 技术社区  · 7 年前

    作为Oreo和支持库中新的可下载字体支持的一部分,我已经开始将这些功能整合到我开发的应用程序中。第一个应用程序是成功的-简单的应用程序,只需几个活动。第二个应用程序未成功。添加可下载字体后(基于此资源: https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts.html )我在启动活动时遇到此错误:

    01-05 13:48:50.849 1112-16753/? I/ActivityManager: Start proc 22862:com.android.chrome:sandboxed_process0/u0i247 for webview_service edu.bsu.android.apps.traveler/org.chromium.content.app.SandboxedProcessService0
    
    01-05 13:48:51.047 22862-22862/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.android.chrome:sandboxed_process0, PID: 22862 android.content.res.Resources$NotFoundException: Array resource ID #0x7f030030
    at android.content.res.Resources.obtainTypedArray(Resources.java:618)
    at android.content.res.Resources.preloadFonts(Resources.java:380)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5769)
    at android.app.ActivityThread.-wrap1(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.WebViewZygoteInit.main(WebViewZygoteInit.java:146)
    

    应用程序不会崩溃,但会出现两次弹出窗口,说明“Chrome已停止”-再次打开应用程序或发送反馈。

    基于stacktrace,资源ID #0x7f030030 是R.java中的以下条目(我希望是):

    public static final int preloaded_fonts=0x7f030030;
    

    我相信我已经确定了错误的原因-同样,错误表明Chrome有问题,但我的应用程序中出现了这种情况:

    • 活动的布局包含 TextView 使用 autoLink “web”、“map”或“all”属性。
    • 我根据上面引用的文档在清单中预加载字体。

    消除清单中的预加载声明或删除 自动链接 属性解决问题。 TextViews 不使用“web”、“map”或“all”作为 自动链接 属性不生成错误(“phone”工作,这是我所期望的,因为它不是基于web的意图)。显然,两者都不是理想的解决方案。这仅在应用程序首次启动时发生。

    同样,第一个应用程序使用相同的字体工作良好,在清单中预加载,并使用自动链接属性。但是,工作和非工作应用程序之间存在差异:

    • 非工作应用程序是一个大型应用程序,因此它使用multidex库,而工作应用程序则不使用。
    • 该非工作应用程序是本地化的,专为多个设备设计,因此它包括英语和德语 values 目录以及屏幕大小取决于 价值观 目录。工作应用程序未使用多个 价值观 资源文件夹。

    为了解决此问题,我尝试了以下方法:

    • 认为ResourceID与某些内容冲突,我为字体数组创建了一个全新的资源,创建了一个新ID。错误仍然发生。
    • 已将字体数组XML文件添加到所有 价值观 项目中的文件夹,无论屏幕大小或本地化。仍发生错误。
    • 尝试了不同的字体,只使用了一种字体。仍发生错误。
    • 删除了“web”、“map”和“all” 自动链接 值来自 文本视图 . 错误消失了。
    • 已删除 preload_fonts 清单中的元标记。错误消失了。

    我发现一个问题跟踪程序与此问题有一定的关联(我是跟踪程序上最新提交的内容,但在我完全理解问题的复杂性之前): https://issuetracker.google.com/u/1/issues/65575496

    我已经在以下设备上测试了产生错误的应用程序,“Chrome has stopped”错误仅出现在Oreo设备上。“easy”应用程序可在所有设备上运行,未报告任何错误。

    • 像素2 XL,8.1.0-错误
    • Nexus 5X,8.1.0-错误
    • Nexus 6、7.1.1-任一应用程序均无错误

    两个应用程序都具有以下渐变配置:

    compileSdkVersion 27
    buildToolsVersion '27.0.3'
    minSdkVersion 16
    targetSdkVersion 27
    supportLibraryVersion = "27.0.2"
    playServicesVersion = "11.8.0"
    

    是否有此问题的解决方案(其他未预加载字体或使用web、map或all autoLink属性),或者这与前面提到的问题跟踪程序有关?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Siyamed    7 年前

    此问题的根本原因可能与 this existing bug 与Play Store上的WebView更新相关。TextView/Linkify使用WebView进行地址识别。

    链接。MAP\U地址无法正常工作,仅适用于美国地址。请不要使用Linkify。MAP\u地址或Linkify。所有(或其属性)(如果可能)。