Unmotivated

やる気はない

Android Library Project と JAR の違いを理解する

Android でライブラリを使用する際、プロジェクトを作成する必要のあるライブラリプロジェクトと、クラスライブラリの JAR と2種類存在するけれど、それぞれどう違うのか軽く調べました。

ライブラリプロジェクトと JAR の違い

最も根本的な違いは Resources を内包しているかどうかのようです。
ライブラリプロジェクトは Resources を保持できるので、 JAR のように静的に APK に組み込むことができません。 そのためプロジェクトとして作成した上で、組み込みたいプロジェクトに依存させて、ビルド時に R.java を一緒に作成する必要があります。

Android APK のビルドの流れを軽く理解する

完全に上記参考サイトの受け売りですが、Android APK のビルドの流れも要点だけ追っておきます。 (これを以前追っておいたおかげで、 Gradle のビルドで詰まったときなどにとても役立ちました)

もっと詳しく理解する場合は、リンク先をご確認下さい。

Android APK のビルド

  • リソースと ID の対応づけを持った R.java を作る
  • .java を .class にコンパイル
  • .class(bin/classes) をまとめて Dalvik ByteCode である .dex にコンパイル
  • .dex を APK に追加する

JAR を含んだ Android APK のビルド

  • Android APK のビルドにおいて、 .dex を作るときに JAR Library(実体は.class) を .dex に一緒にまとめてコンパイルするだけ

Android Library を含めた Android APK のビルド

  • 依存関係を計算
  • R.java を作る
    • Library Project の AndroidManifest.xml は無視される
1
2
3
4
5
6
aapt package –f –m –auto-add-overlay
    –M /absolute/path/to/app/AndroidManifest.xml
    –S /absolute/path/to/app/res
    -S /absolute/path/to/library-project/res
    -I /absolute/path/to/android.jar
    -J /absolute/path/to/app/gen
  • Android Library を含めた .java を .class にコンパイル
1
2
javac <other options> –sourcepath
    /absolute/path/to/app/src;/absolute/path/to/app/gen/;absolute/path/to/library-project/src
  • .class を .dex にコンパイル
  • resources を Library Project の分もまとめてマージしてパッケージ
  • マージされた resources と、マージされた .dex を .apk に追加する

Comments