【メモ】Androidのビルドエラー・不具合別に見る対処法(Evolution X)
Android 13時点
Evolution Xビルド時に得た情報です
個人的にハマったところをメモ用として書き連ねているが恐らく使えるものもどれがあるはず
参考になれば幸いです
はじめに
情報を教えてくださったEvolution Xのビルダー・関係者の方々に大いなる感謝!!
必要なツリーをgit cloneで入手
Androidのビルドに必要なツリーは主に3つ。
Device tree
Kernel tree
Vendor tree
これらはgithubを漁って見つけてくる。基本的にはLineageOSのものを使うのが推奨されている。お目当てのものを見つけたら、git cloneでローカルディレクトリに保存する。
※そのほか、端末によっては同じメーカー・同じSoCの組み合わせなどの複数端末が共有しているCommon treeがあったりする。例えば、同じTensorを搭載しているraven, oriole, bluejayの3つのデバイスは「gs101」というcommon treeを参照するようになっている。そして、これらは基本的にメーカーごとに異なる実装がされているため、同じ名前のツリーがあっても同一とは限らない。(例:device_realme_sm8350-commonとdevice_xiaomi_sm8350-commonは同じ名前だが、メーカーが違うので別物。)
ビルド時によく出るエラーの意味・対処法
ninja「missing and no known rule to make it」
ninjaがファイルを生成するルールが定義されていない・もしくはコピーすべきファイルが見つからないときに表示される。
対処法1:エラーになっているファイルのPRODUCT_COPY_FILES等のパスが正しく設定されているか確認する。
対処法2:「dtbo.img」のエラーの場合は、Makefileにdtboを生成するルールを追記。(以下はLineageOSの場合の一例です)
TARGET_KERNEL_DTBO_PREFIX := dts/
TARGET_KERNEL_DTBO := google/devices/bluejay/dtbo.img
対処法3:「dtb.img」のエラーの場合はDTBのルールを追記。
TARGET_KERNEL_DTB := \
google/devices/bluejay/google-base/gs101-a0.dtb \
google/devices/bluejay/google-base/gs101-b0.dtb
「already defined by ***」
主にPixelに起きがち。Pixel端末はvendorにも基本的なGappsが含まれているので、同じくGappsが含まれているEvolution Xではアプリが競合してしまう。その場合、proprietary-files.txtから競合するapkファイル、jarファイルの記述を消し、vendorに含めないようにする必要がある。修正できたら、もう一度setup-makefiles.shを実行して、ビルドが進むことを確認する。
artifact_path_requirement.mkがエラー吐く場合
Makefileに下記を追記↓
DISABLE_ARTIFACT_PATH_REQUIREMENTS := true
"m evolution"でninjaがUnknown targetでコケる
device/***/evolution_***.mk内の「EVO_BUILD_TYPE」と「EVO_SIGNED」をコメントアウトする(非公式ビルド)
#EVO_BUILD_TYPE:= OFFICIAL
#EVO_SIGNED := true
EXTRA_UDFPS_ANIMATIONS := true
TARGET_BOOT_ANIMATION_RES := 1440
TARGET_SUPPORTS_QUICK_TAP := true
「neverallow check failed at *****」のエラー
Makefileに下記を追記↓
SELINUX_IGNORE_NEVERALLOWS := true
※ただしuserビルドでは使用できないらしい
ビルドしたものが起動しないときに確認すること
ビルド成功したものの、起動しない場合はそのときの状況によって対応が変わってくる。
電源を入れたときのロゴは出るが、すぐにBootloaderに移動してしまう。またはロゴのままフリーズする。再起動ループに陥る。
Linuxカーネルに問題が起きている可能性が高い。非対応のカーネルを使っているか、何らかの原因で正常にビルドされていないかのどちらかだと思われる。
ロゴの後のbootanimationから先に進まない。
このような場合、考えられる原因としてSEPolicyに問題がある可能性がある。まず、SELinuxをpermissiveにして再ビルドする。BoardConfigに下記のように記載。
BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
そしてUSBデバッグを有効にし、再起動。「adb logcat > log.txt」で起動中のlogcatを取る。
起動したらCtrl+Cで中止する。テキストファイルを確認すると、最初の方にinitプロセスが「avc: denied」と阻害されている旨のログがあるはずなので、それに対してSEpolicyを設定し、許可を与える必要がある。
具体的には、デバイスツリー内のsepolicyフォルダー内、に「te」ファイルを作成し、そこに記述していく形。
SEPolicyの記述に慣れていない場合は、audit2allowツールを使うとエラーが起きているものを許可するSEPolicyを一括で出力してくれて楽。すべての権限を許可にしてしまうのはセキュリティの観点から推奨されないので、その中からお目当てのものをピックアップし、teファイルに追記する形にしよう。
ただし「init」関連と「vendor_init」関連が阻害されるとそもそもシステムが起動しないので、それらは一律で追記してOK。
参考:https://github.com/nattolecats/device_google_bramble/commit/ac6bac3f2a01ba2f54f690e7f0ff53459c6ba441
SEPolicyを追加したら、BoardConfig内に追記した行を消し、Enforcingに戻して再ビルドしてみよう。そうすると起動するようになっているはず。
起動に成功したが、何らかの不具合がある場合
GMS関連がうまく動作しない
一度「m installclean」を実行して一時ファイルを消して、再ビルドする。