Эта заметка-обзор продолжит короткий цикл из двух статей, посвященных интересному проекту под названием Crosswalk. В ней я расскажу о том, что изменилось в проекте Crosswalk с версии 14.43.343.17 и стало ли удобнее им пользоваться теперь.
Напомню, что Crosswalk Project — это runtime построенный на технологиях open source для HTML приложений. Основой для Crosswalk Project служит Google Chromium. Crosswalk Project также является open source проектом и распространяется под BSD License. В общем, если вы всё ещё поддерживаете ранние версии Android, то это неплохая замена для системного Android WebView.
Предыдущие статьи вы можете найти по следующим ссылкам:
- Crosswalk Project — замена Android WebView. Интеграция в проект
- Crosswalk Project — замена Android WebView. Проблемы интеграции
Изменения в Crosswalk.
С версии 14 до версии 20 в проект внесли очень много изменений и доработок, все не имеет смысла перечислять. Вы сами можете ознакомиться с ними в release notes.
Я перечислю только некоторые, наиболее заинтересовавшие меня:
- Rebase to Chromium 50
- Support external extensions for Crosswalk Webview on Android
- Add ability to intercept touch events on the XWalkView
- When onReceivedLoadError occurs, a Toast notification is displayed to the user instead of a dialog (as the user cannot do anything to respond to the error)
- New helper class XWalkInitializer to initialize XWalkView asynchronously
- Size optimizations (Enable ProGuard for Crosswalk to compress APK size, LZMA support etc.)
Также в проект внесли большое количество исправлений, наиболее критичные перечислены там же.
Дополнительные детали.
В предыдущих статьях я описывал ряд проблем и их решений для предыдущих версий Crosswalk. Радует, что многие из них решены в самом проекте и теперь не нужны «танцы с бубном».
Классы XWalkCookieManager и XWalkSettings перенесли в более подходящие для них пакеты:
org.xwalk.core.internal.XWalkCookieManager; → org.xwalk.core.XWalkCookieManager
org.xwalk.core.internal.XWalkSettings → org.xwalk.core.XWalkSettings
XWalkSettings доступен напрямую через метод в объекте XWalkView. Также сам XWalkView нам может вернуть и свой User-Agent. Теперь для всего этого нет необходимости прибегать к использованию reflection.
Добавился в Crosswalk (в класс XWalkResourceClient) и новый вызов для обработки запросов к ресурсам:
public XWalkWebResourceResponse shouldInterceptLoadRequest(XWalkView view, XWalkWebResourceRequest request)
Аналог очень удобного и доступного с Android API 21 вызова в стандартном WebView:
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
Теперь можно легко узнать с помощью какого метода был сделан запрос: GET или POST.
Также в XWalkView был добавлен специальный метод для получения изображения контента:
public void captureBitmapAsync(XWalkGetBitmapCallback callback)
Стал корректно вызываться метод onBackPressed() и появилась возможность использовать метод setOnTouchListener(OnTouchListener l). Так что теперь нет нужды перехватывать нажатие кнопки Back и touch events в dispatch методах.
Документацию по последней и всем предыдущим версиям API вы можете найти здесь.
Некоторые проблемы в новых версиях.
На данный момент последняя доступная версия в репозитории 20.50.533.12, но в отличие от предпоследний версии 19.49.514.5, она уже имеет значение minSdkVersion равное API 16. Crosswalk 19 же всё ещё поддерживает все версии Android начиная с API 14.
Несмотря на то, что ещё для Crosswalk 16 было заявлено: «Android support libraries (e.g. support-v4, support-v7 etc) are no longer bundled by Crosswalk...». С версии 16 и до последней 20 некорректно прописан импорт для библиотеки support-v4, поэтому, если вы используете в своём проекте конкретную версию этой библиотеки и не хотите, чтобы проект автоматически собирался с последний версией, то необходимо исключить её при добавлении Crosswalk в ваш проект:
compile('org.xwalk:xwalk_core_library:19.49.514.5') {
// avoid pulling incorrect version of support library
exclude group: 'com.android.support', module: 'support-v4'
}
Crosswalk Lite, уменьшаем размер сборки.
В прошлых статьях я не упомянул о достаточно существенной проблеме — увеличении размера сборки при добавлении Crosswalk. Сам Crosswalk собирается для двух архитектур: x86 и armv7. Соответственно библиотеки для каждой из них имеют размер ~20Mb, т.е. если собирать универсальный билд, то overhead составит порядка 40Mb.
Есть 2 возможности улучшить ситуацию с дополнительным размером: собирать отдельные apk для каждой архитектуры или использовать облегченную версию Crosswalk — Crosswalk Lite. Crosswalk Lite — это попытка решить проблему путём отказа от некоторых возможностей библиотеки.
Вот более точные данные по размеру Lite и обычной версии Crosswalk: Crosswalk Lite 10-15Mb vs. Crosswalk 20Mb.
Однако, кроме ограниченного набора возможностей, у Crosswalk Lite есть ещё ряд минусов:
- Activity необходимо наследовать от XWalkActivity;
- Application необходимо наследовать от XWalkApplication;
- инициализацию необходимо проводить асинхронно в специальном методе, при этом на первом запуске распаковывается сама библиотека и пользователь видит сообщение об этом.
К сожалению последняя доступная на данный момент версия Crosswalk Lite 17.46.460.1 отказалась запускаться с ошибкой (как и 2 её предшественницы):
W/XWalkInternalResources: org.xwalk.core.R$styleable.ButtonCompat is not int.
E/SysUtils: ApplicationContext is null in ApplicationStatus
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 22829 (osswalkembedded)
Поэтому, единственным реальным методом для уменьшения размера является сборка отдельных билдов для каждой архитектуры.
Примеры добавлены в обновлённый тестовый проект, доступный на GitHub.
Выводы.
В последних версиях учтены многие, в том числе и упоминаемые мной, недочёты предыдущих релизов. И, если вы уже используете Crosswalk, то вам однозначно стоит перейти на новые версии.
Однако, остаётся другой вопрос. Может ли Crosswalk сейчас послужить хорошей заменой системному WebView? Если вы поддерживаете старые версии Android (в том числе версии Android 4 Jelly Bean и KitKat), то, очевидно, Crosswalk может вам пригодиться. Если же вы планируете поддерживать только Android 5+, то здесь ответ не очевиден.
С 5ой версии Android стало доступно обновление системного WebView из Google Play (и появились новые, удобные запросы в API), а с 7ой версии Android приложение Google Chrome призвано заменить стандартный системный компонент. Насколько необходима дополнительная библиотека в таком случае сложно сказать. Возможно, для некоторых проектов полная идентичность поведения на всех версиях ОС перевесит увеличение размера и необходимость обновления ещё одной библиотеки.
Автор: comhot