初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

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」とした。

f:id:osa030:20150610181050p:plain

ここまでは普通にアプリケーション用のプロジェクト作成。Android Studioを使いたてでよくわからなかってなかったんだけども、実はこの時点でプロジェクト内にアプリケーションモジュール「app」がいるのである。

新規モジュールの追加

作成したプロジェクトに対して新規モジュールを追加する。

f:id:osa030:20150610181102p:plain

モジュールのタイプを「Android Library」で選択する。

f:id:osa030:20150610181110p:plain

ライブラリ名とモジュール名とかを決める。ここではモジュール名を「mylibrary」とした。

f:id:osa030:20150610181117p:plain

プロジェクト作成の時と同様に追加するActivityのタイプを選択する画面がでるので、「Add No Activity」を選択*1

f:id:osa030:20150610181124p:plain

プロジェクト内に「mylibrary」というモジュールが増えている。

f:id:osa030:20150610181131p:plain

ライブラリを作って使ってみる

さっそくライブラリモジュールをアプリケーションモジュールから利用するサンプルを書いてみる。

ライブラリモジュール

まずはライブラリ側。

ソース

サンプルなのでライブラリにする意味もないような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をアプリケーションモジュールのビルドタイプで連動するようにしないとだめらしい。

stackoverflow.com

ライブラリモジュール

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アプリ開発

Android Studioではじめる 簡単Androidアプリ開発

*1:作成するライブラリによるのかもしれないけど、画面無しのライブラリならこれを選択すれば問題ないはず