Android Studioでローカルのaarファイルを使ったプロジェクトを作成する
ローカルにあるaarファイルを利用するプロジェクトを作ってみた。
前回、無理やりライブラリモジュールだけのプロジェクトを作ってaarファイルを生成したんだけど、実際にはそんなプロジェクトはデバッグが面倒なので、やっぱりひとつのプロジェクト内にアプリケーションモジュールとライブラリモジュールを作るのが一般的なんだろうなと思える。
https://osa030.hatenablog.com/entry/2015/06/16/180614osa030.hatenablog.com
でも、例えばライブラリが他社製だったりすると、ソースファイル自体提供してもらえるとも限らないので、aarファイルだけもらってAPI仕様書と睨めっこしながら使うこともあるんじゃないかなと。
ということで、前回生成したaarファイルを利用するプロジェクトを作ってみる。
で、調べてみると以下の2通りのやり方がある模様。
- 別モジュールとしてaarファイルをインポートする
- モジュール内のフォルダにあるaarファイルを参照する。
最初の方法は以下にあるので今回は省略。
モジュール内の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
これを参考に、
こんな感じにビルドタイプに応じて切り替えるように追加。
- 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)); }
実行してみる
ビルドして実行だ
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対応
- 作者: 寺園聖文
- 出版社/メーカー: 翔泳社
- 発売日: 2015/07/14
- メディア: 大型本
- この商品を含むブログを見る