初老のボケ防止日記

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

Android Studioでローカルのaarファイルを使ったプロジェクトを作成する

ローカルにあるaarファイルを利用するプロジェクトを作ってみた。

前回、無理やりライブラリモジュールだけのプロジェクトを作ってaarファイルを生成したんだけど、実際にはそんなプロジェクトはデバッグが面倒なので、やっぱりひとつのプロジェクト内にアプリケーションモジュールとライブラリモジュールを作るのが一般的なんだろうなと思える。

https://osa030.hatenablog.com/entry/2015/06/16/180614osa030.hatenablog.com

でも、例えばライブラリが他社製だったりすると、ソースファイル自体提供してもらえるとも限らないので、aarファイルだけもらってAPI仕様書と睨めっこしながら使うこともあるんじゃないかなと。
ということで、前回生成したaarファイルを利用するプロジェクトを作ってみる。

で、調べてみると以下の2通りのやり方がある模様。

  • 別モジュールとしてaarファイルをインポートする
  • モジュール内のフォルダにあるaarファイルを参照する。

最初の方法は以下にあるので今回は省略。

qiita.com

モジュール内のlibフォルダにaarファイルを配置して試してみることにする。

環境

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

プロジェクトを作る

新規プロジェクトの作成

アプリケーション用のプロジェクトを作るだけ。今回はプロジェクト名を「MyApp」として「Blank Activity」を選択。

aarファイルをプロジェクト内に配置

「app/libs」に入れた

$ ls MyApp/app/libs/
app-debug.aar
app-release.aar

build.gradle

これを参考に、

stackoverflow.com

こんな感じにビルドタイプに応じて切り替えるように追加。

  • MyApp/app/build.gradle
--- build.gradle.org    Mon Jun 15 18:09:08 2015           
+++ build.gradle        Mon Jun 15 18:10:26 2015           
@@ -22,4 +22,12 @@                                         
 dependencies {                                            
     compile fileTree(dir: 'libs', include: ['*.jar'])     
     compile 'com.android.support:appcompat-v7:22.1.1'     
+    releaseCompile(name:'app-release', ext:'aar')         
+    debugCompile(name:'app-debug', ext:'aar')             
 }                                                         
+repositories{                                             
+    flatDir{                                              
+        dirs 'libs'                                       
+    }                                                     
+}                                                         
+                                                          
ソース

最初と同じようにアクティビティの生成時にライブラリ側のクラスを呼んでみただけ。

  • MyApp/app/src/main/java/osa030/hatenablog/com/myapp/MainActivity.java
// 抜粋
import osa030.hatenablog.com.mylib.Hoge;

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));
    }

実行してみる

ビルドして実行だ

f:id:osa030:20150615183952j:plain

orz..

06-15 05:19:16.977    1424-1424/osa030.hatenablog.com.myapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NoClassDefFoundError: com.google.gson.Gson
            at osa030.hatenablog.com.mylib.Hoge.encode(Hoge.java:49)
            at osa030.hatenablog.com.myapp.MainActivity.onCreate(MainActivity.java:20)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

あー、ライブラリで使っているgsonがないということか。

修正してみる

gsonを追加。

  • MyApp/app/build.gradle
--- build.gradle.org    Mon Jun 15 18:22:05 2015
+++ build.gradle        Mon Jun 15 18:22:38 2015
@@ -22,6 +22,7 @@
 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'
     releaseCompile(name:'app-release', ext:'aar')
     debugCompile(name:'app-debug', ext:'aar')
 }

実行してみる

ビルドして実行だ

06-15 05:24:13.005    1557-1557/osa030.hatenablog.com.myapp D/OSA﹕ encode Object[Hoge{id=1, name='osa'}] -> JSON[{"name":"osa","id":1}]
06-15 05:24:13.009    1557-1557/osa030.hatenablog.com.myapp D/OSA﹕ decode JSON[{"name":"osa","id":1}] -> Object[Hoge{id=1, name='osa'}]
06-15 05:24:13.009    1557-1557/osa030.hatenablog.com.myapp I/OSA﹕ JSON:[{"name":"osa","id":1}]
06-15 05:24:13.009    1557-1557/osa030.hatenablog.com.myapp I/OSA﹕ Hoge:[Hoge{id=1, name='osa'}]

問題ナーシッング

ビルドタイプをリリースにすれば「app-release.aar」を使うのでライブラリのデバ
ッグ出力はでなくなる。はず。かもしれない。

ムダ知識

因みに、ローカルのaarの読込は以下の書式でもいける。

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'
    releaseCompile 'osa030.hatenablog.com.mylib:app:release@aar'
    debugCompile   'osa030.hatenablog.com.mylib:app:debug@aar'
}
repositories{
    flatDir{
        dirs 'libs'
    }
}

この書式はどうもmavenのスタイルっぽい(よく知らない)。普通はこの記述でリポジトリを参照すると、自動的に依存関係も解決してくれるのですごく助かる。ところがどっこいローカルのaarの場合は、(当然ローカルなので)依存解決を自動でやってくれない。なので、混乱しないように最初の方法の記述をしたほうがいいんじゃないかなとか思った次第。

ほんきで学ぶAndroidアプリ開発入門 Android Studio、Android SDK 5対応

ほんきで学ぶAndroidアプリ開発入門 Android Studio、Android SDK 5対応