Android Open Source Project
序章
[編集]AOSPとは
[編集]Android Open Source Project(AOSP)は、Googleが提供するオープンソースのAndroidオペレーティングシステムの公式プロジェクトである。このプロジェクトの目的は、誰もがAndroidを自由に使用、変更、配布できる環境を提供することにある。AOSPはオープンソースライセンスのもとで開発されており、特にApache License 2.0を採用しているため、自由なカスタマイズが可能である。
AOSPの主な構成要素は、Androidの基本的なフレームワーク、コアライブラリ、ハードウェア抽象化レイヤー(HAL; Hardware Abstraction Layer)、Linuxカーネル、そして標準アプリケーション群である。これらの要素は、さまざまなデバイスで動作するように設計されており、スマートフォン、タブレット、ウェアラブルデバイス、さらには車載システムやIoTデバイスにも適用可能である。
GoogleはAOSPを管理し、公式のリリースを提供しているが、Androidを使用するメーカー(OEM)やキャリアは独自のカスタマイズを加えたAndroidバージョンを展開することができる。Googleが提供するGoogle Mobile Services(GMS)はAOSPとは別のものであり、Google PlayストアやGmailなどのアプリ群はAOSPには含まれていない。このため、GMSを利用するにはGoogleとのライセンス契約が必要となる。
AOSPのライセンス
[編集]AOSPのソースコードは主にApache License 2.0のもとで公開されている。このライセンスは、変更および再配布を許可する自由度の高いライセンスであり、改変後のソフトウェアに対しても同じライセンスを適用する義務がない。そのため、開発者はAOSPをベースに独自のカスタマイズを施し、商用製品として販売することが可能である。
一方で、Androidカーネルの大部分はLinuxカーネルを基盤としており、これはGNU General Public License(GPL)v2のもとで提供されている。GPLは、ソースコードを改変して配布する場合、その変更内容も公開しなければならないという制約を持つ。したがって、Androidのカーネル部分に変更を加える場合、修正後のソースコードも公開する必要がある。
また、一部のコンポーネントではBSDライセンスやMITライセンスが使用されており、これらはさらに自由度の高いライセンス形態を提供する。このように、AOSPは複数のオープンソースライセンスによって構成されており、それぞれのライセンスが適用される範囲を理解して開発を進めることが重要である。
AOSPの開発環境
[編集]AOSPの開発を行うためには、適切な開発環境を整える必要がある。AOSPのソースコードは非常に大規模であり、ビルドには高いスペックのマシンが要求される。推奨される環境として、少なくとも16GB以上のRAM、数百GBの空きストレージ、そしてマルチコアのプロセッサを搭載したマシンが望ましい。
開発に使用するOSは、公式にはUbuntuが推奨されているが、macOSやFreeBSD上でも環境を構築することは可能である。ただし、Linuxベースの環境のほうがAOSPのビルドツールや依存関係の管理が容易であるため、特に理由がない限りLinuxを使用するのが最適である。
必要なパッケージとしては、git、python、OpenJDK、make、clang、repoコマンドなどが挙げられる。repoはGoogleが提供するGitリポジトリ管理ツールであり、AOSPのソースコードを適切に取得・管理するために不可欠なツールである。
また、AOSPの開発ではエミュレータを活用することが多い。Android Emulatorは、物理デバイスがなくてもAndroidをテストできる便利なツールであり、特にカスタマイズしたAOSPの動作確認には必須である。
このように、AOSPの開発には適切な環境構築が不可欠であり、事前に必要なツールやパッケージを整えておくことが、スムーズな開発の第一歩となる。
AOSPのソースコード構造
[編集]ソースコードの全体構成
[編集]AOSPのソースコードは、多くのモジュールから成り立っており、それぞれが異なる役割を担っている。ソースコードはGoogleの公式リポジトリで管理されており、repo
コマンドを使用して複数のGitリポジトリから取得することができる。
AOSPのディレクトリ構造は、トップレベルのディレクトリに各種コンポーネントが配置されている。
build/
- ビルドシステムのスクリプトや設定ファイルが含まれる。system/
- Androidのコアフレームワークや基本機能が含まれる。frameworks/
- Androidアプリケーションフレームワークが定義される。hardware/
- ハードウェア抽象化レイヤー(HAL)の実装が格納される。kernel/
- Androidカーネルのソースコードが格納される。device/
- 各メーカーごとのデバイス固有の設定やドライバが含まれる。
これらのディレクトリはAOSPの開発において重要な役割を果たし、それぞれの役割を理解することで効率的な開発が可能となる。
AOSPのビルドプロセス
[編集]AOSPのビルドプロセスは複雑であり、多くのステップを踏む必要がある。まず、repo sync
コマンドを実行して最新のソースコードを取得する。その後、ビルドターゲットを設定し、環境変数を適切に設定してからビルドを実行する。
ビルドは source build/envsetup.sh
を実行して環境をセットアップし、lunch
コマンドでターゲットデバイスを指定した後、m
コマンドで実行される。このプロセスは非常に時間がかかるため、高性能なマシンが推奨される。
AOSPのビルドとカスタマイズ
[編集]AOSPのビルド環境のセットアップ
[編集]AOSPをビルドするには、適切な開発環境をセットアップする必要がある。公式にはUbuntu LTSおよびdebianが推奨されており、特にUbuntu 22.04や24.04が安定したビルド環境として広く使用されている。2021年6月22日以降、MacOS 上でのプラットフォーム開発はサポートされていない。
必要なパッケージのインストール
[編集]AOSPのビルドに必要な基本的なパッケージは以下の通りである。
# Ubuntuの環境で必要なパッケージをインストールする sudo apt update && sudo apt install -y \ openjdk-11-jdk \ python3 \ git \ curl \ repo \ make \ llvm \ clang \ zip \ unzip \ bc \ flex \ bison \ libncurses5-dev \ libssl-dev \ liblz4-tool \ libxml2-utils \ xsltproc \ rsync
また、AOSPのビルドには大量のストレージとメモリが必要となる。推奨されるスペックは以下の通り。
- CPU: 8コア以上(16スレッド推奨)
- メモリ: 16GB以上(32GB推奨)
- ストレージ: 250GB以上の空き容量(SSD推奨)
- OS: Ubuntu 20.04または22.04(推奨)
ソースコードの取得と初期設定
[編集]AOSPのソースコードはGoogleのリポジトリで管理されており、repo
コマンドを使用して取得する。まず、作業ディレクトリを作成し、repo
コマンドを使用してソースコードをダウンロードする。
# 作業ディレクトリを作成 mkdir ~/aosp && cd ~/aosp # repoツールを初期化 repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r1 # ソースコードを同期 repo sync -j$(nproc)
この処理には数時間を要することがあるため、高速なネットワーク環境が推奨される。
AOSPのビルド手順
[編集]ソースコードを取得した後、以下の手順でビルドを行う。
# 環境をセットアップ source build/envsetup.sh # ターゲットデバイスを選択 lunch aosp_x86_64-eng # ビルドを開始 m -j$(nproc)
ビルドが成功すると、out/target/product/aosp_x86_64/
ディレクトリ内に system.img
、boot.img
などの出力ファイルが生成される。
AOSPのカスタマイズ
[編集]AOSPはオープンソースであるため、独自のカスタマイズが可能である。例えば、デフォルトのブートアニメーションを変更する場合、frameworks/base/data/sounds/
内のファイルを差し替えることで変更が反映される。
また、カスタムアプリケーションをプリインストールする場合は、packages/apps/
ディレクトリにアプリのソースコードを追加し、Android.mk
ファイルを編集することで対応できる。
カスタムROMの作成
[編集]AOSPをカスタマイズした後、独自のROMを作成してインストールすることが可能である。作成したイメージをエミュレータや実機で動作確認し、カスタムROMとして配布することもできる。
AOSPのエミュレーションとデバッグ
[編集]エミュレータを使用したAOSPの実行
[編集]AOSPをビルドした後、エミュレータ上で実行することで、実機がなくても開発や検証を行うことができる。エミュレータを起動するには、以下のコマンドを使用する。
# エミュレータの起動 emulator -avd aosp_x86_64 -gpu host
このコマンドを実行すると、ビルド済みのAOSPイメージを使用してAndroidエミュレータが起動する。
ADBを使用したデバッグ
[編集]Android Debug Bridge(ADB)は、AOSPのデバッグに不可欠なツールである。エミュレータや実機に接続し、デバッグ情報を取得したり、アプリのインストール・ログの取得が可能である。
# エミュレータへの接続確認 adb devices # AOSPのシェルにアクセス adb shell
また、ログを取得するには以下のコマンドを使用する。
# システムログの取得 adb logcat
GDBを使用したネイティブコードのデバッグ
[編集]AOSPにはGDB(GNU Debugger)が組み込まれており、ネイティブコードのデバッグが可能である。特に、C/C++で開発されたシステムコンポーネントのデバッグには有用である。
# GDBサーバーの起動 adb shell gdbserver :5039 /system/bin/app_process # GDBクライアントの接続 ndk-gdb --attach 5039
これにより、エミュレータ上で実行されているプロセスにGDBを接続し、詳細なデバッグが可能となる。
Systraceを使用したパフォーマンス解析
[編集]Systraceは、Androidのシステム全体のパフォーマンスを分析するためのツールである。以下のコマンドを使用して、トレースデータを取得できる。
# Systraceの開始 adb shell atrace --async_start gfx view sched # 一定時間後に停止 adb shell atrace --async_stop
これにより、描画処理やスケジューリングのパフォーマンスを詳細に分析できる。
AOSPのセキュリティ機構
[編集]AOSPにおけるセキュリティの概要
[編集]AOSPは、オープンソースでありながら高度なセキュリティ機構を備えている。Androidのセキュリティは、システム全体の保護、アプリケーションの分離、データの暗号化といった複数のレイヤーで構成されている。
- カーネルレベルの保護: SELinuxを利用した強制アクセス制御(MAC)
- アプリの分離: 各アプリケーションが独立したUIDを持つ
- データ保護: ファイルシステム暗号化の採用
- ネットワークセキュリティ: TLSを利用した安全な通信
これらのセキュリティ機構により、AOSPは攻撃や不正アクセスからデバイスを守る。
SELinuxによるアクセス制御
[編集]SELinux(Security-Enhanced Linux)は、Androidのカーネルに統合されており、アプリケーションやシステムコンポーネントのアクセスを厳格に管理する。SELinuxには「許可しないものは全て拒否する」というポリシーがあり、マルウェアや不正なアプリがシステムを改ざんすることを防ぐ。
# SELinuxのステータスを確認 getenforce # SELinuxのポリシーを表示 cat /sys/fs/selinux/enforce
SELinuxの設定はsepolicy
ファイルに定義されており、特定のアプリケーションやプロセスのアクセス許可を細かく制御できる。
サンドボックスによるアプリの分離
[編集]Androidでは、各アプリケーションが独自のユーザーID(UID)を持ち、独立したプロセス空間で動作する。これにより、アプリ間のデータアクセスを制限し、悪意のあるアプリが他のアプリのデータにアクセスすることを防ぐ。
アプリのインストール時にUIDが割り当てられ、アプリごとに独立したデータ領域が確保される。
# アプリのプロセス情報を確認 ps -A | grep com.example.app
ファイルシステムの暗号化
[編集]Androidは、ユーザーデータを暗号化するために「ファイルベースの暗号化(FBE)」を導入している。これにより、デバイスがロックされている間、ユーザーデータは暗号化された状態となり、不正なアクセスを防ぐ。
暗号化のステータスは以下のコマンドで確認できる。
# 暗号化の状態を確認 getprop ro.crypto.state
暗号化の鍵は、ハードウェアレベルで管理され、PINやパスワードによって保護されている。
ネットワークセキュリティと安全な通信
[編集]Androidでは、ネットワーク通信の安全性を確保するためにTLS(Transport Layer Security)が標準的に使用されている。アプリケーションは、通信時に暗号化を適用し、ユーザーのデータを保護する。
また、ネットワークセキュリティ構成ファイル(res/xml/network_security_config.xml
)を使用して、カスタム証明書の設定や明示的なHTTPの制限を行うことができる。
<network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">example.com</domain> </domain-config> </network-security-config>
この設定により、特定のドメインではHTTP通信を禁止し、TLSのみを許可することができる。
AOSPのセキュリティアップデートとパッチ適用
[編集]Androidのセキュリティは、定期的なアップデートとパッチ適用によって維持される。Googleは毎月セキュリティパッチをリリースし、脆弱性を修正している。
セキュリティパッチのレベルは、以下のコマンドで確認可能である。
# セキュリティパッチレベルを確認 getprop ro.build.version.security_patch
AOSPを使用する場合、最新のセキュリティパッチを適用することで、システムの安全性を向上させることができる。
AOSPの開発ツールとワークフロー
[編集]AOSPの開発を効率的に進めるためには、適切な開発ツールを使用し、標準的なワークフローに従うことが重要である。本章では、AOSPの開発に必要なツールと、それを活用した開発の流れについて解説する。
開発環境の準備
[編集]AOSPの開発には、以下のツールやソフトウェアが必要となる。
- Android Studio: アプリ開発やシステムUIのデバッグに使用
- ADB(Android Debug Bridge): デバイスとの通信やログ取得、デバッグに必須
- fastboot: ブートローダーの操作やイメージのフラッシュに使用
- GDB(GNU Debugger): ネイティブコードのデバッグに使用
- Systrace: システム全体のパフォーマンス解析ツール
- repo: AOSPのソースコード管理に使用
また、エディタとしては VS Code や JetBrains CLion が便利であり、カーネルやシステムモジュールの開発には Vim や Emacs を活用することもできる。
AOSPの開発ワークフロー
[編集]AOSPの開発は、以下のワークフローで進めるのが一般的である。
ソースコードの取得
[編集]開発を開始するには、まずAOSPのソースコードを取得する。
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r1 repo sync -j$(nproc)
ターゲットデバイスの選択とビルド
[編集]開発対象となるデバイスを選択し、ビルドを実行する。
source build/envsetup.sh lunch aosp_x86_64-eng m -j$(nproc)
エミュレータまたは実機でのテスト
[編集]ビルドしたイメージをエミュレータまたは実機でテストする。
emulator -avd aosp_x86_64 -gpu host
または、実機に書き込む場合は fastboot
を使用する。
fastboot flashall
デバッグとログ解析
[編集]開発中のコードの動作確認には、adb logcat
でログを取得し、デバッグを行う。
adb logcat -s TAG_NAME
コードの変更と再ビルド
[編集]コードを修正し、再ビルドを行う際は、フルビルドではなく インクリメンタルビルド を行うことで効率を向上させる。
m -j$(nproc)
コードのレビューとマージ
[編集]開発が完了したら、変更をGitにコミットし、AOSPのリポジトリにプッシュする。
git add . git commit -m "Fix: UI update issue" git push
その後、Gerritを使用してコードレビューを実施し、承認されればマージされる。
Gerritを活用したコードレビュー
[編集]AOSPでは、コードの品質を維持するために Gerrit を用いたコードレビューが行われる。Gerritは、Googleが提供するコードレビューシステムで、AOSPの公式開発フローの一環として採用されている。
Gerritの基本的な流れ
[編集]- 変更を作成
git commit -m "Fix: Implement new feature"
- Gerritにパッチを送信
git push origin HEAD:refs/for/main
- レビューを受ける
- GerritのWeb UIからレビューを依頼し、コードレビューが完了すると、変更がマージされる。
CTS(Compatibility Test Suite)による互換性テスト
[編集]AOSPの開発では、Googleの提供する CTS(Compatibility Test Suite) を活用して、互換性のチェックを行う。CTSは、Androidの標準仕様に準拠しているかを確認するための公式テストスイートである。
CTSの実行
[編集]CTSを実行するには、以下のコマンドを使用する。
cts-tradefed run cts --plan CTS
CTSをクリアすることで、AOSPのカスタマイズがGoogleの標準仕様に準拠していることを保証できる。
AOSPのメンテナンスとアップデート
[編集]AOSPを使っていると、ソースコードの管理やセキュリティパッチの適用、さらにはOTA(Over The Air)アップデートの実装が重要な部分になります。この章では、AOSPを継続的に運用するために必要なメンテナンス作業と、最新の状態に保つための方法について解説します。
ソースコードの管理
[編集]AOSPを運用する際、ソースコードの管理は非常に重要です。リポジトリの同期やセキュリティパッチの適用方法について理解しておくことが、安定した開発環境を維持するために不可欠です。
repo sync の戦略
[編集]repo sync
コマンドは、AOSPのソースコードを最新の状態に保つために使用します。このコマンドは、AOSPのリポジトリ群を一度に同期させるためのもので、repo init
コマンドで初期設定したリポジトリを基に、必要なファイルをダウンロードします。
- 同期の基本的な使い方
repo sync
- 上記のコマンドで、指定されたリポジトリと同期をとります。
-j
オプションを使うことで、並列処理を活用した高速な同期が可能です。
- セキュリティパッチの適用
- AOSPのリポジトリを定期的に同期させることは、セキュリティパッチを迅速に適用するためにも重要です。特にセキュリティに関するアップデートが行われた際は、早急に同期をとり、パッチを取り込むことが求められます。
- 例えば、セキュリティパッチが適用されたら、
repo sync
を実行して、その後に変更点をテストすることが推奨されます。
OTAアップデートの実装
[編集]AOSPでは、端末のソフトウェアをOTA(Over The Air)でアップデートできる仕組みを実装できます。この仕組みは、ユーザーが手動でアップデートをダウンロードしたりインストールしたりする手間を省くもので、更新作業を自動化するために非常に有用です。
A/Bアップデートの仕組み
[編集]Androidでは、A/Bパーティションを使ったアップデート方式が採用されています。これにより、システムの更新中に不具合が発生しても、片方のパーティションがそのまま動作し続けることができます。A/Bアップデートを利用すると、システムの更新をスムーズに実行でき、端末の安定性が向上します。
- A/Bパーティションの構成
- A/Bパーティションは、通常2つのシステムパーティション(
system_a
とsystem_b
)を持ち、どちらかを新しいバージョンに更新し、アップデート後に再起動を行います。もし新しいシステムに問題が発生した場合、システムは自動的に前回の安定したバージョンに戻ります。
- A/Bパーティションは、通常2つのシステムパーティション(
OTAパッケージの作成
[編集]OTAパッケージは、AOSPのビルドシステムによって作成され、A/Bパーティションの更新を管理します。以下の手順でOTAパッケージを生成できます:
- OTAパッケージの作成
- OTAパッケージを作成するためには、
ota_tools
を使って更新ファイルを生成します。これには、build/
ディレクトリ内にあるota_from_target_files
スクリプトを使用します。 python ota_from_target_files.py --create_target_files=target_files.zip --output_dir=out/
- OTAパッケージを作成するためには、
- OTAアップデートの配信
- 作成したOTAパッケージは、サーバーにアップロードし、ユーザー端末に送信されることになります。これにより、ユーザーはインターネット経由でアップデートを受け取ることができます。
附録
[編集]この附録では、AOSPの開発および運用中に遭遇する可能性のあるよくあるエラーやその対処法、参考資料、関連リンク、用語集について説明します。AOSPの開発において、問題解決のためのリソースや基本的な用語の理解が重要です。
よくあるエラーと対処法
[編集]AOSPのビルドやカスタマイズ作業中に遭遇する一般的なエラーとその解決策を紹介します。
エラー1: repo sync
が失敗する
[編集]repo sync
が失敗する原因としては、ネットワークの問題やリポジトリの不整合が考えられます。これを解決するためには以下の手順を試してみてください。
- 対処法
- ネットワーク接続を確認し、再試行します。
repo sync
に-j
オプションを追加して、並列処理を強化します。repo sync
を実行する前に、キャッシュをクリアするためにrepo prune
を実行します。
repo prune repo sync -j8
エラー2: lunch
コマンドでターゲット選択ができない
[編集]lunch
コマンドを使ってターゲットを選択する際にエラーが発生することがあります。これは、ターゲットが正しく設定されていないか、ビルド設定に問題がある場合です。
- 対処法
lunch
コマンドで表示されるターゲットのリストを確認し、正しいターゲットが選ばれているか確認します。- 必要であれば、
device/
ディレクトリ内にターゲットデバイスの構成ファイルが存在することを確認します。
lunch <target_name>
エラー3: ビルドが成功しない
[編集]AOSPのビルド時にエラーが発生する場合、ビルドツールや依存関係に問題がある可能性があります。
- 対処法
- ビルドログを確認して、具体的なエラー箇所を特定します。
- 必要なパッケージが不足していないか確認します。例えば、
sudo apt-get install
で不足しているパッケージをインストールすることができます。 - 再度ビルドを試みる前に、
make clean
やmake clobber
を実行してキャッシュや古いビルドをクリアします。
make clean
参考資料・関連リンク
[編集]AOSPに関する追加の資料やリンクを以下に紹介します。これらのリソースは、AOSPの開発をさらに深く理解し、トラブルシューティングを行う際に役立ちます。
- 公式AOSPサイト
- Android開発者向け公式ドキュメント
- AOSPリポジトリ
- GitHubでのAOSP関連リポジトリ
- Androidセキュリティチームブログ
- Stack Overflow
- AOSPの開発に関する質問と回答が豊富にあります。エラーメッセージや特定の問題に関する情報を検索できます。
- https://stackoverflow.com/questions/tagged/aosp
用語集
[編集]AOSP開発でよく使われる用語を簡潔に解説します。
- AOSP (Android Open Source Project)
- Androidのオープンソースプロジェクト。Androidの基本的なソースコードを提供します。
- GMS (Google Mobile Services)
- Googleが提供するアプリやサービスの集合体。AOSPには含まれていない。
- SELinux (Security-Enhanced Linux)
- Linuxカーネルのセキュリティモジュールで、AOSPのセキュリティを強化します。
- HAL (Hardware Abstraction Layer)
- ハードウェアとソフトウェアの間に位置する層で、デバイスの抽象化を行います。
- A/Bパーティション
- Androidデバイスのシステムアップデートをサポートする2つのパーティション。これにより、アップデート中にデバイスが破損するリスクを低減します。
- repo
- Googleが開発した、複数のGitリポジトリを管理するためのツール。AOSPのソースコード管理に使用されます。
- Fastboot
- Android端末を高速で再起動し、ブートローダーを操作するためのツール。
- TWRP (Team Win Recovery Project)
- カスタムリカバリーツール。Androidデバイスのバックアップ、復元、カスタマイズに使用されます。
- Verified Boot
- Androidデバイスが起動する際に、システムが改ざんされていないかを検証する仕組み。
この附録では、開発者がAOSPを扱う際に役立つ情報を集めました。よくあるエラーやトラブルシューティングの方法、さらには重要なリソースや用語を理解することで、よりスムーズにAOSPの開発作業を進めることができます。