I'm attempting to bundle Crosswalk with my Android application so that I can include its webview on a Fragment. The business case being that any HTML we want to run on the view will work across all android versions (the HTML could be a complex activity such as a game). I'm looking for an example which could manage this or how I could change my project to suit that purpose.
I've followed the tutorial here (https://crosswalk-project.org/documentation/android/embedding_crosswalk.html) to get started, this allows me to build an APK that correctly shows web content on my Samsung S4, which uses the ARM chipset, however I now also would like to cover x86. I've got an emulator to test with but I'm not having much luck. I've also attempted to follow the steps here (How to add crosswalk webview in my own android library module?).
I've tried the following:
- Different permutations of the including the modules provided on their download page.
- Including both the ARM and x86 libraries (Android Studio complains that the classes are defined twice which is what I would expect).
- Copying the 'x86' from src/main/jniLibs from within the x86 module and pasting it into the arm module which my application references.
- Using 'XWalkActivity' (https://crosswalk-project.org/apis/embeddingapidocs_v7/index.html) not only did this not work on x86 but also stopped working on my ARM device.
The closest I've got is the code at the bottom of this post which allows me to install the application on my emulator but does not load the web content.
Few key things to note from my stack track (at the end of this question).
12-12 17:09:43.243 12271-12294/com.firstapp.crosswalktest W/chromium: [WARNING:xwalk_external_extension.cc(58)] Error loading extension '/data/app/com.firstapp.crosswalktest-2/lib/x86/libxwalkdummy.so': couldn't get XW_Initialize function.
12-12 17:09:43.243 12271-12294/com.firstapp.crosswalktest W/chromium: [WARNING:xwalk_extension_server.cc(407)] Failed to initialize extension: /data/app/com.firstapp.crosswalktest-2/lib/x86/libxwalkdummy.so
12-12 17:09:43.243 12271-12294/com.firstapp.crosswalktest W/chromium: [WARNING:xwalk_external_extension.cc(58)] Error loading extension '/data/app/com.firstapp.crosswalktest-2/lib/x86/libxwalkcore.so': couldn't get XW_Initialize function.
12-12 17:09:43.243 12271-12294/com.firstapp.crosswalktest W/chromium: [WARNING:xwalk_extension_server.cc(407)] Failed to initialize extension: /data/app/com.firstapp.crosswalktest-2/lib/x86/libxwalkcore.so
This looks problematic however this also occurs when I run it on my ARM device and that works as expected. Does anyone know what these are and the implications?
12-12 17:09:43.013 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Init embedded mode
12-12 17:09:43.013 12271-12271/com.firstapp.crosswalktest D/XWalkLib: [App Version] build:22.52.561.4, api:7, min_api:7
12-12 17:09:43.014 12271-12271/com.firstapp.crosswalktest D/XWalkLib: [Lib Version] build:22.52.561.4, api:7, min_api:5
12-12 17:09:43.014 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Crosswalk download mode: false
12-12 17:09:43.014 12271-12271/com.firstapp.crosswalktest D/XWalkLib: XWalk core version matched
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest I/cr_LibraryLoader: Time to load native libraries: 1 ms (timestamps 144-145)
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest I/cr_LibraryLoader: Expected native library version number "", actual native library version number ""
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Native library is built for IA
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest D/XWalkLib: XWalk core architecture matched
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Running in embedded mode
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Init core bridge
This looks like the set up that XWalk goes through, note that 'XWalk core architecture matched'; I would read from this that it has the native libraries it needs so perhaps something else is the issue?
Stack trace from once the application loads:
12-12 17:09:39.436 2087-2087/com.google.android.googlequicksearchbox:search I/MicroDetectionWorker: Micro detection mode: [mDetectionMode: [1]].
12-12 17:09:39.436 2087-2087/com.google.android.googlequicksearchbox:search I/AudioController: Using mInputStreamFactoryBuilder
12-12 17:09:39.440 2087-12244/com.google.android.googlequicksearchbox:search I/MicroRecognitionRunner: Starting detection.
12-12 17:09:39.440 2087-11832/com.google.android.googlequicksearchbox:search I/MicrophoneInputStream: mic_starting com.google.android.apps.gsa.staticplugins.z.c@eee8318
12-12 17:09:39.441 1246-1624/? W/APM_AudioPolicyManager: getInputForAttr() failed opening input: samplingRate 16000, format 1, channelMask 10
12-12 17:09:39.441 2087-11832/com.google.android.googlequicksearchbox:search E/AudioRecord: Could not get audio input for session 265, record source 1999, sample rate 16000, format 0x1, channel mask 0x10, flags 0
12-12 17:09:39.442 2087-11832/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -22.
12-12 17:09:39.442 2087-11832/com.google.android.googlequicksearchbox:search E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
12-12 17:09:39.442 2087-11832/com.google.android.googlequicksearchbox:search I/MicrophoneInputStream: mic_started com.google.android.apps.gsa.staticplugins.z.c@eee8318
12-12 17:09:39.443 2087-11832/com.google.android.googlequicksearchbox:search E/ActivityThread: Failed to find provider info for com.google.android.apps.gsa.testing.ui.audio.recorded
12-12 17:09:39.445 2087-2087/com.google.android.googlequicksearchbox:search I/MicroDetectionWorker: onReady
12-12 17:09:39.447 2087-12244/com.google.android.googlequicksearchbox:search W/SpeechLevelGenerator: Really low audio levels detected. The audio input may have issues.
12-12 17:09:39.453 2087-11832/com.google.android.googlequicksearchbox:search I/MicrophoneInputStream: mic_close com.google.android.apps.gsa.staticplugins.z.c@eee8318
12-12 17:09:39.453 2087-12244/com.google.android.googlequicksearchbox:search I/MicroRecognitionRunner: Detection finished
12-12 17:09:39.454 2087-12244/com.google.android.googlequicksearchbox:search W/ErrorReporter: reportError [type: 211, code: 524300]: Error reading from input stream
12-12 17:09:39.455 2087-2242/com.google.android.googlequicksearchbox:search I/MicroRecognitionRunner: Stopping hotword detection.
12-12 17:09:39.455 2087-12244/com.google.android.googlequicksearchbox:search W/ErrorProcessor: onFatalError, processing error from engine(4)
com.google.android.apps.gsa.shared.speech.a.g: Error reading from input stream
at com.google.android.apps.gsa.staticplugins.recognizer.i.a.a(SourceFile:342)
at com.google.android.apps.gsa.staticplugins.recognizer.i.a$1.run(SourceFile:1367)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at com.google.android.apps.gsa.shared.util.concurrent.a.ak.run(SourceFile:66)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
at com.google.android.apps.gsa.shared.util.concurrent.a.ad$1.run(SourceFile:85)
Caused by: com.google.android.apps.gsa.shared.exception.GsaIOException: Error code: 393238 | Buffer overflow, no available space.
at com.google.android.apps.gsa.speech.audio.Tee.g(SourceFile:2531)
at com.google.android.apps.gsa.speech.audio.ap.read(SourceFile:555)
at java.io.InputStream.read(InputStream.java:101)
at com.google.android.apps.gsa.speech.audio.al.run(SourceFile:362)
at com.google.android.apps.gsa.speech.audio.ak$1.run(SourceFile:471)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at com.google.android.apps.gsa.shared.util.concurrent.a.ak.run(SourceFile:66)
at com.google.android.apps.gsa.shared.util.concurrent.a.ax.run(SourceFile:139)
at com.google.android.apps.gsa.shared.util.concurrent.a.ax.run(SourceFile:139)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
at com.google.android.apps.gsa.shared.util.concurrent.a.ad$1.run(SourceFile:85)
12-12 17:09:39.455 2087-12244/com.google.android.googlequicksearchbox:search I/AudioController: internalShutdown
12-12 17:09:39.457 2087-2087/com.google.android.googlequicksearchbox:search I/MicroDetector: Keeping mic open: false
12-12 17:09:39.457 2087-2087/com.google.android.googlequicksearchbox:search I/MicroDetectionWorker: #onError(false)
12-12 17:09:39.457 2087-12243/com.google.android.googlequicksearchbox:search I/DeviceStateChecker: DeviceStateChecker cancelled
12-12 17:09:42.710 12251-12251/? D/AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 2000 <<<<<<
12-12 17:09:42.711 12251-12251/? D/AndroidRuntime: CheckJNI is ON
12-12 17:09:42.711 12251-12251/? E/cutils-trace: Error opening trace file: Permission denied (13)
12-12 17:09:42.736 12251-12251/? W/art: Unexpected CPU variant for X86 using defaults: x86
12-12 17:09:42.739 12251-12251/? D/ICU: No timezone override file found: /data/misc/zoneinfo/current/icu/icu_tzdata.dat
12-12 17:09:42.745 12255-12255/? D/AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 2000 <<<<<<
12-12 17:09:42.746 12255-12255/? D/AndroidRuntime: CheckJNI is ON
12-12 17:09:42.746 12255-12255/? E/cutils-trace: Error opening trace file: Permission denied (13)
12-12 17:09:42.748 12251-12251/? E/memtrack: Couldn't load memtrack module (No such file or directory)
12-12 17:09:42.748 12251-12251/? E/android.os.Debug: failed to load memtrack module: -2
12-12 17:09:42.749 12251-12251/? I/Radio-JNI: register_android_hardware_Radio DONE
12-12 17:09:42.758 12251-12251/? D/AndroidRuntime: Calling main entry com.android.commands.wm.Wm
12-12 17:09:42.759 12251-12251/? D/AndroidRuntime: Shutting down VM
12-12 17:09:42.761 12251-12262/? W/art: Thread attaching while runtime is shutting down: Binder:12251_1
12-12 17:09:42.761 12251-12262/? I/AndroidRuntime: NOTE: attach of thread 'Binder:12251_1' failed
12-12 17:09:42.776 12255-12255/? W/art: Unexpected CPU variant for X86 using defaults: x86
12-12 17:09:42.780 12255-12255/? D/ICU: No timezone override file found: /data/misc/zoneinfo/current/icu/icu_tzdata.dat
12-12 17:09:42.793 12255-12255/? E/memtrack: Couldn't load memtrack module (No such file or directory)
12-12 17:09:42.793 12255-12255/? E/android.os.Debug: failed to load memtrack module: -2
12-12 17:09:42.794 12255-12255/? I/Radio-JNI: register_android_hardware_Radio DONE
12-12 17:09:42.799 12255-12255/? D/AndroidRuntime: Calling main entry com.android.commands.am.Am
12-12 17:09:42.803 1461-1914/system_process I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.firstapp.crosswalktest/.MainActivity} from uid 2000 on display 0
12-12 17:09:42.811 12255-12255/? D/AndroidRuntime: Shutting down VM
12-12 17:09:42.815 12271-12271/? I/art: Not late-enabling -Xcheck:jni (already on)
12-12 17:09:42.816 12271-12271/? W/art: Unexpected CPU variant for X86 using defaults: x86
12-12 17:09:42.822 1461-1476/system_process I/ActivityManager: Start proc 12271:com.firstapp.crosswalktest/u0a76 for activity com.firstapp.crosswalktest/.MainActivity
12-12 17:09:42.943 1461-1476/system_process W/art: Long monitor contention with owner android.display (1509) at int com.android.server.wm.WindowManagerService.relayoutWindow(com.android.server.wm.Session, android.view.IWindow, int, android.view.WindowManager$LayoutParams, int, int, int, int, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.content.res.Configuration, android.view.Surface)(WindowManagerService.java:2850) waiters=0 in void com.android.server.wm.WindowManagerService.resumeKeyDispatching(android.os.IBinder) for 120ms
12-12 17:09:42.944 1461-1495/system_process W/art: Long monitor contention with owner Binder:1461_2 (1476) at void com.android.server.am.ActivityManagerService.activityPaused(android.os.IBinder)(ActivityManagerService.java:6915) waiters=0 in void com.android.server.am.ActivityManagerService.dispatchUidsChanged() for 132ms
12-12 17:09:42.958 2087-2087/com.google.android.googlequicksearchbox:search W/SearchService: Abort, client detached.
12-12 17:09:43.013 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Init embedded mode
12-12 17:09:43.013 12271-12271/com.firstapp.crosswalktest D/XWalkLib: [App Version] build:22.52.561.4, api:7, min_api:7
12-12 17:09:43.014 12271-12271/com.firstapp.crosswalktest D/XWalkLib: [Lib Version] build:22.52.561.4, api:7, min_api:5
12-12 17:09:43.014 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Crosswalk download mode: false
12-12 17:09:43.014 12271-12271/com.firstapp.crosswalktest D/XWalkLib: XWalk core version matched
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest I/cr_LibraryLoader: Time to load native libraries: 1 ms (timestamps 144-145)
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest I/cr_LibraryLoader: Expected native library version number "", actual native library version number ""
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Native library is built for IA
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest D/XWalkLib: XWalk core architecture matched
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Running in embedded mode
12-12 17:09:43.045 12271-12271/com.firstapp.crosswalktest D/XWalkLib: Init core bridge
12-12 17:09:43.057 12271-12271/com.firstapp.crosswalktest W/XWalkInternalResources: org.xwalk.core.R$styleable.ButtonCompat is not int.
12-12 17:09:43.057 12271-12271/com.firstapp.crosswalktest W/XWalkInternalResources: org.xwalk.core.R$styleable.TextViewWithLeading is not int.
12-12 17:09:43.066 12271-12271/com.firstapp.crosswalktest W/XWalkInternalResources: org.xwalk.core.R$styleable.ButtonCompat is not int.
12-12 17:09:43.066 12271-12271/com.firstapp.crosswalktest W/XWalkInternalResources: org.xwalk.core.R$styleable.TextViewWithLeading is not int.
12-12 17:09:43.069 12271-12271/com.firstapp.crosswalktest W/XWalkInternalResources: org.xwalk.core.R$styleable.ButtonCompat is not int.
12-12 17:09:43.069 12271-12271/com.firstapp.crosswalktest W/XWalkInternalResources: org.xwalk.core.R$styleable.TextViewWithLeading is not int.
12-12 17:09:43.076 12271-12271/com.firstapp.crosswalktest W/XWalkInternalResources: org.xwalk.core.R$styleable.ButtonCompat is not int.
12-12 17:09:43.076 12271-12271/com.firstapp.crosswalktest W/XWalkInternalResources: org.xwalk.core.R$styleable.TextViewWithLeading is not int.
12-12 17:09:43.082 12271-12271/com.firstapp.crosswalktest I/cr_LibraryLoader: Expected native library version number "", actual native library version number ""
12-12 17:09:43.082 12271-12271/com.firstapp.crosswalktest I/chromium: [INFO:library_loader_hooks.cc(143)] Chromium logging enabled: level = 0, default verbosity = 0
12-12 17:09:43.084 12271-12271/com.firstapp.crosswalktest I/cr_BrowserStartup: Initializing chromium process, singleProcess=true
[ 12-12 17:09:43.098 12271:12271 D/ ]
HostConnection::get() New Host Connection established 0x9b4409a0, tid 12271
12-12 17:09:43.150 12271-12300/com.firstapp.crosswalktest W/cr_media: Requires BLUETOOTH permission
12-12 17:09:43.153 12271-12271/com.firstapp.crosswalktest E/chromium: [ERROR:xwalk_platform_notification_service.cc(143)] Not implemented reached in virtual bool xwalk::XWalkPlatformNotificationService::GetDisplayedPersistentNotifications(content::BrowserContext*, std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >*)
12-12 17:09:43.167 12271-12271/com.firstapp.crosswalktest E/chromium: [ERROR:xwalk_browser_context.cc(87)] Failed to read preference, error num: 0
12-12 17:09:43.168 12271-12271/com.firstapp.crosswalktest D/XWalkContent: CompositingSurfaceType is SurfaceView
12-12 17:09:43.209 12271-12271/com.firstapp.crosswalktest W/art: Attempt to remove non-JNI local reference, dumping thread
12-12 17:09:43.243 12271-12294/com.firstapp.crosswalktest W/chromium: [WARNING:xwalk_external_extension.cc(58)] Error loading extension '/data/app/com.firstapp.crosswalktest-2/lib/x86/libxwalkdummy.so': couldn't get XW_Initialize function.
12-12 17:09:43.243 12271-12294/com.firstapp.crosswalktest W/chromium: [WARNING:xwalk_extension_server.cc(407)] Failed to initialize extension: /data/app/com.firstapp.crosswalktest-2/lib/x86/libxwalkdummy.so
12-12 17:09:43.243 12271-12294/com.firstapp.crosswalktest W/chromium: [WARNING:xwalk_external_extension.cc(58)] Error loading extension '/data/app/com.firstapp.crosswalktest-2/lib/x86/libxwalkcore.so': couldn't get XW_Initialize function.
12-12 17:09:43.243 12271-12294/com.firstapp.crosswalktest W/chromium: [WARNING:xwalk_extension_server.cc(407)] Failed to initialize extension: /data/app/com.firstapp.crosswalktest-2/lib/x86/libxwalkcore.so
12-12 17:09:43.267 12271-12271/com.firstapp.crosswalktest I/cr_Ime: ImeThread is not enabled.
12-12 17:09:43.282 12271-12318/com.firstapp.crosswalktest I/chromium: [INFO:xwalk_extension_renderer_controller.cc(42)] EXTENSION PROCESS DISABLED.
12-12 17:09:43.301 12271-12323/com.firstapp.crosswalktest E/libEGL: validate_display:99 error 3008 (EGL_BAD_DISPLAY)
12-12 17:09:43.320 12271-12323/com.firstapp.crosswalktest I/VideoCapabilities: Unsupported profile 4 for video/mp4v-es
[ 12-12 17:09:43.326 12271:12323 D/ ]
HostConnection::get() New Host Connection established 0xa8b89800, tid 12323
12-12 17:09:43.333 1228-1268/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property
12-12 17:09:43.487 12271-12326/com.firstapp.crosswalktest I/OpenGLRenderer: Initialized EGL, version 1.4
12-12 17:09:43.487 12271-12326/com.firstapp.crosswalktest D/OpenGLRenderer: Swap behavior 1
[ 12-12 17:09:43.488 12271:12326 D/ ]
HostConnection::get() New Host Connection established 0x87a05940, tid 12326
12-12 17:09:43.562 12271-12271/com.firstapp.crosswalktest W/art: Attempt to remove non-JNI local reference, dumping thread
12-12 17:09:43.958 1461-1509/system_process I/ActivityManager: Displayed com.firstapp.crosswalktest/.MainActivity: +1s147ms
12-12 17:09:43.994 12271-12271/com.firstapp.crosswalktest E/chromium: [ERROR:layer_tree_host_impl.cc(2233)] Forcing zero-copy tile initialization as worker context is missing
12-12 17:09:44.093 12271-12271/com.firstapp.crosswalktest W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 12271
12-12 17:09:44.102 12271-12323/com.firstapp.crosswalktest E/chromium: [ERROR:buffer_manager.cc(438)] [.DisplayCompositor-0x84d23400]GL ERROR :GL_INVALID_OPERATION : glBufferData: <- error from previous GL command
12-12 17:09:44.352 1228-1228/? W/SurfaceFlinger: couldn't log to binary event log: overflow.
12-12 17:09:44.640 12271-12323/com.firstapp.crosswalktest E/chromium: [ERROR:texture_manager.cc(2942)] [.RenderCompositor-0x88b75800]GL ERROR :GL_INVALID_OPERATION : glTexImage2D: <- error from previous GL command
12-12 17:09:45.247 12271-12291/com.firstapp.crosswalktest D/NetworkSecurityConfig: No Network Security Config specified, using platform default
My project structure:
MainActivity.java
package com.firstapp.crosswalktest;
import org.xwalk.core.XWalkPreferences;
import org.xwalk.core.XWalkView;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
private XWalkView mXWalkView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XWalkPreferences.setValue(XWalkPreferences.REMOTE_DEBUGGING, true);
mXWalkView = (XWalkView) findViewById(R.id.activity_main);
mXWalkView.load("http://crosswalk-project.org/", null);
}
}
activity_main.xml
<org.xwalk.core.XWalkView android:id="@+id/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</org.xwalk.core.XWalkView>