LineageOSやその派生をビルドするとだいたい標準ブラウザが Jelly なわけだが、どうにもブラウザとしての使い勝手が微妙過ぎる。特にファイルのダウンロードが致命的で、GApps を焼かずにセットアップしたときにこれで F-Droid とかの APK が正しくダウンロードできないのだめでしょ。というわけで、まともなウェブブラウザを搭載したい。
条件は
以下候補。
Android 向けに開発されている Chromium のフォークであり、プライバシーを侵害する機能がないことと、組み込みの高速な広告ブロックエンジンが売り。
結論から言うとこれになった。タイトルで落ちてるけど。
F-Droidで更新できるのもよい
Bromite チームがビルドしている素の Chromium (ただしビルド周りの設定/最適化は Bromite と同じ、ソース自体にはパッチは当たっていないので素)。
これでも別によかった。
特に不採用にする理由もなかった気がするが、自分が使ってたのが Chrome → Brave とかなので特に考えてなかった。すまん。
後付けの理由としてはPlayストアにもあるやつにしちゃうとバージョン周りが面倒そうだったので。 こうは言ったけどアプデされる方が良いのでは?ボブは訝しんだ。
あとはブランディング周りが面倒な予感がするというのも。
Chromium 系のブラウザを自前でビルドするのは Android 以上に骨が折れるので、素直に 公式のリリース から拝借する。
最初は FlokoROM/vendor_addons
とかに突っ込もうと思ってたんだけど、残念ながら arm64
版の APK が 105MB くらいあってGitHubでのファイルあたりのサイズ制限をオーバーした[1]のでGitLab.comに置いた。
最初のディレクトリ構成は正直アホだったと思っていて、
arm/arm_ChromePublic.apk
arm64/arm64ChromePublic.apk
のために Android.mk
が
LOCAL_SRC_FILES := $(TARGET_ARCH)/$(TARGET_ARCH)_ChromePublic.apk
みたいな書き方になってしまった。1ファイルずつしか無いんだし、無理にアーキテクチャごとにディレクトリ分ける必要なかった気がする。
まあ他でよくある prebuilts/$(TARGET_ARCH)_ChromePublic.apk
だと全体で ${LINEAGE_ROOT}/prebuilts/bromite/prebuilts/$(TARGET_ARCH)_ChromePublic.apk
みたいなことになってしまうのでこうなったところもあり、悩ましいですね。
追記: x86
が増えた時点で結局 app
に突っ込んだ。
- LOCAL_SRC_FILES := $(TARGET_ARCH)/$(TARGET_ARCH)_ChromePublic.apk
+ LOCAL_SRC_FILES := app/$(TARGET_ARCH)_ChromePublic.apk
あとは Jelly に別れを告げたり Bromite をお迎えしたり すればオッケーですね。
上のリポジトリの更新を止めたので、雑なシェルスクリプトを書きました。ついでに Android.mk
から Android.bp
になったりしています。時代ですね。
ビルド時に(具体的には lunch
の最後に割り込み)ターゲットのアーキテクチャを見て、それに合わせた最新のBromiteを持ってなければAPKをダウンロードして使うようにした機構です。
上で用意した prebuilt_bromite
リポジトリの更新が必要なく常に最新のものが降ってくること、また必要なものだけダウンロードするのでお手軽になると思います。
手元のバージョン番号をどう保持するか悩んだ結果、雑に arm64_current_bromite_version.txt
とかを吐いたり眺めたりします。
こいつ自身はターゲットのアーキテクチャを知らんので、ROMのビルドシステムに組み込んでない場合は引数にそれっぽいのを与えてください。例えば以下のように。
fetch_bromite.sh $(get_build_var TARGET_ARCH)
crDroid/FlokoROM とかに組み込む場合は以下のcommitをcherry-pickしてください。そうでなければあちこちのパスを読み替えてください。
一応 Android 12.1 向けに書いてて動作確認まで済んでるやつですが、v4 (Android 11) 以前での動作確認は一切していません。あと x86 系を対象から外しているので変な端末で使うときはそれっぽい追記をしてください。
使う場合は FlokoROM/prebuilts_bromite
を同期対象から外すことを忘れないでください。
<remove-project name="FlokoROM/prebuilts_bromite" />
#!/bin/bash
START_DIR=$(pwd)
cd ${ANDROID_BUILD_TOP}/vendor/addons/prebuilt/product/priv-app/Bromite
TARGET_ARCH=$1
BROMITE_VERSION_FILE=${TARGET_ARCH}_current_bromite_version.txt
BROMITE_LATEST_TAG=$(curl -s -L https://github.com/bromite/bromite/releases/latest | grep "download/[0-9\.]*" | cut -d '/' -f6 | head -n 1)
function get_latest_bromite () {
echo "info: Downloading latest Bromite"
curl -H 'Accept: application/octet-stream' -L -O https://github.com/bromite/bromite/releases/download/${BROMITE_LATEST_TAG}/${TARGET_ARCH}_ChromePublic.apk
echo ${BROMITE_LATEST_TAG} > ${BROMITE_VERSION_FILE}
}
if [ -f $BROMITE_VERSION_FILE ]; then
if [ $(cat ${BROMITE_VERSION_FILE}) = ${BROMITE_LATEST_TAG} ]; then
echo "info: No need to get latest Bromite"
else
get_latest_bromite
fi
else
get_latest_bromite
fi
cd ${START_DIR}
https://api.github.com/repos/bromite/bromite/releases/latest
を引けば済む話だろ自分でこのシェルスクリプトを直接実行するならともかく、ビルドタスクの中で呼び出すと弾かれる。ビルドしたい人間にわざわざトークンを用意させるのも面倒が増えるだけなのでパス。
次点で jq
使ってもっとマシな書き方しろやとも言われそうだけど、それはそれでこのためだけにビルド環境に jq
入れるのもなんか違うので、こんなめちゃくちゃなタグの取り方になってしまった。
Playストアにないのに、何も考えてなかった。 なんか v94 くらいからアプリ内アップデートが増えたっぽい。
https://github.com/bromite/bromite/wiki/AutomaticUpdates
なんか3日ごとにGitHub Releasesを見に行くらしいのでよさそう。
諸事情で古いビルドに留まっている場合は、Bromite の F-Droid リポジトリ を購読しておくとよい。
F-Droid クライアントは 公式 か Aurora Droid [2] がよいです。
仮に50-100MBに収まったとしても、ビルドを考えるとまあまあな回数ダウンロードされることが予想されたので転送料の面でも Git LFS のお世話にはなりたくなかった。 ↩︎