普段使っているAndroidのカスタムROM「LineageOS」のソースコードをみてみたいと思い、Android Studioを使ってソースコードを参照できるようにしました。
参考ページ
以下のページの手順を参考にしました。
また、Android Studio用のプロジェクトファイルを作成する「idegen.sh」と同じフォルダにあった「readme」ファイルも参考になりました。
環境
私は、Contaboという海外の格安VPS上にソースコードを参照する環境を作成しました。
VPSのスペックは、以下の通りです。
- OS:Ubuntu 18.04(64ビット)
- CPU:4コア(2.2GHz x 4)
- メモリ:8GB
- ストレージ:200GB(SSD)
※200GBだと、けっこうギリギリでした。
気を抜くと残りが10GBくらいしかないこともあり、できれば、あと50GBか100GBほしいです。 - ネットワーク:200Mbps
ビルドパッケージのインストール
LineageOSをビルドするために必要なパッケージをインストールします。
sudo apt update && sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev python
LineageOSのソースコード取得
LineageOSのソースコードをダウンロードします。
ディレクトリを作成します。
mkdir -p ~/bin mkdir -p ~/android/lineage
ソースコードを取得するためのrepoコマンドをインストールします。
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
repoコマンドのディレクトリに権限を付与します。
chmod a+x ~/bin/repo
「$HOME/bin」をPATHに追加します。
「~/.profile」をviエディタで開きます。
vi ~/.profile
以下を、ファイルの最後に追加します。 ※もし、すでに同じ記述がある場合は追加は不要です。
# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
以下を実行し、環境を更新します。
source ~/.profile
LineageOSソースリポジトリを初期化します。
cd ~/android/lineage repo init -u https://github.com/LineageOS/android.git -b lineage-17.1
以下のように入力します。
Your Name:android
Your Email:android
is this corrent [y/N]?:y
Enable color display in this user account (y/N)?:y
LineageOSのソースコードを取得します。
repo sync --force-sync
「repo sync has finished successfully.」と表示されるまで待ちます。
Android Studioのインストール
UbuntuへAndroid Studioをインストールする方法は、以下を参照してください。
Android Studioの設定変更
LineageOSのソースコードをAndroid Studioで開く場合、Android Studioの設定を変更する必要があります。
メモリ割り当ての変更
Android Studioで使用するメモリの割当を増やします。
Android Studio を起動します。
[Help]→[カスタムVMオプションの編集]をクリックします。
以下の行を追加します。
-Xms1g -Xmx5g
ファイル解析の制限を増やす
LineageOSの膨大なファイルを解析するために、ファイル解析の制限を増やします。
Android Studio を起動します。
[Help]→[カスタムプロパティの編集]をクリックします。
以下の行を追加します。
idea.max.intellisense.filesize=100000
プロジェクトファイルの作成
LineageOSのソースファイルから、Android Studio用のプロジェクトファイルを作成します。
idegen.shの実行
Android Studio用のプロジェクトファイルは、[idegen.sh]を使って作成します。
以下のコマンドを実行します。
cd ~/android/lineage source build/envsetup.sh
以下のコマンドを実行します。
make idegen && development/tools/idegen/idegen.sh
正常に終了すると、「repo sync has finished successfully.」と表示されます。
idegen.sh実行時のエラー
私の環境ではidegen.sh実行時に、以下のエラーが発生しidegen.shが正常に終了しませんでした。
正しい対処方法かはわからないのですが、エラー箇所をコメントアウトすることで、idegen.shが正常終了することを確認しました。
[エラー1]unknown variable ‘$(PATH_OVERRIDE_SOONG)’
エラー内容
[100% 139/139] out/soong/.bootstrap/bin/soong_build out/soong/build.ninja FAILED: out/soong/build.ninja out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp error: vendor/lineage/build/soong/Android.bp:30:8: module "generated_kernel_includes": cmd: unknown variable '$(PATH_OVERRIDE_SOONG)' 01:55:30 soong bootstrap failed with: exit status 1 #### failed to build some targets (01:31 (mm:ss)) ####
”generated_kernel_includes”というモジュールの中の’$(PATH_OVERRIDE_SOONG)’ という変数の宣言がないようです。
対処方法
下記のリンクの内容をみたところ、”generated_kernel_includes”および、その利用箇所をコメントアウトするように記載されていたため、該当箇所をコメントアウトしました。
修正箇所
以下の赤枠をつけた部分をコメントアウトしました。
android/lineage/vendor/lineage/build/soong/Android.bp
android/lineage/hardware/lineage/interfaces/cryptfshw/1.0/qsee/Android.bp
android/lineage/hardware/lineage/interfaces/cryptfshw/1.0/Android.bp
android/lineage/external/tinycompress/Android.bp
[エラー2]previously defined at build/make/core/base_rules.mk
エラー内容
[100% 544/544] writing build rules ... FAILED: build/make/core/Makefile:28: error: overriding commands for target `out/target/product/generic/system/product/etc/apns-conf.xml', previously defined at build/make/core/base_rules.mk:480 02:43:12 ckati failed with: exit status 1
`out/target/product/generic/system/product/etc/apns-conf.xml’を重複して定義しているため、エラーになっているようです。
対処方法
下記のリンクの内容をみたところ、複数箇所で同じファイルパスを指定するとエラーになるようなのでetc/apns-conf.xml’を重複して定義している箇所をコメントアウトしました。
修正箇所
以下の赤枠をつけた部分をコメントアウトしました。
android/lineage/build/make/target/product/full_base_telephony.mk
android/lineage/build/make/target/product/gsi_common.mk
Android Studioでプロジェクトを開く
Android Studioを起動し、[ファイル]→[開く]をクリックします。
idegen.shで作成された「/android/lineage/android.ipr」を選択し、[OK]ボタンをクリックします。
フォーマット変換の確認メッセージが表示されるので、[変換]ボタンをクリックします。
[ファイル]→[プロジェクト構造]をクリックします。
※プロジェクトを開いた直後だと、同期処理が動いていて、[プロジェクト構造]が無効になっていることがあります。その場合は、同期処理が終わるまでしばらく待ちます。
左のツリーから、[プラットフォーム設定]→[SDK]を選択。
[クラスパス]タブをクリックします。
「How to import the sources to Android Studio / IntelliJ」によるとJDK標準のjarファイルは参照しないため、画面右端の[ー]ボタンを使ってjarファイルを削除します。
下記の画面のように、jarファイルがすべてなくなればOKです。
[補足]
「How to import the sources to Android Studio / IntelliJ」によると、「[out/target/common/R]をソースとしてマークする」という手順があったのですが、私の環境だとそのフォルダーがありませんでした。
よって、この手順は実施してません。
これで、すべて完了です。
LineageOSのソースコードがAndroid Studioで参照できるようになりました。
まとめ
LineageOSのソースコードをAndroid Studioで参照する方法を紹介しました。
プロジェクトファイルを作成するidegen.shがくせ者で、いまいちエラーになる原因がわかりませんでした。
正しいのかどうかはわからないのですが、エラー箇所をコメントアウトすることでエラーの回避はできたので、Android Studioでソースコードを開くことができました。
まだ、Androidがどういった仕組みで動いているのか私はわかってないので、ソースコードをみながら少しづつ理解していきたいです。
コメント