Android Studioでライブラリプロジェクトを作成する
Android Studioでライブラリプロジェクトを作成しようとしたら新規プロジェクト作成でライブラリが選択できないので詰んだ。
ライブラリプロジェクトというのは、アプリケーションじゃなくてライブラリを作成するプロジェクトだと思っていたんだけど、Android Studioではプロジェクトの新規作成でライブラリプロジェクトというものは選択できない。なんでだろうと最初は思ったんだけど、
ライブラリ単体じゃ動作確認できないだろ。ボケ。
というメッセージが込められているに違いない。そう思うことにして、アプリケーションプロジェクトにライブラリモジュールを追加する方法を選択した。
環境
OS | Windows 8.1(x64) |
JDK | 1.8.0(64bit) |
Android Studio | 1.2.2 |
Android Gradle plugin | 1.2.3 |
Gradle | 2.2.1 |
新規プロジェクトの作成
まずは普通にプロジェクトを作成する。ここではプロジェクト名を「MyLibApp」とした。
ここまでは普通にアプリケーション用のプロジェクト作成。Android Studioを使いたてでよくわからなかってなかったんだけども、実はこの時点でプロジェクト内にアプリケーションモジュール「app」がいるのである。
新規モジュールの追加
作成したプロジェクトに対して新規モジュールを追加する。
モジュールのタイプを「Android Library」で選択する。
ライブラリ名とモジュール名とかを決める。ここではモジュール名を「mylibrary」とした。
プロジェクト作成の時と同様に追加するActivityのタイプを選択する画面がでるので、「Add No Activity」を選択*1。
プロジェクト内に「mylibrary」というモジュールが増えている。
ライブラリを作って使ってみる
さっそくライブラリモジュールをアプリケーションモジュールから利用するサンプルを書いてみる。
ライブラリモジュール
まずはライブラリ側。
ソース
サンプルなのでライブラリにする意味もないようなPOJOクラス。でもそれだけだとつまらないので無駄に外部ライブラリも使ってみた。ついでにデバッグビルドのときだけ有効なコードも入れる、ってデバッグログだけど。
- MyLibApp/mylibrary/src/main/java/osa030/hatenablog/com/mylibrary/Hoge.java
package osa030.hatenablog.com.mylibrary; import android.util.Log; import com.google.gson.Gson; public class Hoge { private int id; private String name; public Hoge(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Hoge{" + "id=" + id + ", name='" + name + '\'' + '}'; } // DEBUG log private static void log( String fmt, Object ... args ){ if( BuildConfig.DEBUG ){ Log.d("OSA", String.format(fmt, args)); } } // Object -> JSON String public String encode(){ Gson gson = new Gson(); String json = gson.toJson(this); Hoge.log("encode Object[%s] -> JSON[%s]", this.toString(), json); return json; } // JSON String -> Hoge Object public static Hoge decode( String json ){ Gson gson = new Gson(); Hoge obj = gson.fromJson(json, Hoge.class); Hoge.log("decode JSON[%s] -> Object[%s]", json, obj.toString()); return obj; } }
buid.gradle
モジュール作成時に自動生成されたファイルにgsonライブラリを使う設定を追加
google-gson - A Java library to convert JSON to Java objects and vice-versa - Google Project Hosting
- MyLibApp/mylibrary/build.gradle
apply plugin: 'com.android.library' android { publishNonDefault true compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.1.1' compile 'com.google.code.gson:gson:2.2.4' }
アプリケーションモジュール
続いてアプリケーション側。
ソース
アクティビティの生成時にライブラリ側のクラスを呼んでみただけ。
- MyLibApp/app/src/main/java/osa030/hatenablog/com/mylibapp/MainActivity.java
// 抜粋 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Hoge hoge = new Hoge(1, "osa"); String json = hoge.encode(); Hoge hoge2 = Hoge.decode(json); Log.i("OSA", String.format("JSON:[%s]", json)); Log.i("OSA", String.format("Hoge:[%s]", hoge2)); }
buid.gradle
モジュール作成時に自動生成されたファイルにライブラリモジュールを参照するように追加するだけ。
- MyLibApp/app/build.gradle
apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "osa030.hatenablog.com.mylibapp2" minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.1.1' compile project(':mylibrary') }
実行してみる
ビルドして実行だ
06-12 05:32:10.226 1375-1375/osa030.hatenablog.com.mylibapp2 I/OSA﹕ JSON:[{"name":"osa","id":1}] 06-12 05:32:10.226 1375-1375/osa030.hatenablog.com.mylibapp2 I/OSA﹕ Hoge:[Hoge{id=1, name='osa'}]
で、デバッグログがでません。
$ ls mylibrary/build/outputs/aar/ mylibrary-release.aar
ライブラリのaarファイルがリリースしか作られてない。それはアッカーン。
修正してみる
build.gradleをアプリケーションモジュールのビルドタイプで連動するようにしないとだめらしい。
ライブラリモジュール
buid.gradle
- MyLibApp/mylibrary/build.gradle
--- build.gradle.org Fri Jun 12 18:35:40 2015 +++ build.gradle Fri Jun 12 18:35:18 2015 @@ -1,6 +1,7 @@ apply plugin: 'com.android.library' android { + publishNonDefault true compileSdkVersion 22 buildToolsVersion "22.0.1"
アプリケーションモジュール
buid.gradle
- MyLibApp/app/build.gradle
--- build.gradle.org Fri Jun 12 18:38:37 2015 +++ build.gradle Fri Jun 12 18:38:12 2015 @@ -22,5 +22,6 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.1.1' - compile project(':mylibrary') + releaseCompile project(path: ':mylibrary', configuration: 'release') + debugCompile project(path: ':mylibrary', configuration: 'debug') }
また実行してみる
「Sync Project with Gradle files」してからビルドし直して実行だ
06-12 05:40:32.958 1453-1453/osa030.hatenablog.com.mylibapp2 D/OSA﹕ encode Object[Hoge{id=1, name='osa'}] -> JSON[{"name":"osa","id":1}] 06-12 05:40:32.962 1453-1453/osa030.hatenablog.com.mylibapp2 D/OSA﹕ decode JSON[{"name":"osa","id":1}] -> Object[Hoge{id=1, name='osa'}] 06-12 05:40:32.962 1453-1453/osa030.hatenablog.com.mylibapp2 I/OSA﹕ JSON:[{"name":"osa","id":1}] 06-12 05:40:32.962 1453-1453/osa030.hatenablog.com.mylibapp2 I/OSA﹕ Hoge:[Hoge{id=1, name='osa'}]
でました。
$ ls mylibrary/build/outputs/aar/
mylibrary-debug.aar
mylibrary-release.aar
今度はリリース/デバッグの両方のaarファイルが生成されるようになった。これをアプリ側のビルドタイプに応じて使い分けてるっていう感じですな。今回は面倒くさいので試してないけど、アプリケーションモジュールをリリースでビルドすればライブラリのデバッグログは出力されない、はず。
Android Studioではじめる 簡単Androidアプリ開発
- 作者: 有山圭二
- 出版社/メーカー: 技術評論社
- 発売日: 2014/11/21
- メディア: 大型本
- この商品を含むブログを見る
*1:作成するライブラリによるのかもしれないけど、画面無しのライブラリならこれを選択すれば問題ないはず