Crosswalk Project — заміна Android WebView. Розвиток проекту


Ця замітка-огляд продовжить короткий цикл з двох статей, присвячених цікавого проекту під назвою 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 покликане замінити стандартний системний компонент. Наскільки необхідна додаткова бібліотека в такому випадку складно сказати. Можливо, для деяких проектів повна ідентичність поведінки на всіх версіях ОС переважить збільшення розміру і необхідність оновлення ще однієї бібліотеки.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.