Эта заметка-обзор продолжит короткий цикл из двух статей, посвященных интересному проекту под названием 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.


С версии 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 призвано заменить стандартный системный компонент. Насколько необходима дополнительная библиотека в таком случае сложно сказать. Возможно, для некоторых проектов полная идентичность поведения на всех версиях ОС перевесит увеличение размера и необходимость обновления ещё одной библиотеки.

Поделиться с друзьями
-->

Комментарии (14)


  1. comerc
    25.08.2016 20:30

    А как там поживает iOS ?


    1. Sergiy
      25.08.2016 21:04
      +1

      Свое пилят WKWebView


    1. comhot
      26.08.2016 09:46
      +2

      Да, под iOS они делают расширение системного WKWebView. Поэтому поддержка начиная только с iOS 8+. Здесь чуть больше подробностей.


  1. VitaZheltyakov
    25.08.2016 23:47
    +2

    С пятой версией Android все остается точно также — Blacklist GPU в реализации от Google включен. Поэтому, если разработчик ориентируется не только на именитые флагманские устройства, то Crosswalk (с отключенным Blacklist GPU) является более лучшим решением


  1. Mamboking
    26.08.2016 09:43
    +2

    Может ли Crosswalk сейчас послужить хорошей заменой системному WebView?

    Не только может, но и служит. Фактически в гибридных приложениях это единственный способ (кроме оптимизации кода) улучшить производительность.


    1. Lorys
      26.08.2016 09:55

      А как быть с тем, что такое приложение делает APK на 15+ МБ больше и нормально так отъедает памяти и процессора?


    1. Mamboking
      26.08.2016 10:04

      Идти на компромиссы. Сейчас у меня гибридное приложение на Ionic Framework 1.3 занимает 45Мб. Много это или мало?


      1. comerc
        26.08.2016 14:30
        -2

        А почему не React Native?


        1. Mamboking
          26.08.2016 14:52

          Наверное потому что я не знаком с React, но знаком с Angular.


    1. comhot
      26.08.2016 13:47

      Кроме размера, есть ещё один неприятный момент. Crosswalk достаточно большой и добавляя его в крупный проект есть риск столкнуться с проблемой «Error:The number of method references in a .dex file cannot exceed 64K». В общем случае решается использованием ProGuard, но могут быть и сложности.


      1. ArtRoman
        26.08.2016 14:19

        – ProGuard для релиза должен быть включён по умолчанию (при этом обфускацию можно не использовать).
        – можно использовать MultiDex — разделение модулей/библиотек на разные dex-файлы. Включается одним флагом и работает само при targetSdk ? 21, что ускоряет сборку/установку при разработке (позволяет не запускать ProGuard на каждый билд).


      1. AnarchyMob
        26.08.2016 16:19

        MultiDex support же...


      1. comhot
        26.08.2016 16:38

        С Multidex всё хорошо. Но всё же лучше оптимизировать, а не усложнять. Плюс у его использования есть свои узкие места, то же увеличения времени загрузки и возможный ANR на «слабых» устройствах.


  1. Mamboking
    26.08.2016 10:06
    +1

    Интересно, кстати, как с этим (размером приложения) дела обстоят в NativeScript?