Opakowanie strony internetowej w APK

Przygotowałem aplikację webową, którą chciałbym dystrybuować. Chcę, by była dostępna m.in na Androidzie. Znalazłem w sieci masę artykułów, ale nigdzie nie jest napisane, jak tego dokonać samemu, a proponowane rozwiązania zawsze zawierały jakiś feler, np. apka musiałaby ładować dane z sieci.

Czy jest jakiś sposób, by dystrybuować moją apkę i by jej otwarcie powodowało załadowanie domyślnej przeglądarki Androida bez elementów interfejsu - tylko do wyświetlania mojej strony?

Zobacz czy PWA (progressive web apps) Ci podpasuje.

Znalazłem NativeScript z możliwością dodania WebView - chyba powinno działać. Progressive Web Apps sprawdzę.

Progressive Web Applications to jest to, tylko mam problem - Chrome żąda zastosowania service worker. Czy mam możliwość stosowania Service Worker bez nazwy domeny, tzn. dla plików z archiwum? To wydaje się być bez sensu, chociaż jednak service worker w tym przypadku pełni rolę serwera web.

Nie znam się na PWA bo dla mnie to kiepska technologia. Z service workerów wiele rzeczy korzysta i SW nie pełni roli serwera.

Obawiam się, że w ogóle nie wchodzi w grę użycie archiwum do przechowywania plików aplikacji PWA. PWA pobiera wszystkie potrzebne pliki z serwera WWW i trzyma je w cache przeglądarki oraz pozwala utworzyć skrót w telefonie do uruchamiania bezpośrednio tej aplikacji w silniku przeglądarki, lecz bez większości funkcji typowej przeglądarki.

Dobra. Z pomocą Android Studio zrobiłem wstępną apkę - jeszcze nie stworzyłem pliku .apk, ale program ładuje się do wirtualnej maszyny Androida i wisi podczas ładowania. Wykorzystałem klasę WebView. Całość w Javie nie zajmuje dużo. Mam nadzieję, że nie będę mieć problemów w związku z Oraclem (są nawet słuchy, że w przyszłości może nie być Javy w Androidzie).

Ponieważ na maszynie wirtualnej cały czas pobiera potrzebne pliki (bytecod WebAssembly, itd.), to postaram się wgrać apkę na telefon i przetestować.

Toczą batalię o to już kilka lat, więc wątpię by się to nagle z dnia na dzień zmieniło. Szybciej google skończy nowy system (Fuchsia), który zastąpi androida. Wcale bym się nie zdziwił gdyby Fuchsia właśnie z tego powodu powstała - by zastąpić androida i odejść od Java i chorego oracle.

Jak używasz WebView to inaczej to działać nie będzie. To działa jak aplikacja w przeglądarce, więc za każdym razem będzie pobierana z serwera. Pewnie da się coś zadziałać z cache WebView, ale to trzeba szukać odpowiedzi w dokumentacji.

Ja to robię ładując file:///android_assets/strona.html, czyli leci przez system plików. Jednak racja, że na chromie nie działa to, gdyż pobieranie elementów strony z dysku twardego jest zablokowane z powodów bezpieczeństwa. Może to z tego samego powodu?

Wszystko pięknie działa - wystarczyło ustawić odpowiednie atrybuty „kontrolki” WebView, by móc ładować dane z pamięci wewnętrznej urządzenia (chodzi mi o /android_asset/). Jedyny problem w tym, że testowany Nexus4 nie ma obsługi WebAssembly.

Na tej stronie:
https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/6iqiskBdDQE
Jest napisane, iż WebView powinna wspierać WebAssembly. Na jakiej maszynie testować swoją apkę - oczywiście, że w minimalnych wymaganiach umieszczę nazwę telefonów do wyboru.

Temat w natywnych aplikacja z kontrolkami typu WebView nie jest prosty i trzeba się mocno wgryźć w szczegóły.

Domyślny WebView wykorzystuje silnik renderujący domyślnie dostępny w danym systemie.
O ile w przypadku takich systemów jak Linux lub Windows (MacOX chyba też) można stworzyć WebView bazujące na silniku konkretnej przeglądarki, np. Chromium lub Firefox, to niestety z systemami mobilnymi sprawa jest bardziej skomplikowana.
W systemach mobilnych nie ma możliwości dodania własnego silnika renderującego. Nawet gdy tworzysz przeglądarkę mobilną to jesteś ograniczony do silnika wbudowanego w system.

Z różnymi wersjami systemu masz dostęp do różnych wersji silnika renderującego, a tym samym każda wersja systemu będzie w różnym stopniu wspierała standardy.

Ciebie interesuje w tym momencie android i to od wersji androida będzie zależało jakie standardy obsługuje przeglądarka czyli u Ciebie WebView.

Ty dodatkowo chcesz uruchomić WebAseembly które dopiero od kilku miesięcy nadaje się do eksperymentów na większą skalę.

Jeśli więc chcesz dowiedzieć się jaka wersja androida wspiera WA to najlepiej skożystać ze strony caniuse. Ty patrzysz na projekt chromium - przeglądarki desktopowej.
Ok, mobilny chrom nieco jest oderwany od zasad które opisałem wyżej, ale z niego nie skorzystasz przy pomocy WebView dlatego na stronie caniuse interesuje Cię rubryka z informacjami o wsparciu androida dla WA: https://caniuse.com/#search=webassembly
Jednakże tutaj widać jakby kompatybilność nie była do końca aktualna. Dlatego warto zerknąć tutaj: https://developer.mozilla.org/en-US/docs/WebAssembly#Browser_compatibility i już widać od której wersji androida WebView wspiera WebAssembly.
Teraz tylko musisz gdzieś znaleźć informacje o tym jakie wersje WebView znajdują się w jakich wersjach androida. Tutaj znalazłem jakiś punkt zaczepienia: https://developer.chrome.com/multidevice/webview/overview

Zobacz też czy nie wystarczy zaktualizować: https://play.google.com/store/apps/details?id=com.google.android.webview
Z tego co widzę od wersji 4.4 jest on rozprowadzany jako subsystem.

Oczywiście moja wiedza w tym temacie jest nieco posiekana dlatego mogę się mylić w niektórych kwestiach bądź może ona nieco rozbiegać się z obecną rzeczywistością.

Wszystko zrobiłem. Teraz kwestia dystrybucji. Umieściłem apkę na stronce, pobrałem na telefon i próbuję zainstalować. Telefon odpowiada, że aplikacja nie została zainstalowana. Mam włączone nieznane źródła. Jest to jednak materiał na osobny temat.

Ogólnie, to Webassembly wspiera WebView w Androidzie 5.x i nowszych.