1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

男坂Advent Calendar 2020

Day 5

手早く健全にAOSPのコードを流用する

Last updated at Posted at 2020-12-04

概要

アプリで機能を実装する時、AOSPの標準アプリで同じ機能を持っているケースがある。そういうとき、ライブラリを使わずにAOSPからコードを流用すると良いこともある。

  • 余分なライブラリを入れなくて済む。素のAndroid APIだけで実装されているので。
  • APIの使い方が上手く、参考になる。Androidの中の人たちが実装しているので。
  • 単にライブラリを使うだけだとブラックボックスになっているAndorid Frameworkの仕組みの一端が知れる

ということで、AOSPからのコードの流用する手順を記す。

手順

  1. 実装したい機能を持っていそうなAndroid標準アプリを思い浮かべる
  2. Android Code Searchで、AOSPのソースコードで、目的の機能を実装しているファイルを探す1
  3. 目的のファイルを自分のプロジェクトに取り込む
  • ライセンスは大体「Apache License Version 2.0」。
  • 以下の手順は、そのルールに準拠するためのもの。
  1. コードを修正したら、そのファイルの目立つ箇所に変更点を記述する
  2. 元のファイルのプロジェクト内のNOTICEファイルを探して、自分のプロジェクトにコピペする
  3. Apache License Version 2.0の成果物を使っていること、Licenseの使用許諾書のコピーを利用者に示す

ケーススタディ

0. 前提

端末の向きを変えた時、画面全体でなく一部のViewだけ回転させる機能を実装する。
そのViewは、ライブラリとして頒布する。
以下、イメージ。

1. 実装したい機能やUIを持っていそうなAndroid標準アプリを思い浮かべる

カメラアプリ。
大体のカメラアプリでは、端末を回転させると画面全体でなくフラッシュアイコンなどの一部のViewだけが回転するから。

2. AOSPのソースコードで、目的の機能を実装しているファイルを探す

AOSPのカメラアプリのソースコードを探す。

  1. Android Code Searchにアクセス。
  2. Android -> リポジトリ「platform-subproject」 -> packages -> appsを選択
  • 中を見るとCamera2とLegacyCameraがある。これがAOSPのカメラアプリ。
  1. それっぽい単語"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).

実践例

  1. Androidのビルドできる環境を構築 -> Emulator起動 -> 標準アプリをリモートデバッグすると、検索よりも絞り込みが簡単だが、手早くはパクれない。

  2. NOTICEファイルがない場合は、自分のプロジェクトにコピペする必要なし。

  3. プロジェクトがアプリの場合は、アプリにNOTICEの内容を表示する画面を入れて、見れるようにすればよさそう。

  4. プロジェクトがアプリの場合は、アプリにApache License Version 2.0の内容を表示する画面を入れて、見れるようにすればよさそう。NOTICEと内容重複しているので、NOTICEの表示するなら、対応不要。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?