arcanum_jp’s blog

おっさんの日記

Android StudioのImport Moduleは単に作業中のプロジェクトにコピーするから不便だから、モジュールを参照で済ませたい

コピーされてきてしまうと、AndroidApp1のJavaLibBのソースコードを変更しても、当然ながら、AndroidApp2のJavaLibBは変わりません。
これでは意味が無いので、なんとかただ「参照」する方法がないか、探しました。
結果、出来たのでその方法を。

http://qiita.com/le_skamba/items/3a9d5aa2d4a96a18daac

 ※ 内容は上記のことを自分が経験した順に書いただけのものです。お急ぎの方は上記URLをどうぞ


こんな構成のアプリケーションを作っています。



 プロジェクトに1つのモジュールがあるシンプルな構成です。このアプリケーションが汎用性のあることに気が付きました。そこで、いったんこのアプリを継承したアプリをつくり、差分を変更していけば複数の似たようなアプリを作れるのではと考えました。共通的な機能はProjectMyApp側を変更すれば派生したアプリに変更が影響します。こんな感じですね。

 この時のメモとして残します。見た人の参考になるかはわかりませんが。。。

Moduleのインポートを行う

 [appmodule]側では、ライブラリとして生きてもらうため、設定を変更します。

 1.module SettingsでアプリケーションIDなどを消してあげます。
 2.build.gradleの冒頭にあるapply plugin: 'com.android.Project'を apply plugin: 'com.android.library'にします 
  ・・・などでしょうか

それでもう一つ[ProjectHoge]プロジェクトを作り、モジュール名で[hogemodule]のアプリを新規に追加します。そして先の[appmodule]を「File」⇒「New」⇒「Import Module」で[appmodule]をインポートします。そうすると下のようにProjectHoge側に[ProjectMyApp::appmodule]が追加されました。

 万事解決したように見えます。しかしこれ、[appmodule]のディレクトリがProjectHogeにコピーされただけです。ProjectHoge側のappmoduleを変更してもProjectMyAppには影響しません。これではまた別にProjectFugaを作って先の[appmodule]をインポートした場合など、[appmodule]があちこちに分散してしまい非常に効率が悪いです。

 これでは目的の派生管理ができないので、この方法ではダメです。

モジュールの参照を作る

 まずライブラリにする設定は前述でやっているので不要です。

 その上で、ProjectHoge側で以下の設定をしていきます

settings.gradle

 多分 include ':hogemodule'しか書いていないと思いますので下記のように書き換えます。パスは絶対でもいいですが相対の場合プロジェクトディレクトリからの相対パスです

include ':appmodule', ':hogemodule'

project(':appmodule').projectDir = new File('../ProjectMyApp/appmodule')
project(':hogemodule').projectDir = new File('./hogemodule')

 これでまず、ProjectHoge側にappmoduleが見えるようになったと思います。ためしにここでappmodule側のファイルを変更すると、元のProjectMyApp側のファイルが変更されるので、参照で見ていることになります。ただこの時点ではまだhogemodule側からはappmodule側のリソースは見えません。依存を設定してやる必要があります。

依存関係の追加

hogemodule.gradleを開き、依存関係を追加してやります。IDEのmodule Settingsの画面を開き、依存関係の追加でもいいです。

  ... 省略

dependencies {
    ... 省略
    compile project(':appmodule')
}

 これで参照関係でプロジェクトに追加したモジュールに依存する形になりました。ただし、ここで依存関係にあるリソースとの競合で大量のエラーと戦う事になってきます。

競合の解消

 プロジェクトを新規に作るとデフォルトで入ってくるアイコンやdimens.xmlなどの重複した内容が競合としてエラーになっていたりします。だいたい次のようなパターンがありました。ここでは依存される側を「親モジュール」、依存する側を「子モジュール」と表現します。また、モノによっては両方にあるのに競合にならないケースもあります。なんでなんでしょ・・・

 1.親モジュール側のリソースが不用だけど重複しているので競合なパターン
 2.子モジュール側のリソースが不用だけど重複しているので競合なパターン
 3.両方のモジュールのリソースが不用だけど重複しているので競合なパターン
 4.親モジュールと子モジュールのbuild.gradleにあるdependenciesのライブラリバージョンが異なるため競合のパターン
 
 消すなり合わせるなりしてください。


 競合を解消するとコンパイルが完了して起動できるようになります。

以上!!(`・ω・´)キリッ