概要
アプリで機能を実装する時、AOSPの標準アプリで同じ機能を持っているケースがある。そういうとき、ライブラリを使わずにAOSPからコードを流用すると良いこともある。
- 余分なライブラリを入れなくて済む。素のAndroid APIだけで実装されているので。
- APIの使い方が上手く、参考になる。Androidの中の人たちが実装しているので。
- 単にライブラリを使うだけだとブラックボックスになっているAndorid Frameworkの仕組みの一端が知れる
ということで、AOSPからのコードの流用する手順を記す。
手順
- 実装したい機能を持っていそうなAndroid標準アプリを思い浮かべる
- Android Code Searchで、AOSPのソースコードで、目的の機能を実装しているファイルを探す1
- 目的のファイルを自分のプロジェクトに取り込む
- ライセンスは大体「Apache License Version 2.0」。
- 以下の手順は、そのルールに準拠するためのもの。
- コードを修正したら、そのファイルの目立つ箇所に変更点を記述する
- 元のファイルのプロジェクト内のNOTICEファイルを探して、自分のプロジェクトにコピペする
- Apache License Version 2.0の成果物を使っていること、Licenseの使用許諾書のコピーを利用者に示す
ケーススタディ
0. 前提
端末の向きを変えた時、画面全体でなく一部のViewだけ回転させる機能を実装する。
そのViewは、ライブラリとして頒布する。
以下、イメージ。
1. 実装したい機能やUIを持っていそうなAndroid標準アプリを思い浮かべる
カメラアプリ。
大体のカメラアプリでは、端末を回転させると画面全体でなくフラッシュアイコンなどの一部のViewだけが回転するから。
2. AOSPのソースコードで、目的の機能を実装しているファイルを探す
AOSPのカメラアプリのソースコードを探す。
- Android Code Searchにアクセス。
- Android -> リポジトリ「platform-subproject」 -> packages -> appsを選択
- 中を見るとCamera2とLegacyCameraがある。これがAOSPのカメラアプリ。
- それっぽい単語"Rotate"でpackages/appsの中を検索
- 「packages/apps/LegacyCamera/src/com/android/camera/ui/RotateLayout.java」が見つかる。コードを見ると、実現したい機能を実装しているViewであることが分かる。
3. 目的のファイルを自分のプロジェクトに取り込む
タイトルそのままのことを実施。必要に応じて、適宜修正を加える。
ファイルの先頭の方にあるCopyrightやApache License Version 2.0の部分は消したり修正しないこと。ライセンスのルール違反になる。
4. コードを修正したら、そのファイルの目立つ箇所に変更点を記述する
「目立つ」箇所というのは、Apache License Version 2.0の原文でそう書かれている。
正直、「目立つ」の基準はよくわからない。
とりあえず、もともとのライセンス文の少し下に変更点を書いておく。
以下、例。
/**
* Changes from the original file
*
* - The original file was changed from Java to Kotlin.
* - Refactored code
* - ...
*/
5. 元のファイルのプロジェクト内のNOTICEファイルを探して、自分のプロジェクトにコピペする
ここでは、AOSPのpackages/apps/LegacyCameraからファイルを流用したので、この中にNOTICEファイルがないか調べる2。
Android Code Searchを使って探すと、LegacyCameraに直下にNOTICEファイルが見つかるので、自分のプロジェクトにコピペする3。
6. Apache License Version 2.0の成果物を使っていること、Licenseの使用許諾書のコピーを利用者に示す
ライブラリプロジェクトなので、ライブラリのREADME.mdに以下の記述を含める4。
This library includes the work that is distributed in the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0).
実践例