Tweetどうも、mrtskaです。Gen5を買いました。Yogaにしたかというのは後述します。2020初めてタッチパネル付きのWindowsというものを触りましたが、Chromeみたいなユーザー数が大量のアプリやUWPアプリはそこそこまともに使えましたがそれ以外のUXが非常に悪かったです。具体的には、リードオンリーなテキストフィールドを触っただけで出てくるソフトウェアキーボード。Codeでコードを読んでいるとスクロールのために画面を触ると必ずソフトウェアキーボードが下から生えてきます。あまりに邪魔すぎてこれはちょっと調べ物(特にコード読む時)には使えません。Windowsをタッチパネルで使う人がそんな居ないから改善が遅いのだろうとは思いますが改善されるのを待ってられるほど暇ではありません。Windowsをやめれば良いではないか。Yogaに入れれば良いではないかという結論に至りました。ThinkPadにしたのには理由があって、Linuxがちゃんと動きそうだからです。ThinkPadってサーバマシンのコンソール(非Windows)に使われたりしているので他のベンダーよりは動きやすそうかなと思います。x86マシンにAndroidを入れると言えばAndroid-x86がありますね。これを入れるだけでおしまいというのはちょっと面白味に欠けますし、もっといろいろ改造したいと思っていたのでAndroid-x86は使わずに自力でインストールしてみようと思います。11はまだ無さそうですね。Gen5のスペックを貼っておきます。前置きが長くなりましたが実際に入れてみたいと思います。注意点として、この記事を執筆している現在時点ではまともに動作していません。そもそも使える状態になるかどうかすらまだ分からない状態なのであしからず。YogaにAndroidを入れる奮闘記のようなものになる予定です。LinuxカーネルのビルドAndroidとてカーネルはLinuxなのでLinuxカーネルのビルドは必要です。そもそもちゃんとLinuxカーネルが起動してくれないとAndroid以前の問題です。Androidのパッチが当たったものでないとダメなので本家からクローンしてきたソースをビルドしてもうまくいかないはずです。(試してない)AndroidのカーネルソースはAOSPにあります。https://android.googlesource.com/kernel/x86_64といういかにも都合の良さそうなリポジトリがありますがどうもメンテされてなさそうなのでこれは使いませんでした。Yoga用のカーネルソースなんてあるわけが無いのでcommonリポジトリを使いました。Androidのページに懇切丁寧にカーネルをビルドする方法が書いてあります。Yoga用のカーネルをビルドする方法など当然書いてないので手順通りにクローンした後は自力でビルドしてみます。commonリポジトリにはいくつかブランチがありますが、最終的にはandroid-mainline-5.10タグのソースを使いました。VGAのまま動作していました。android-4.19-stableにあってandroid-mainline-5.10に無いソースがあるようなのでこのタグだけのコードだけでは足りてないようです。(kernel/sched/tune.cとか)無くても起動しないことはないようですがエラーログが流れます。この辺もバックポートしろということなんでしょうね。試行錯誤した結果、以下のconfigに落ち着きました。https://gist.github.com/mrtska/ae74e946ca61211e31460d0923440246絶対に必要無いものが混じってますが(パラレルATAのドライバとか・・・)、今はとりあえず動けば良いということでこのままにします。時間がある時にダイエットさせてみよう。Workstationを使いました。有料ですがVirtualBoxなどと比べるとパフォーマンスが良いですし何よりUSBパススルーが便利です。12出来上がったbzImageは28MBほど。20.04のvmlinuzが11MB程度なのでかなりデカいです。Ubuntuではカーネルモジュールを使って必要なモジュールを後からロードするようになってるはずなのでそれらが最初から含まれてると考えたら妥当なサイズなのかもしれませんね。(にしてももっと減らせますが、、、)ビルドしたカーネルは一旦余っていたこのSATAのSSDに入れることにします。実際に使い始める時は512GBのNVMeのパーティションを縮小してインストールしますが現時点ではこのSATAのSSDをUSBブートする形でデバッグします。パーティション構成はこんな感じです。左から順番に説明するとこうです。(f2fs)空きsuperパーティションが謎ですが詳しくはここに書いてあります。https://source.android.com/devices/tech/ota/dynamic_partitions/implement簡単に言うとAndroidは必要なパーティションが多いからsuperパーティションの中にサブパーティションとして持つようにしようということなんだと思います。superパーティション内のパーティションのサイズはsuperパーティションのサイズに合わせてよろしくやってくれるようです。カーネルとinitramfs置き場にビルドしたbzImageを置きます。ブートローダーの用意カーネルを起動するにはブートローダーが必要なのでこのSSDにEFIシステムパーティションをpartedやfdiskで作った後にgrub2をインストールします。VMwareで起動したところです。Yogaは4Kなのでめちゃくちゃ字が小さいですが起動します。(反射してうまく写真撮れなかった)AOSPのビルドまずはAOSPのソースをクローンします。公式の手順の通りにダウンロードしました。https://source.android.com/setup/build/downloading使用したタグは記事を書いている時点で最新のandroid-11.0.0_r24を使いました。repoを使ってクローンします。Yoga用の設定を作ります。私が頑張って作ったものはここにあります。https://github.com/mrtska/device_mrtska_thinkpad-x1-yoga-gen5これをdevice/mrtska/thinkpad-20ubにクローンします。後は手順と同様にビルドします。aosp_x1_yoga_gen5-engmake私のPCだと5時間くらいかかります。寝る前にやると良いかもですね。ビルドが終わるとsuper.imgが出来ます。これをSSDのsuperパーティションに対してddコマンドで流し込みます。bs=4096ramdisk.imgはinitramfsなのでこのファイルはカーネルと同じ場所に置きます。Yogaに挿して起動・・・しません。Bootに引っ掛かります。Bootを無効にして再度チャレンジ。(写真がなくて分かりづらいですが)起動はしてきました。一瞬でリブートしてしまいます。調べた結果答えはここに書いてありました。https://source.android.com/devices/tech/ota/dynamic_partitions/implement#kernel-command-line-changesカーネルのコマンドラインにandroidboot.boot_devicesを足す必要があるようです。Yogaでは「pci0000:00/0000:00:14.0」でした。やって決まるのかは謎です。今度は無限に似たようなエラーが出ていて進みません。調べたらどうも画面を描画するのに使うexternal/drm_hwcomposerだけmasterブランチにある最新のソースで且つパッチをあてないとダメなようでした。いきあたりばったりなパッチなのでこれで合ってるかどうかは微妙です。他にもexternal/minigbmではi915を含むようにAndroid.bpを編集しないとダメでした。(こんなの分かるか!)という訳でまる1ヶ月以上悩みまくって試行錯誤した結果ようやく画面を出すことに成功しました。20204Kのスクショも撮れました。まとめここまでたどり着くのにものすごく大変でしたが画面が出てきた時の喜びはすごかったです。Wi-Fiも喋れなければホーム画面にも行けない(ロック解除するとクラッシュする)状態ですが少しずつ改善していけたらなと思っています。(いつ完成するのか・・・)進展があったらパート2の記事を書こうと思います。