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()
.
我在 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 浏览器,你应该使用 DevicePolicyManager.setPackagesSuspended()
instead of DevicePolicyManager.setApplicationHidden()
.