Wednesday, February 28, 2024

Androidカスタムの原点: FastbootによるAOSP導入

Androidというオペレーティングシステムは、そのオープンソースの性質から、ユーザーによる自由なカスタマイズと開発が可能なプラットフォームとして知られています。そのカスタマイズの中核をなす技術が「Fastboot」であり、その究極の目標の一つが「AOSP(Android Open Source Project)イメージ」の導入です。メーカーによってプリインストールされたソフトウェアやUIから脱却し、純粋なAndroid体験を求める開発者やパワーユーザーにとって、FastbootとAOSPは避けては通れない道です。本稿では、Fastbootプロトコルの基本的な概念から、AOSPイメージの構造、そしてそれらを活用してデバイスを完全に掌握するための具体的な手順まで、深く掘り下げて解説します。

第1章:基盤となる二つの柱:FastbootとAOSPの深層理解

Androidデバイスのシステムを改変する旅は、まずその根幹をなす二つの要素、FastbootとAOSPを正確に理解することから始まります。これらは単なるツールやソフトウェアではなく、Androidエコシステムの柔軟性と拡張性を支える哲学そのものです。

Fastbootプロトコルの解剖

Fastbootは、多くの人がコマンドラインツールとして認識していますが、その本質はPC(ホスト)とAndroidデバイスのブートローダー(クライアント)との間で通信を行うためのプロトコルです。デバイスが通常のAndroid OSやリカバリーモードではなく、「Fastbootモード」または「ブートローダーモード」と呼ばれる特殊な状態で起動しているときにのみ機能します。

このモードでは、Androidの主要なシステムは一切起動しておらず、デバイスの心臓部であるブートローダーが直接PCからの命令を待ち受けています。これにより、OSが起動しないような深刻な状態であっても、デバイスのストレージ(フラッシュメモリ)に直接アクセスし、システムパーティションを書き換えるといった低レベルな操作が可能になります。

  • ブートローダーとは何か?: ブートローダーは、デバイスの電源が投入されたときに最初に実行されるプログラムです。その主な役割は、ハードウェアの初期化を行い、次に起動すべきパーティション(通常はAndroidのカーネルが含まれるbootパーティション)を読み込んで実行することです。Fastbootは、このブートローダーに組み込まれた機能の一つと考えることができます。
  • FastbootとADBの違い: 初心者が混同しがちなのがADB(Android Debug Bridge)です。ADBは、起動したAndroid OS上で動作し、アプリのインストール、ファイルの転送、ログの取得など、OSレベルのデバッグ操作を行います。一方、FastbootはOSが起動する前のブートローダーレベルで動作し、パーティションの書き込みや消去など、より根本的なシステム操作を担当します。「ADBは家の中での作業、Fastbootは家の基礎工事」と例えることができます。

AOSP(Android Open Source Project)の真価

AOSPは、Googleが主導して開発しているオープンソースのAndroidプラットフォームそのものです。一般のユーザーがスマートフォンで触れているAndroidは、このAOSPをベースに、各デバイスメーカー(Samsung, Sony, Xiaomiなど)が独自の改良やカスタマイズを加えたものです。これには、独自のユーザーインターフェース(One UI, Xperia UIなど)、プリインストールアプリ、ハードウェアに最適化されたドライバなどが含まれます。

AOSPイメージをデバイスにフラッシュするということは、これらメーカーによるカスタマイズをすべて取り払い、Googleが意図した「素の」Androidをインストールすることを意味します。

AOSPイメージの構成要素

AOSPイメージは単一のファイルではなく、Androidシステムを構成する複数のパーティションイメージの集合体です。主要なものを以下に示します。

  • boot.img: AndroidカーネルとRAMディスクを含みます。OSを起動するための最も重要なイメージの一つです。
  • system.img: Androidフレームワーク、システムライブラリ、プリインストールされたシステムアプリなど、OSの本体が格納されています。
  • vendor.img: デバイス固有のハードウェア抽象化レイヤー(HAL)やプロプライエタリなドライバなど、特定のハードウェアを動作させるために必要なファイルが含まれます。Project Treble以降、systemから分離されました。
  • recovery.img: システムのアップデートやデータ消去、バックアップなどを行うためのリカバリー環境のイメージです。
  • userdata.img: ユーザーデータ(アプリ、設定、写真など)が保存される領域です。通常、このパーティションはフラッシュ時に初期化(ワイプ)されます。
  • cache.img: アプリやシステムのキャッシュデータを保存する一時的な領域です。
  • radio.img: モデムファームウェア。通信(セルラー、Wi-Fi, Bluetooth, GPS)を制御します。
  • bootloader.img: ブートローダー本体のイメージ。アップデートは慎重に行う必要があります。

Fastbootは、これらの個別のイメージファイルを、デバイス上の対応するパーティションに一つずつ書き込む(フラッシュする)ための架け橋となるのです。この関係性を理解することが、Androidシステムのカスタマイズを成功させるための鍵となります。

第2章:戦いの前の準備:開発環境の構築とデバイスの解放

強力なツールであるFastbootを扱うには、適切な準備が不可欠です。PC側の環境設定と、デバイス側の「封印」を解く作業は、全プロセスの成否を分ける重要なステップです。

ホストPCの環境構築

Fastbootコマンドは、PC上で実行されるクライアントソフトウェアです。これはGoogleから「Android SDK Platform-Tools」というパッケージの一部として提供されています。

1. Android SDK Platform-Toolsのインストール

まず、Googleの公式Android開発者サイトから、お使いのOS(Windows, macOS, Linux)に対応した最新のPlatform-Toolsをダウンロードします。これは、adb, fastbootなどのコマンドラインツールのみを含む軽量なパッケージです。

  • Windowsの場合: ダウンロードしたzipファイルを、C:\platform-toolsのようなわかりやすい場所に展開します。
  • macOS/Linuxの場合: 同様に、ホームディレクトリなど任意の場所にzipファイルを展開します。

2. PATH環境変数の設定

毎回platform-toolsフォルダに移動してコマンドを実行するのは非効率です。PATH環境変数にこのフォルダのパスを追加することで、ターミナル(コマンドプロンプト)のどこからでもfastbootコマンドを実行できるようになります。

  • Windows 10/11:
    1. 「システムのプロパティ」を開き、「環境変数」ボタンをクリックします。
    2. 「システム環境変数」の「Path」を選択し、「編集」をクリックします。
    3. 「新規」をクリックし、先ほど展開したplatform-toolsフォルダのパス(例:C:\platform-tools)を入力してOKを押します。
    4. 開いているすべてのコマンドプロンプトを再起動して設定を反映させます。
  • macOS/Linux:
    1. お使いのシェル(bash, zshなど)の設定ファイル(~/.bash_profile, ~/.zshrcなど)をテキストエディタで開きます。
    2. ファイルの末尾に以下の行を追加します(パスはご自身の環境に合わせてください)。
      export PATH=$PATH:~/path/to/your/platform-tools
    3. ファイルを保存し、ターミナルでsource ~/.bash_profile(または~/.zshrc)を実行するか、ターミナルを再起動します。

設定後、新しいターミナルを開き、fastboot --versionと入力してバージョン情報が表示されれば、PATHの設定は成功です。

3. USBドライバのインストール (主にWindows)

Windowsでは、デバイスをFastbootモードで正しく認識させるために、適切なUSBドライバが必要です。多くの場合、Google USB Driverが利用できます。これはAndroid StudioのSDK Managerからインストールするか、単体でダウンロードできます。インストール後、デバイスをFastbootモードで接続し、デバイスマネージャーで「Android Phone」 > 「Android Bootloader Interface」として認識されていることを確認してください。認識されていない場合は、ドライバを手動で更新する必要があります。macOSやLinuxでは、通常、追加のドライバは不要です。

Androidデバイスの準備:ブートローダーアンロック

ほとんどの市販デバイスは、セキュリティ上の理由から、ブートローダーがロックされた状態で出荷されます。ブートローダーがロックされていると、Fastboot経由で署名されていないカスタムイメージ(AOSPなど)をフラッシュすることはできません。したがって、最初の、そして最も重要なステップはブートローダーのアンロックです。

警告:ブートローダーをアンロックすると、デバイスの保証が無効になる可能性があります。また、セキュリティレベルが低下し、デバイス上のすべてのユーザーデータ(写真、アプリ、設定など)が完全に消去されます。必ず事前にバックアップを取ってください。

1. 「開発者向けオプション」と「USBデバッグ」の有効化

  1. デバイスの「設定」アプリを開きます。
  2. 「デバイス情報」(または「タブレット情報」)に移動します。
  3. 「ビルド番号」の項目を、「デベロッパーになりました!」というメッセージが表示されるまで7回連続でタップします。
  4. 設定メニューに戻ると、「システム」の中に「開発者向けオプション」という新しい項目が表示されます。
  5. 「開発者向けオプション」に入り、「USBデバッグ」をオンにします。

2. 「OEMロック解除」の有効化

同じく「開発者向けオプション」内に、「OEMロック解除」というスイッチがあります。これをオンにしてください。これにより、ブートローダーをFastboot経由でアンロックすることが許可されます。このオプションが表示されないデバイス(一部のキャリアモデルなど)は、ブートローダーのアンロックが公式にはサポートされていません。

3. アンロックコマンドの実行

  1. デバイスの電源を切り、Fastbootモードで起動します。起動方法はメーカーによって異なりますが、一般的には「音量ダウンボタン」と「電源ボタン」を同時に長押しします。
  2. USBケーブルでデバイスをPCに接続します。
  3. PCのターミナルで fastboot devices と入力します。デバイスのシリアル番号が表示されれば、正しく接続されています。何も表示されない場合は、ドライバやケーブルの問題を確認してください。
  4. いよいよアンロックコマンドを実行します。コマンドはデバイスの世代によって異なります。
    • 比較的新しいデバイス (Pixel 3以降など): fastboot flashing unlock
    • 古いデバイス: fastboot oem unlock
  5. コマンドを実行すると、デバイスの画面に警告メッセージと確認プロンプトが表示されます。音量ボタンで「Yes」を選択し、電源ボタンで決定します。
  6. プロセスが完了すると、デバイスは自動的にデータを消去し、再起動します。ブートローダーはアンロックされた状態になります。起動時のロゴ画面で、鍵が開いたアイコンや警告メッセージが表示されるようになりますが、これは正常な動作です。

第3章:Fastbootコマンド体系の詳解

Fastbootは、シンプルながらも非常に強力なコマンド群で構成されています。ここでは、主要なコマンドを機能別に分類し、その構文と実践的な使用例を詳しく解説します。

カテゴリ1:デバイス情報と基本制御

これらのコマンドは、デバイスの状態を確認したり、基本的な操作を行うために使用します。

fastboot devices [-l]
  • 機能: Fastbootモードで接続されているデバイスのリストを表示します。最も基本的な接続確認コマンドです。
  • オプション: -l を付けると、USBデバイスパスなど、より詳細な情報が表示されます。
  • 使用例: fastboot devices123456789ABCDEF fastboot のような出力が得られます。
fastboot getvar <variable>
fastboot getvar all
  • 機能: ブートローダーが保持している様々な変数の値を読み取ります。allを指定すると、製品名、シリアル番号、ブートローダーのバージョン、パーティション情報など、非常に多くの情報を一度に取得でき、トラブルシューティングに役立ちます。
  • 使用例: fastboot getvar product(bootloader) product: sailfish (Pixelの場合)
  • 使用例: fastboot getvar unlocked(bootloader) unlocked: yes (アンロック済みの場合)
fastboot reboot [bootloader|recovery]
  • 機能: デバイスを再起動します。
  • オプション:
    • 引数なし: 通常通りAndroid OSを起動します。
    • bootloader: Fastbootモードで再起動します。ファームウェアを複数回フラッシュする際に便利です。
    • recovery: リカバリーモードで起動します。
  • 使用例: fastboot reboot bootloader

カテゴリ2:フラッシュ(書き込み)操作

システムの心臓部を操作する、Fastbootの最も重要なコマンド群です。

fastboot flash <partition> [filename.img]
  • 機能: 指定したパーティションに、指定したイメージファイル(.img)を書き込みます。これがAOSPイメージをインストールする際の中心的なコマンドです。
  • 引数:
    • <partition>: 書き込み先のパーティション名(例: boot, system, recovery, vendor)。
    • [filename.img]: 書き込むイメージファイルのパス。
  • 使用例: fastboot flash boot boot.img
  • 使用例: fastboot flash system C:\aosp\images\system.img
fastboot update <filename.zip>
fastboot flashall
  • 機能: ファクトリーイメージに含まれるような、複数のイメージファイル(boot.img, system.imgなど)とandroid-info.txtを内包した特別なzipファイルを一括でフラッシュします。flashallは、カレントディレクトリにあるファクトリーイメージ(を解凍したファイル群)を自動的にフラッシュしようと試みます。
  • 注意: これらのコマンドは通常、デフォルトで-wオプション(後述)の動作を含み、ユーザーデータを消去します。
  • 使用例: fastboot update image-sailfish-opm1.171019.011.zip

カテゴリ3:パーティション管理

パーティションを直接操作する高度なコマンドです。使用には注意が必要です。

fastboot erase <partition>
  • 機能: 指定したパーティションのデータを完全に消去します。フラッシュ前にパーティションをクリーンな状態にするために使われることがあります。
  • 使用例: fastboot erase cache (キャッシュパーティションを消去)
  • 使用例: fastboot erase userdata (ユーザーデータを消去、工場出荷時リセットと同じ効果)
fastboot format[:<filesystem_type>] <partition>
  • 機能: 指定したパーティションを特定のファイルシステム(ext4, f2fsなど)でフォーマットします。eraseよりも低レベルな操作です。通常は使用する必要はありません。
fastboot -w
  • 機能: これは独立したコマンドではなく、flashallupdateコマンドと組み合わせて使用されるオプションです。-wは "wipe" を意味し、userdatacacheパーティションを消去します。メジャーバージョンのアップグレードや、異なるROMへの乗り換え時には、クリーンインストールを行うためにこのオプションが必須です。
  • 使用例: fastboot -w update image-marlin-pq3a.190801.002.zip

カテゴリ4:ブートローダー制御と一時的な起動

fastboot flashing lock|unlock
  • 機能: ブートローダーをロックまたはアンロックします。デバイスを売却する際や、セキュリティを元の状態に戻したい場合にlockコマンドを使用します。
  • 警告: カスタムROMをインストールした状態でブートローダーを再ロックしないでください。デバイスが起動しなくなる(ブリックする)危険性が非常に高いです。再ロックは、必ず公式のファクトリーイメージに戻した後に行ってください。
fastboot boot <kernel_filename.img> [ramdisk_filename.img]
  • 機能: 指定したカーネル(またはリカバリーイメージ)をデバイスにフラッシュせずに、一時的にメモリに読み込んで起動します。これは非常に便利なコマンドで、カスタムリカバリー(TWRPなど)やカスタムカーネルを、実際に書き込む前にお試しで起動することができます。問題があれば、再起動するだけで元の状態に戻ります。
  • 使用例: fastboot boot twrp-3.7.0_9-0-sailfish.img (TWRPのリカバリーイメージを一時的に起動)

第4章:実践:AOSPファクトリーイメージのフラッシュ手順

理論と準備が整ったところで、実際にAOSPイメージをデバイスにフラッシュする手順を、二つのアプローチで見ていきましょう。ここではGoogle Pixelデバイスを例に、公式ファクトリーイメージを使用します。

ステップ1:適切なファクトリーイメージのダウンロード

Googleの「Factory Images for Nexus and Pixel Devices」ページにアクセスします。ご自身のデバイスのコードネーム(例:Pixel 7 Proは "cheetah")に一致する最新のファクトリーイメージをダウンロードします。ダウンロードしたファイルは .zip 形式のアーカイブです。これをPC上の作業用フォルダ(例:C:\aosp\)に展開します。

展開すると、中には以下のようなファイルが含まれているはずです。

  • bootloader-<device>-<version>.img: ブートローダーイメージ
  • radio-<device>-<version>.img: ラジオ(モデム)イメージ
  • image-<device>-<version>.zip: boot, system, vendorなど主要なシステムイメージを含むzipファイル
  • flash-all.bat: Windows用の自動実行スクリプト
  • flash-all.sh: macOS/Linux用の自動実行スクリプト
  • android-info.txt: デバイスの互換性をチェックするための情報ファイル

ステップ2:デバイスの接続と確認

  1. デバイスの電源を切り、Fastbootモードで起動します(音量ダウン+電源長押し)。
  2. USBケーブルでPCに接続します。
  3. ターミナルを開き、ファクトリーイメージを展開したフォルダに移動します。
    cd C:\aosp\cheetah-build-number
  4. fastboot devicesコマンドで、デバイスが正しく認識されていることを確認します。

アプローチA:自動実行スクリプトによるフラッシュ(推奨)

初心者にとって最も簡単で安全な方法です。公式が提供するスクリプトが、必要な手順をすべて自動で実行してくれます。

  1. (重要) スクリプトの編集: flash-all.bat または flash-all.sh をテキストエディタで開きます。最終行近くに fastboot -w update ... という記述があります。この -w オプションがユーザーデータを消去する原因です。もしデータを保持したままアップデートしたい場合(非推奨、同バージョン内のマイナーアップデートのみに限定)は、この -w を削除して保存します。クリーンインストールが目的であれば、編集は不要です。
  2. スクリプトの実行:
    • Windows: コマンドプロンプトで flash-all.bat と入力してEnterキーを押します。
    • macOS/Linux: ターミナルで ./flash-all.sh と入力してEnterキーを押します。(実行権限がない場合は chmod +x flash-all.sh で権限を付与してください)
  3. あとはプロセスが完了するのを待つだけです。ブートローダー、ラジオ、システムイメージが順番にフラッシュされ、途中で何度かデバイスが自動で再起動します。すべての処理が完了すると、デバイスは新しくインストールされたAOSPで起動します。

アプローチB:手動による個別フラッシュ(学習用)

何が起こっているのかを正確に理解するため、スクリプトが行っている処理を一つずつ手動で実行してみましょう。これにより、各パーティションの役割への理解が深まります。

注意:以下の手順は順番が重要です。特にブートローダーのアップデート後は、再起動が必要です。

# 1. ブートローダーをフラッシュ
fastboot flash bootloader bootloader-cheetah-version.img

# 2. Fastbootモードで再起動し、新しいブートローダーを読み込む
fastboot reboot-bootloader

# 3. 少し待ってから、ラジオ(モデム)をフラッシュ
fastboot flash radio radio-cheetah-version.img

# 4. 再度Fastbootモードで再起動
fastboot reboot-bootloader

# 5. 主要なシステムイメージを含むzipファイルをフラッシュ (-wでユーザーデータをワイプ)
fastboot -w update image-cheetah-version.zip

# 6. 完了後、自動的に再起動されるが、されない場合は手動で再起動
fastboot reboot

この手動プロセスを経ることで、flash-allスクリプトが単なるブラックボックスではなく、一連のfastboot flashコマンドの集合体であることがわかります。

ステップ3:完了と初期設定

フラッシュ後の最初の起動は、通常よりも時間がかかることがあります(5分~10分程度)。焦らずに待ちましょう。Googleのロゴや起動アニメーションが長時間続くのは正常です。無事に起動すれば、見慣れたAndroidの初期設定画面が表示されます。これでAOSPイメージのフラッシュは成功です。

第5章:フラッシュ後の世界:検証、トラブルシューティング、そして次の一歩

AOSPのインストールはゴールではなく、新たなスタートです。正常に動作しているかを確認し、問題が発生した際の対処法を知っておくことが重要です。

フラッシュ後の正常性検証

初期設定を終えたら、デバイスの基本的な機能がすべて動作しているかを確認します。

  • システムバージョンの確認: 「設定」 > 「デバイス情報」 > 「Androidバージョン」を開き、フラッシュしたイメージのバージョンとビルド番号が正しく表示されていることを確認します。
  • 通信機能のテスト:
    • SIMカードを挿入し、モバイルデータ通信と通話が正常に行えるか確認します。
    • Wi-Fiに接続し、インターネットブラウジングができるか確認します。
    • Bluetoothデバイス(イヤホンなど)とペアリングできるかテストします。
    • GPSが現在地を正しく測位できるか、マップアプリなどで確認します。
  • ハードウェア機能のテスト:
    • カメラ(前面・背面、写真・動画)が正常に動作するか確認します。
    • スピーカーとマイクが機能しているか、音楽再生や通話でテストします。
    • 指紋認証や顔認証などの生体認証センサーが登録・使用できるか確認します。

これらの基本機能がすべて問題なく動作すれば、フラッシュは完全に成功したと言えます。

一般的なトラブルシューティング

フラッシュプロセス中やその後に問題が発生することは珍しくありません。冷静に対処法を理解しておきましょう。

問題1:デバイスが起動しない、または起動ロゴで止まる(ブートループ)

  • 原因A:データの不整合: 異なるバージョンのROMやメジャーアップデートを、ユーザーデータを消去せず(-wなしで)フラッシュした場合に発生しやすいです。
  • 解決策A: Fastbootモードで再起動し、fastboot -w update ... を再実行するか、fastboot erase userdatafastboot erase cache を実行してから再起動してみてください。データは消えますが、これが最も確実な解決策です。

  • 原因B:不適切なイメージ: デバイスのモデルに合わないファクトリーイメージをフラッシュしてしまった可能性があります。
  • 解決策B: 正しいデバイスモデルのファクトリーイメージを再度ダウンロードし、クリーンフラッシュ(-wあり)をやり直してください。

  • 原因C:フラッシュの失敗: フラッシュプロセス中にUSBケーブルが抜けたり、PCがクラッシュしたりすると、システムファイルが破損することがあります。
  • 解決策C: フラッシュプロセスを最初からもう一度、丁寧に行ってください。

問題2:Fastbootでデバイスが認識されない ("waiting for any device")

  • 原因A:USBドライバの問題 (Windows): ドライバが正しくインストールされていないか、古い可能性があります。
  • 解決策A: デバイスマネージャーを開き、デバイスが「Android Bootloader Interface」として認識されているか確認します。感嘆符が付いている場合は、ドライバを再インストールしてください。

  • 原因B:物理的な接続の問題: USBケーブルの不良、PCのUSBポートの不具合、またはデバイス側のポートの問題が考えられます。
  • 解決策B: 別の高品質なUSBケーブルや、PCの別のUSBポート(特にマザーボード直結の背面ポート)を試してみてください。

  • 原因C:デバイスの状態: デバイスが完全にFastbootモードに入っていない可能性があります。
  • 解決策C: デバイスの電源を完全に切り、再度正しいキーコンビネーションでFastbootモードを起動してください。

問題3:フラッシュ中にエラーが発生する ("remote: 'partition table does not exist'", "FAILED (remote: 'flash write failure')")

  • 原因A:ブートローダーがロックされている: ブートローダーアンロックを忘れているか、何らかの理由で再ロックされている可能性があります。
  • 解決策A: fastboot getvar unlocked を実行して状態を確認し、no であればアンロックプロセスを再度行ってください。

  • 原因B:イメージファイルの破損: ダウンロード中にファイルが破損した可能性があります。
  • 解決策B: ダウンロードしたzipファイルのハッシュ値(SHA-256など)が、公式サイトに記載されているものと一致するか確認してください。一致しない場合は、再ダウンロードが必要です。

  • 原因C:権限の問題 (macOS/Linux): fastboot コマンドを実行する権限がない場合があります。
  • 解決策C: sudo fastboot ... のように、スーパーユーザー権限でコマンドを実行してみてください。

次の一歩:さらなるカスタマイズへ

純粋なAOSPを手に入れたあなたは、さらに深いカスタマイズの世界へ進むことができます。

  • ルート化 (Rooting): Magiskなどのツールを使って、システムのroot権限を取得します。これにより、広告ブロック、システムファイルの変更、高度なバックアップツールなど、通常では不可能な操作が可能になります。一般的には、boot.imgにパッチを当て、それをFastbootでフラッシュすることで実現します。
  • カスタムリカバリーの導入: TWRP (Team Win Recovery Project) などのカスタムリカバリーを導入すると、タッチ操作による高度なバックアップ(Nandroidバックアップ)、ROMのインストール、各種Modの適用が容易になります。fastboot flash recovery twrp.img コマンドで導入できます。
  • カスタムROMへの挑戦: AOSPをベースに、さらに多くの機能やカスタマイズオプションを追加したLineageOS, Pixel Experience, Paranoid AndroidなどのカスタムROMを試すこともできます。
  • AOSPのビルド: 究極のステップとして、AOSPのソースコードを自身でダウンロードし、自分のデバイス用にカスタマイズしてビルドすることも可能です。これはAndroid開発の最も深い領域への入り口です。

FastbootとAOSPをマスターすることは、Androidデバイスの真のポテンシャルを解き放ち、単なる消費者から創造者へとステップアップするプロセスです。それは時に困難でリスクを伴いますが、その先には、あなただけの理想的なスマートフォン体験が待っています。


0 개의 댓글:

Post a Comment