arcanum_jp’s blog

おっさんの日記

Android Studioでモジュールの依存関係で開発する

Andorid Studioに限らないのですが、共通的なプロジェクトを作っておき、各々のプロジェクトでそれを参照しながら作れば、効率いいよねぇ・・って考えてしまいます。そのようなアプリ構造を作りたくて、調べたことをここにメモっときます。下は自分の思考をなぞるように書いたので、手っ取り早く情報が欲しいかたは最後のまとめだけ見てください。

Android Studioでのプロジェクトの構成

 自分はいつもEclipseで開発をするのですが、IntelliJベースの思想とプロジェクトについてちょっと違うみたいです。

まずAndroid Studioがどのようにプロジェクトを管理しているのが知っておきましょう。プロジェクト管理を知る上で必要となる概念は,ProjectとModuleです。

Android開発に興味のある方の多くはEclipseをよくご存じかと思いますので,Eclipseと比較してみます

http://gihyo.jp/dev/serial/01/android_studio/0005

 いつもEclipseで開発する際、プロジェクトと言うと、アプリケーションそのモノと言うイメージでしたがこれで言うと、プロジェクトってのはもっと大きな概念なんですね。Eclipseで言うとワークスペースに当たるとあります。

 じゃぁEclipse脳の自分がプロジェクトと言っているものは一体なんだったんだ!となりますが、Android Studioではモジュールと言うものがそれにあたるそうです。つまり

Eclipseでプロジェクト同士依存関係持たせれば流用できてうれしいよね

は、

Android Studioでモジュール同士依存関係持たせれば流用できてうれしいよね

となるみたいです。

よく見るとモジュールセッティングとあります。自分がいかによく読まずに何かをやろうとしてい・・いや、なんでもないです。

依存関係の作り方(プロジェクトに複数のアプリ)

 ここではひとつの大きなプロジェクトがあって、その中に複数のアプリがあり、共通のモジュールを参照しているという想定です。冒頭で書いたとおり、自分がやりたかったことです。

新規プロジェクトと共通なモジュールを作る

 メニューから「File」⇒「New」⇒「New Project...」とたどっていき情報を入力していきます。Android Studioでは空のプロジェクトは作れないみたいですね。

 



こんな感じになります。

これだと、共通って感じがしないのでモジュール名を変えましょう。モジュール(写真ではapp)のところで右クリック⇒「Refactor」⇒「Rename」で変えられます。

変わりました。

依存される側のモジュールを作成

 次に先ほど作成した共通モジュールに依存して作られるアプリです。メニューから「File」「New」「New Module...」から作成します。

 できました。ただこの状態は単にひとつのプロジェクトにモジュールを追加しただけで、依存関係はありません。次にmyapplicationモジュールをComModuleに依存するモジュールにしてみます。

依存関係

myapplicationモジュールのところで右クリックし、「Open Module Settings」をクリックします。そこでDependenciesのタブを探して表示し、右端にある「+」ボタンから「Module Dependency」を選択し、ComModuleを追加します。


 追加されました。しかしここで画面にこんなメッセージが出てきます。明らかになんか間違った!って感じになります。

Gradle project sync completed with some errors. Open the 'Message' view to see the errors found.

 このとき画面下の方には、こんなメッセージが表示されています。たぶん上記の言っているメッセージビューとはこいつの事なんでしょうか。

Warning:Dependency Hoge:ComModule:unspecified on project myapplication resolves to an APK archive which is not supported as a compilation dependency. File: C:\temp\Hoge\ComModule\build\outputs\apk\ComModule-release-unsigned.apk


 メッセージビューのメッセージをダブルクリックすると、エラーのある箇所に飛びます。次の項目がエラーみたいです。

apply plugin: 'com.android.application'

まだGradleについて知識が浅いので何がなんだかわかりませんでしたが、とにかくメッセージそのまんまでググッたらありました。

In projLib's build.gradle file, you'll see a statement like this:

apply plugin: 'com.android.application'
which tells Gradle to build it as an application, generating an APK. If you change it to this:

apply plugin: 'com.android.library'
it will build as a library, generating an AAR, and it should work.

http://stackoverflow.com/questions/27536491/how-to-import-android-project-as-library-and-not-compile-it-as-apk-android-stud

 依存される側は、com.android.libraryを使うみたいです。ComModule側のbuild.gradle冒頭を次のように修正し、「Try again」をクリックします

//apply plugin: 'com.android.application'
apply plugin: 'com.android.library'

おお!今度は次のようなメッセージが!!

Error:Library projects cannot set applicationId. applicationId is set to 'jp.arcanum.hoge' in default config.

 どうやら依存されるライブラリ的なモジュールはApplication IDを持ってはいけないみたいです。モジュールセッティングスを表示して、アプリケーションIDを消してあげます。

 「OK」を押すとその時点でコンパイルが始まり、エラーがでないので依存ができました。ためしに依存する側でComModule側のアクティビティを使ってみます

 普通にComModule側のクラスが使えますし実行してみると画面も使えました。

まとめ

  • 依存される側のモジュールは、次の設定が必要
    • build.gradleで、「apply plugin: 'com.android.library'」を使う
    • アプリケーションIDは消す
  • 依存する側のモジュールは依存するモジュールをモジュールセッティングスの画面で追加する