今日はいろいろ疲れたのでgdgd書き下します。
今朝はAndroidのLollipop MR1が公開されました。
それと同時にひっそりとwebviewのベータ版もアップデートしました。
ベータテスト登録しているアカウントへはすでに降ってきていると思います。
このベータ版ですが、Playでのベータ版公開とともに、aospでもタグが切られています。
-
先月公開されたver40ベータのタグ
- webview-m40_r1
-
今朝公開されたタグ
- webview-m40_r2
ソースの取得とビルドはフレームワークと同じです。
$ repo init -u https://android.googlesource.com/platform/manifest -b webview-m40_r2
$ repo sync
$ . build/envsetup.sh
$ lunch
$ make libwebviewchromium
これで、$OUT/system/lib/libwebviewchromium.soがビルドされます。
このなかになんとかエンジンとかなんとかエンジンとかが入っています。
ソースコードは/external/chromium_org/です。
このライブラリを差し替えれば動くんでしょうか。
動作確認はしてませんがエミュレータ向けにしかビルドできないようです。
さて話がとびますが、GooglePlayで配布されているGoogleのWebviewは、パッケージ名がcom.google.android.webviewです。
大事なところですが一回しか言いません。
GooglePlayでダウンロードしたapkをaospのROMを焼いた端末へインストールしても、このWebviewは動きません。
インストールはできますが、動きません。Webviewをつかうと即座にクラッシュします。たぶんPackageManagerあたりがなんかの例外を吐いているはずです。
これは、aosp版で想定されているwebviewのパッケージ名が上記のcom.google.android.webviewと異なるためです。
aosp版のwebviewは、プラットフォームビルドすると/system/appに生成されるwebview.apkのことを指しています。
それではaosp版で想定されているパッケージ名は一体なんなんだって話ですが、答えはcom.android.webviewです。
なんか簡単な結論の割に話がくどいですよねよく言われますごめんなさい。
これは以下で定義されています。
/frameworks/base/core/res/res/values/config.xml
<!-- Package name providing WebView implementation. -->
<string name="config_webViewPackageName" translatable="false">com.android.webview</string>
このconfig値はWebviewFactoryから参照されています。
これをcom.google.android.webviewに書き換えればGooglePlay版のWebviewをaosp端末で動作させることができます。
ただ、そのまま書き換えるのも芸がないというか、aosp版のwebviewに戻したいときにいちいちROM書き換えないといけないということになりますよね。なのでのvaluesなんて適当にoverlayファイルを用意してあげればよいでしょう。
ここでは仮に端末ロケールにともなって差し替えるようにします。
ちょうどよいのが見つからなかったので、適当にロケールが日本のときはGooglePlay版、それ以外のときはaosp版のwebviewが動作するようにしましょうか。以下のファイルを作成しビルドしましょう。
frameworks/base/core/res/res/values-ja/config.xml
<string name="config_webViewPackageName" translatable="false">com.google.android.webview</string>
こうすることで、端末のロケールを変更するだけで使用するwebviewを変更できますた。
#webviewアプリのプロセスkillでいけると思いますが、再起動が必要かも。
さてさて、5.0からwebviewがapk化されたという話は有名ですが、これはとりもなおさず、以下のように実現されているようです。
apkのアップデート時に、WebviewUpdateServiceという端末起動時に起動するSystemServiceが、PACKAGE_REPLACEDのブロードキャストインテントを受診し、そのパッケージ名からwebviewのアップデートを検知します。
検知すると、WebviewFactory経由で、libwebviewchromium.soの再配置情報(/data/misc/shared_relro/にあります)を書き換えます。書き換える人は、別ライブラリになっていて、これはフレームワーク(/framework/webview/)に存在するloaderというやつです。ライブラリのファイル名はlibwebviewchromium_loader.soみたいな名前だったと思います。
この再配置情報の書き換えの起点となるWebviewUpdateServiceでのパッケージ名判定に使用される値が、config_webViewPackageNameというわけですね。
間違っているかもしれませんが、たぶんこんな感じです。