Android O 在 AFW 注册后无法扩充 webview

Android O failing to inflate webview after AFW enrollment

我在 Pixel XL 设备上使用最新的 Android O 测试版。 这是我在 xml.

中的网页视图
<WebView
    android:id="@+id/launch_anim"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:layout_centerHorizontal="true" />

这就是它在我的 Activity class

中的使用方式
WebView launch_anim = (WebView)findViewById(R.id.launch_anim);
launch_anim.loadUrl("file:///android_asset/launch_anim_centered.html");

这是我的 launch_anim_centered.html 资产目录中的文件

<HTML>
<head>
    <style>
body {
    background-color: #FFFFFF;
}
</style>
</head>
<body>
<CENTER>
    <IMG SRC="launch_anim_1x.gif">
</CENTER>
</body>
</HTML>

launch_anim_1x.gif 文件是一个包含旋转图像的 gif 文件。 当我启动应用程序时,这个activity的运行没有问题。然后我进行 Android-For-Work 注册。 Post 注册,一旦应用程序启动,这个 activity 无法呈现并抛出这样的异常

07-28 15:39:55.352 16538-16538/? I/WebViewFactory: Loading com.google.android.webview version 58.0.3029.125 (code 303012500)
07-28 15:39:55.353 16538-16538/? D/AndroidRuntime: Shutting down VM
07-28 15:39:55.354 16538-16538/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: com.sample.app, PID: 16538
                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.app/com.sample.app.ui.StartupActivity}: android.view.InflateException: Binary XML file line #25: Binary XML file line #25: Error inflating class android.webkit.WebView
                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
                                                       at android.app.ActivityThread.-wrap11(Unknown Source:0)
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
                                                       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.ZygoteInit.main(ZygoteInit.java:767)
                                                    Caused by: android.view.InflateException: Binary XML file line #25: Binary XML file line #25: Error inflating class android.webkit.WebView
                                                    Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class android.webkit.WebView
                                                    Caused by: java.lang.reflect.InvocationTargetException
                                                       at java.lang.reflect.Constructor.newInstance0(Native Method)
                                                       at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
                                                       at android.view.LayoutInflater.createView(LayoutInflater.java:647)
                                                       at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
                                                       at android.view.LayoutInflater.onCreateView(LayoutInflater.java:720)
                                                       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788)
                                                       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
                                                       at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
                                                       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
                                                       at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:418)
                                                       at android.app.Activity.setContentView(Activity.java:2654)
                                                       at com.sample.app.ui.StartupActivity.onCreate(Unknown Source:37)
                                                       at android.app.Activity.performCreate(Activity.java:6975)
                                                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
                                                       at android.app.ActivityThread.-wrap11(Unknown Source:0)
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
                                                       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.ZygoteInit.main(ZygoteInit.java:767)
                                                    Caused by: java.lang.NullPointerException
                                                       at android.content.res.AssetManager.addAssetPathNative(Native Method)
                                                       at android.content.res.AssetManager.addAssetPathInternal(AssetManager.java:689)
                                                       at android.content.res.AssetManager.addAssetPathAsSharedLibrary(AssetManager.java:684)
                                                       at android.webkit.WebViewFactory.getProviderClass(WebViewFactory.java:407)
                                                       at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:211)
                                                       at android.webkit.WebView.getFactory(WebView.java:2467)
                                                       at android.webkit.WebView.ensureProviderCreated(WebView.java:2462)
                                                       at android.webkit.WebView.setOverScrollMode(WebView.java:2527)
                                                       at android.view.View.<init>(View.java:4536)
                                                       at android.view.View.<init>(View.java:4668)
                                                       at android.view.ViewGroup.<init>(ViewGroup.java:597)
                                                       at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:55)
07-28 15:39:55.354 16538-16538/? E/AndroidRuntime:     at android.webkit.WebView.<init>(WebView.java:636)
                                                       at android.webkit.WebView.<init>(WebView.java:581)
                                                       at android.webkit.WebView.<init>(WebView.java:564)
                                                       at android.webkit.WebView.<init>(WebView.java:551)
                                                        ... 27 more

此问题仅出现在 Pixel 和 PixelXL 设备中。 Nexus 设备工作正常。解决此问题的任何帮助表示赞赏。谢谢 编辑:新信息。所以我禁用了 webview 以查看会发生什么,但是当尝试访问 CookieManager.getInstance() 时应用程序崩溃了。这是堆栈跟踪:

07-31 09:21:51.767 11267-11557/com.airwatch.vmworkspace I/WebViewFactory: Loading com.google.android.webview version 58.0.3029.125 (code 303012500)
07-31 09:21:51.775 13243-13276/? I/ConfigUpdater: Update started

                                                  --------- beginning of crash
07-31 09:21:51.775 11267-11557/com.airwatch.vmworkspace E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
                                                                          Process: com.airwatch.vmworkspace, PID: 11267
                                                                          java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                              at android.os.AsyncTask.done(AsyncTask.java:353)
                                                                              at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
                                                                              at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
                                                                              at java.util.concurrent.FutureTask.run(FutureTask.java:271)
                                                                              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
                                                                              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
                                                                              at java.lang.Thread.run(Thread.java:764)
                                                                           Caused by: java.lang.NullPointerException
                                                                              at android.content.res.AssetManager.addAssetPathNative(Native Method)
                                                                              at android.content.res.AssetManager.addAssetPathInternal(AssetManager.java:689)
                                                                              at android.content.res.AssetManager.addAssetPathAsSharedLibrary(AssetManager.java:684)
                                                                              at android.webkit.WebViewFactory.getProviderClass(WebViewFactory.java:407)
                                                                              at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:211)
                                                                              at android.webkit.CookieManager.getInstance(CookieManager.java:39)
                                                                              at com.sample.app.network.communication.MyCookieManager.<init>(MyCookieManager.java:48)

我认为真正的问题是 android.content.res.AssetManager.addAssetPathNative(Native Method) 上的 NullPointerException。知道如何解决这个问题吗?

我找到了一个可能对其他人有帮助的解决方法。 在我们开始 AFW 注册之前,设备中的开发人员选项显示 Webview 实现为 Chrome。 Android 系统 Webview 已禁用。此时如果我去 playstore,我可以看到 Android System Webview,但是当我点击 'Enable' 时没有任何反应。在我们执行 AFW 后,我们看到托管配置文件已成功创建,如果我现在去 playstore,我会看到 Android 系统 Webview 的 'update' 按钮,我可以进行更新.完成后,如果我查看开发人员选项,webview 实现已从 chrome 切换到系统 webview。在此之后,如果我在工作容器中启动我的应用程序,我不会看到崩溃并且应用程序会按预期运行。此外,一旦我们删除了工作配置文件,webview 实现就会切换回 chrome。 请注意,同样的事情也发生在 Nexus 设备中,但我们不需要对 webview 进行任何更新。 webview 实现在 chrome 和系统 webview 之间来回切换,一切正常。只有在 Pixel 中,我们才会进行更新以使其正常工作。

这是 Android 中的错误 O:如果 Chrome 在其中一个配置文件中被禁用,那么两个配置文件的 WebView 都会被破坏,直到它被 Play 更新。

要在配置期间解决此问题并避免必须更新 WebView,您可以使用 DevicePolicyManager.enableSystemApp() with the package name com.android.chrome, and then prevent the user from disabling it using DevicePolicyManager.setUninstallBlocked().

在工作配置文件中启用 Chrome

如果你想阻止用户使用 Chrome 浏览器,你应该使用 DevicePolicyManager.setPackagesSuspended() instead of DevicePolicyManager.setApplicationHidden().