①AndroidOS　ビルド環境構築（NXP）

#はじめに
はじめまして、サイエンスパーク バグダス検証課のnohashiです。
バグダス検証課は、セキュリティ診断をメインに、IoTやハードウェアの開発にも携わっています。
”bugdas”タグにて連載するこの記事で、バグダス検証課にて学んだ知識、経験をもとに、同じようなことで詰まっている人の助けになれればと考えています。
また、間違いや変更点、改善策をご指摘いただければ、よりよい知識を共有できるような場になっていきます。
ご協力いただければ幸いです。

##AndroidOSとは
一般的にはスマホのOSとして有名ですが、近年ではカーナビや組み込み機器のOSとして利用されることが増えてきています。
Androidとだけいうと、Androidスマホ自体やアプリを指すことが多いので、ここではOSとしてのAndroidをAndroidOSと呼んで区別させていただきます。

AndroidOSは、LINUXカーネルとオープンソースをベースにGoogleで作られました。
AOSP(Android Open Source Project)にてソースコードがすべて公開されています。
このソースコードをチップメーカーや、スマホメーカー、組み込み機器メーカーが、ハードウェアに合わせてカスタマイズして利用されています。

##組み込みAndroid開発手順
いきなりメインCPUのチップだけ渡されただけでは、ハードウェアを作るのに大変な労力を必要とします。
そのため多くのチップメーカーは、チップと一緒に専用の開発用ボードやソースコードを公開・販売しています。
開発用ボードは、チップメーカーが動作することを保証したテスト用のボードで、インターフェースもある程度豊富につけられています。
組み込みAndroid開発の一般的なやり方は、チップメーカーから提供されている開発用ボードを使って、
最低限の動作確認や、追加したいハードウェアなどをテストした上で、専用基板を作成します。
専用基板の作成時には、不必要な機能に関わるハードウェアを減らして製造のコストを考慮して設計していきます。

#今回の構成（NXP i.MX8 シリーズ）
今回は、NXP社製のi.MX8シリーズの以下のSoMとEVKボードを利用しました。

|SoM|EVKボード|
|:-:|:-:|
|NXP i.MX8M Nano   | NXP i.MX8M Mini EVK  |

####SoM 表
![8M_NANO_SoM_表.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1688756/eab26122-aae4-2ddf-4b2b-4b2686d341ed.jpeg)
####SoM 裏（コネクタ破損）
![8M_NANO_SoM_裏.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1688756/32fed5ee-e339-0fc5-f097-a1adfc78ec2c.jpeg)
####EVKボード
![IMX8MNANO-EVK-CALLOUT-TOP.PNG](https://www.nxp.com/assets/images/en/dev-board-image/IMX8MNANO-EVK-CALLOUT-TOP.PNG)
引用元（https://www.nxp.com/assets/images/en/dev-board-image/IMX8MNANO-EVK-CALLOUT-TOP.PNG）

SoM（System-on Module）は、メインCPUのチップだけでなく、メモリやインターフェースが一体となったボードで、小さなコンピュータと言えます。
EVK（Evaluation Kit）ボードは、評価や開発のために実際に動作する回路です。ある意味でSoMと同じようなものです。

今回使ったi.mx8mのEVKボードは、EVKボード上に直接メインCPUを実装するのではなく、コネクタでSoMボードを接続するタイプのものです。
EVKボード-SoM間のインターフェースに互換性があれば、別のSoMボードを接続することができます。

今回私が使ったものは、EVKボードが Miniタイプ で、SoMがNanoタイプの組み合わせとなっています。
ただ、普通はSoMとEVKボードはセットになっていますし、EVKボードとSoMを自由に組み合わせると対応するハードが若干違ってきます。

　・今回であれば、SoM側の仕様が違うため、sdカードでのブートができませんでした。

できれば統一したものを使いましょう。

#開発PCスペック
|OS|CPU|メモリ|HDD(SSD)|
|:-:|:-:|:-:|:-:|
|Ubuntu 18.04.03|i5-4550|16GB|500GB以上|

この中で重要なのは、OSとメモリです。
CPUに関しては、そこそこ良ければ多分大丈夫です。
HDD(SSD)は、容量が大きいに越したことは無いです。
私の場合は、357GB必要となりました。

しかし、OSとメモリについては妥協しないで下さい。

####OSはLINUX、メモリは16GBです。

なぜOSはLinuxが良いかといえば、ビルドにはLinux環境が必須だからです。
Windows上でLinuxを構築することはできますが、自分は失敗しました。
難易度が高いので、やめときましょう。

以下の折り畳みに、Windowsで失敗したときのメモをのこしておきます。

<details><summary>環境構築失敗例 Windows</summary><div>
1.WSL2(Windows Subsystem for LINUX 2)
　　WSL2は、Windows上で動作できるとても便利なもので、
　　WSL（無印）から大幅に速度がアップしたことで、大変使いやすくなりました。
　　わざわざLinuxの環境を作らなくてもWindows 上で触れるのです。
　　これでビルドできると思ったのですが、なんとWSL2ではUSBを制御できません。(１敗
　　つまりSoMへの書き込みができないのです！
　　カーネルに機能追加して差し換えれば、使えるそうですが、
　　使えなかった時にトラブルシューティングで死ぬことになりそうです。なりました。（２敗

2.仮想環境(VirtualBOX)
　　仮想環境でも試してみました。
　　そう、Windows上でどうにかしようとしたんですね。
　　USBの制御もできるし、行けると思ったのですが、何分仮想環境は重たい。
　　ビルドに１日以上かかったうえで、失敗し断念しました。（３敗
　　廃スペックPCならなんとかなるかもしれません。
</div></details>

メモリが16GB必要なのは、ビルド時に必要となるメモリ容量が馬鹿みたいに大きいからです。
少しは解放しろよとは思いますが、駄目です。
8GBとかでビルドすると、途中でタスクがKILLされて失敗します。
世のLinuxプロフェッショナルな人たちなら何とかできるかもしれませんが、
初心者では失敗します。
16時間かけた上で失敗します。あきらめてメモリをガン積みしましょう。


この後は、必要なソースコードをダウンロードしてビルドし、書き込むことになりますが、
大分長くなるので、今回はこれで終わりにします。
どんな開発でもそうですが、初めてやるものは準備が一番時間かかります。
参考になれば幸いです！