Android でのウェブ

さまざまなコンポーネントを使用して Android アプリ内でウェブ コンテンツをレンダリングする方法。

Android プラットフォームは 10 年以上前から存在しており、早い時期からウェブに広く対応してきました。WebView が付属しています。WebView は、デベロッパーが独自の Android アプリ内でウェブを使用できるようにするコンポーネントです。さらに、Android では、デベロッパーが独自のブラウザ エンジンをプラットフォームに取り入れることで、競争とイノベーションを促進できます。

デベロッパーはさまざまな方法で Android アプリにウェブを組み込むことができます。WebView は、広告のレンダリング、Android UI 要素とともに使用されるレイアウト コンポーネント、HTML 5 ゲームのパッケージ化によく使用されます。デベロッパーはカスタムタブを使用して、アプリ内ブラウザを構築し、サードパーティのウェブ コンテンツにシームレスなナビゲーション エクスペリエンスを提供できます。また、信頼できるウェブ アクティビティを使用すると、Google Play ストアからダウンロードした Android アプリでプログレッシブ ウェブアプリ(PWA)を使用できます。

Android WebView

WebView を使用すると、デベロッパーは Android アプリ内で最新の HTML、CSS、JavaScript にアクセスし、コンテンツを APK 内で配布したり、インターネットでホストしたりできます。Android の最も柔軟で強力なコンポーネントの一つで、ウェブ コンテンツが Android アプリに含まれるほとんどのユースケースで使用できます。AdMob などの広告サービスの強化から、WebGL などの最新の API を使用した HTML5 ゲームの構築とリリースまで、さまざまな用途に使用できます。

ただし、アプリ内ブラウザの作成や Android アプリに PWA の組み込みに使用する場合、WebView にはウェブ プラットフォームのセキュリティ、機能、機能が不足しています。

アプリ内ブラウザの課題

時間が経つにつれて、サードパーティ ウェブサイトにアクセスするユーザーに、よりシームレスなエクスペリエンスを提供することを目標として、サードパーティのコンテンツを Android アプリに組み込んだブラウザ エクスペリエンスを構築するデベロッパーがますます増えています。こうしたエクスペリエンスが アプリ内ブラウザと呼ばれるようになりました

WebView は、最新のウェブ技術スタックを幅広くサポートしており、WebGL などの最新のウェブ API の多くをサポートしています。ただし、WebView は本質的にウェブ UI ツールキットです。ウェブ プラットフォームのすべての機能に対応するものではありません。API にすでに OS レベルの代替機能(ウェブ Bluetooth など)がある場合、またはプッシュ通知などのブラウザ UI を実装する必要がある場合、API はサポートされません。ウェブ プラットフォームが進化し、Android アプリでのみ利用可能だった機能が追加されるにつれて、このギャップはさらに大きくなっていきます。サードパーティ コンテンツを開く際に使用する機能はアプリ デベロッパーが制御できないため、WebView はアプリ内ブラウザやプログレッシブ ウェブアプリに適しています。WebView がすべてのウェブ プラットフォーム機能のサポートを実装しているとしても、デベロッパーは、権限やプッシュ通知などの機能のためにコードを記述し、独自の UI を実装する必要があるため、ユーザーに対する一貫性を実現するのは困難です。

WebView をアプリ内ブラウザとして使用する場合のセキュリティに関する考慮事項

WebView は、レンダリングされたコンテンツ(Cookie や DOM など)に対する完全アクセス権を埋め込みアプリに付与します。これらはユーザーからの高い信頼を必要とする強力な機能です。

WebView はブラウザを構築するためのフレームワークとして使用することを意図したものではないため、最新のブラウザで利用できるセキュリティ機能はありません。

マルチプロセス アーキテクチャとサイト分離

ブラウザは、信頼できないコンテンツのレンダリングや実行も安全に行えるように設計されています。最新のブラウザでは、信頼できないコンテンツや悪質なコンテンツにアクセスしながらもユーザーの安全を確保するため、マルチプロセス アーキテクチャサイト分離などの手法が採用されています。

マルチプロセス アーキテクチャがないと、ウェブページに起因するクラッシュによってブラウザアプリ全体がクラッシュしたり、脆弱性が悪用されてデバイス全体が制御されたりする可能性があります。サイト分離はセキュリティをさらに強化し、信頼できないサイトが他のサイトから情報にアクセスして盗み出すのを困難にします。

Android 8.0 Oreo まで、WebView レンダラは埋め込みアプリと同じプロセスを使用していました。新しいバージョンの OS では、デバイスが十分に対応している場合、レンダラは別のプロセスで実行されます。ただし、すべてのページとそれを実行する WebView インスタンスの間で 1 つのプロセスが共有されるため、サイト分離を完全に実装することはできません。

マルチプロセス アーキテクチャとサイト分離の欠如は、自身が所有する信頼できるコンテンツをレンダリングするアプリでは問題になりませんが、信頼できないサードパーティ コンテンツ(アプリ内ブラウザなど)を実行するアプリの場合には問題になり、ユーザーは MeltdownSpectre などの脆弱性にさらされることになります。これらの脆弱性は Cookie、銀行情報、個人情報などを盗むために使用される可能性があります。

セキュア UI インジケーター

ユーザーに適切なセキュリティ インジケーターを提供することも重要です。ブラウザは多大な労力を費やし、この分野に常に進化しています。しかし、WebView には、アプリ デベロッパーが信頼できるセキュリティ インジケーターを作成できる、サイトの接続が安全かどうかを確認する API がありません。このような API がないと、たとえば、アドレスバーに表示される URL とユーザーに表示されるページが、たとえセキュアな HTTPS 接続を使用している場合でも、一致しない場合があります。

開発者が利用できるもう一つの方法は、アプリケーションへのブラウザ エンジンの埋め込みです。このアプローチは、アプリケーションのサイズの増加につながるだけでなく、複雑で時間がかかります。

アプリ内ブラウザのソリューションとしてのカスタムタブ

カスタムタブは Chrome 45 で導入され、デベロッパーはユーザーのデフォルト ブラウザのタブをアプリケーションの一部として使用できるようになりました。カスタムタブはもともと Chrome でリリースされ 「Chrome カスタムタブ」と呼ばれていました。現在、これは Android API であり、Chrome、Firefox、Edge、Samsung Internet などの一般的なブラウザはカスタムタブをサポートしているため、単に「カスタムタブ」と呼ぶほうが適切です。

カスタムタブを使用すると、デベロッパーはウェブ コンテンツをアプリのエクスペリエンスにシームレスに統合できます。また、デベロッパーはツールバーの色、アクション ボタン、遷移アニメーションなどをカスタマイズでき、ウェブ コンテンツが表示されるアクティビティをカスタマイズできます。

また、これまでは WebView の使用時やブラウザ エンジンの埋め込みでは利用できなかった機能も提供されます。アプリ内ブラウザはユーザーのブラウザを使用するため、カスタムタブはブラウザとストレージを共有するため、ユーザーは、インストール済みアプリのいずれかがアプリ内ブラウジング セッションを開始するたびに、お気に入りのウェブサイトに再ログインする必要がありません。

WebView とは異なり、カスタムタブはブラウザでサポートされているすべてのウェブ プラットフォーム機能と API をサポートします。

信頼できるウェブ アクティビティを使用してプログレッシブ ウェブアプリを開く

プログレッシブ ウェブアプリは、これまでプラットフォーム固有のアプリでしか利用できなかった多くの動作と機能をウェブにもたらします。アプリに似た動作を導入すると、そのようなエクスペリエンスを Android で再利用したいという要望が高まり、PWA をアプリに統合する方法が求められ始めました。

カスタムタブは、最新のウェブ機能と API をすべてサポートしていますが、主にサードパーティのコンテンツを開くことを目的に設計されているため、上部にはユーザーがアクセスしている URL を示すツールバーと、サイトが安全かどうかを示す鍵アイコンがあります。アプリ固有のエクスペリエンスを開くときにツールバーを使用すると、アプリがオペレーティング システムと統合されているように見えなくなります。

Chrome 72 で導入された Trusted Web Activity により、デベロッパーは Android アプリ内で PWA を使用できます。このプロトコルはカスタムタブ プロトコルと似ていますが、デベロッパーが Android アプリと開いている URL の両方を制御し、両方が true の場合に URL バーを削除することをデジタル アセット リンクを介して検証できる API が導入されています。

また、PWA を開く際にスプラッシュ画面を作成したり、ウェブ通知を Android コードで処理するように委任したりする API も導入しました。Play 請求サービスのサポートなど、さらに多くの機能が近日中に追加される予定です。

Trusted Web Activity で開かれる URL は PWA であると想定され、一連の動作とパフォーマンス特性があるため、Trusted Web Activity ではその中で開かれる PWA の品質基準が導入されます。

現在のソリューションの制限事項

デベロッパーからのフィードバックでは、アプリ内ブラウザに DOM へのアクセスや JavaScript の挿入などを行えるよう、カスタムタブのプラットフォーム互換性と WebView の柔軟性を組み合わせる必要性が指摘されました。

カスタムタブとは、実質的には、ユーザーのブラウザによって表示される、カスタム UI を表示するか、UI をまったく表示しないタブのことです。つまり、ブラウザはプライバシーとセキュリティに関するユーザーの期待に応え、ブラウザが機能しなくなるようにする必要があります。

Google の Android 版ウェブチームは、代替手段を調査し、それらのユースケースを解決するためのソリューションをテストしています。詳細は随時お知らせします。

まとめ

WebView は、アプリが Android アプリ内で HTML、CSS、JavaScript を必要とするものの、プッシュ通知やウェブ Bluetooth など、最新のウェブで利用できる高度な機能を使用しない場合に役立ちます。最新のウェブ プラットフォーム用に設計されたコンテンツを開く場合は、デベロッパーの意図したとおりに表示されない可能性があるため、おすすめしません。WebView はアプリ内ブラウザの作成には推奨されません。一方、ファーストパーティのウェブ コンテンツの表示は、WebView が真価を発揮する分野です。

Trusted Web Activity は、デベロッパーが独自のプログレッシブ ウェブアプリを Android アプリ内で全画面でレンダリングする場合に使用する必要があります。アプリ内で唯一のアクティビティとして使用することも、他の Android アクティビティと組み合わせて使用することもできます。

ウェブ プラットフォーム(アプリ内ブラウザとも呼ばれます)用に設計されたサードパーティのコンテンツを開く場合は、カスタムタブの使用をおすすめします。