AndroidStudioを使って.jarファイルを生成する方法を説明します。

話の要素としてはgradle(groovy)が80%くらいです。あとは簡単な説明です。

今回のサンプルはNinjaAdMax/SampleExportJarにあげてあります。

では進めていきます。

段取りとしては

  1. android-libraryのModuleの作成
  2. build.gradleの編集
  3. 出力
  4. build.gradleで新しく追加した内容の説明

で進めていきます。

1. android-libraryのModuleの作成

File > New Moduleでもなんでも良いので、Moduleの新規作成画面を開いてください。

以下のような画面が開けましたでしょうか。

OpenNewModuleScreenShot

そしたら上から2番目のAndroid Libraryを選択してNextをクリックしてください。

以下の画面へ遷移するかと思います。

OpenNewModuleScreenShot2

一つずつ説明します。

  • Application name

    好きな値を入力してください。公開する分には関係ありません。

  • Module name

    好きな値を入力してください。公開する分には関係ありません。

  • Package name

    公開する時のパッケージの名前を入力してください。

  • Minimum required SDK

    作成するライブラリの対応する最小のバージョンを選択してください。

  • Target SDK

    一番新しいバージョンでよろしいかと思います。

  • Compile with

    Target SDKと同じにするのが無難だと言われています。

  • Language Level

    Javaのバージョンのお話です。6.0で間違いないと思います。

  • Theme

    Noneを選択してください。無駄なLibraryをインストールされます。

  • Create activity

    jarにActivityは必要ないので必ずチェックを外してください。

  • Support Mode

    すべてチェックなしで大丈夫です。

編集できたら、Finishを押して、generateし終わるまで待機してください。

こんな感じにModule nameのフォルダアイコンが変わったら作業できます。

ViewProjectScreenShot

次はbuild.gradleを編集していきます。

2. build.gradleの編集

${Module name}/build.gradleを開いて以下のようにしてください。

うまく自分の環境に置き換えてください。

置き換えてほしい所は${}でかこんであります。

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
apply plugin: 'com.android.library'
android {
compileSdkVersion 20
buildToolsVersion "20.0.0"
defaultConfig {
applicationId ${自分のPackage name}
minSdkVersion 9
targetSdkVersion 20
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:20.0.0'
}
task clearJar(type: Delete) {
delete 'build/libs/' + "${出力される.jarの名前}" + '-' + "${バージョン}" + '.jar'
}
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
rename('classes.jar', "${出力される.jarの名前}" + '-' + "${バージョン}" + '.jar')
}
makeJar.dependsOn(clearJar, build)

注意してほしい点が一つあります。

task clearJar(type: Delete){}task makeJar(type: Copy){}の中にある"${出力される.jarの名前}" + '-' + "${バージョン}" + '.jar'の値は必ず一致するようにしてください。

例えばですけど、${Project root}/gradle.propertiesに定数を宣言しておいて、それを使うとかの方法の方が安全です。

gradle.properties
1
2
3
4
# Project-wide Gradle settings.
# 省略
JAR_ARTIFACT_ID=${出力される.jarの名前}
JAR_VERSION_NAME=${.jarのバージョン}

のように設定して

build.gradle
1
2
3
4
5
6
7
8
9
task clearJar(type: Delete) {
delete 'build/libs/' + JAR_ARTIFACT_ID + '-' + JAR_VERSION_NAME + '.jar'
}
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
rename('classes.jar', JAR_ARTIFACT_ID + '-' + JAR_VERSION_NAME + '.jar')
}

という風に書く事も出来ます。

こちらの方が安全かと思います。

で、srcやらに生成したいクラスなりを入れて問題なければ.jarを生成します。

3. jarファイルの出力

以下のコマンドを叩いてください。

1
$ ./gradlew ${Moduel name}:clean ${Module name}:assembleDebug ${Module name}:makeJar

そうすると${Project Root}/${Module name}/Releaseというディレクトリが出来て、その中にjarファイルがあると思います。

コイツをコピーして、適当に使い回してください。

以上で.jarファイルの生成は完了しました。

次はbuild.gradleで追記したソースについて調べた事を書きますので、興味ある人は読んでください。

4. build.gradleで新しく追加した内容の説明

build.gradle
1
2
3
4
5
6
7
8
9
10
task clearJar(type: Delete) {
delete 'build/libs/' + JAR_ARTIFACT_ID + '-' + JAR_VERSION_NAME + '.jar'
}
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
rename('classes.jar', JAR_ARTIFACT_ID + '-' + JAR_VERSION_NAME + '.jar')
}
makeJar.dependsOn(clearJar, build)

上記2つのtaskの解説をしたいと思います。

gradleのコマンドについては触れないのであしからず…。

文章で説明

いつもAndroidアプリをインストールするときにこんなコマンドを打つと思います。

1
$ ./gradlew uninstallDebug clean assembleDebug installDebug

これでbuildされた.apkファイルがデバイスにインストールされますよね。

それと同時に生成されているファイル群があるんですよ。

それがいかになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
SampleExportJar $ tree jar/build/intermediates/bundles/
jar/build/intermediates/bundles/
├── debug
│   ├── AndroidManifest.xml
│   ├── R.txt
│   ├── aidl
│   ├── assets
│   ├── classes.jar
│   └── res
│   ├── drawable-hdpi-v4
│   │   └── ic_launcher.png
│   ├── drawable-mdpi-v4
│   │   └── ic_launcher.png
│   ├── drawable-xhdpi-v4
│   │   └── ic_launcher.png
│   ├── drawable-xxhdpi-v4
│   │   └── ic_launcher.png
│   └── values
│   └── values.xml
└── release
├── AndroidManifest.xml
├── R.txt
├── aidl
├── assets
├── classes.jar
└── res
├── drawable-hdpi-v4
│   └── ic_launcher.png
├── drawable-mdpi-v4
│   └── ic_launcher.png
├── drawable-xhdpi-v4
│   └── ic_launcher.png
├── drawable-xxhdpi-v4
│   └── ic_launcher.png
└── values
└── values.xml
18 directories, 16 files

AndroidStudioには表示されませんが、${Project Root}/${Module name}/build/intermediates/bundlesというディレクトリが生成されます。

その中にbuildされたファイルが入っています。

なので、その中にあるclasses.jarをコピーして、名前を変えて、保存しちゃおうぜって順番で.jarを生成しています。(生成しているというよりはコピーしているのほうが正しい)

で、コピーして、名前かえてという部分を

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
task clearJar(type: Delete) {
delete 'build/libs/' + JAR_ARTIFACT_ID + '-' + JAR_VERSION_NAME + '.jar'
}
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
` rename('classes.jar', JAR_ARTIFACT_ID + '-' + JAR_VERSION_NAME + '.jar')`で`classes.jar`の名前を変更しています。
----
}
makeJar.dependsOn(clearJar, build)

がやっているということなのです。

メソッドの説明

すごくシンプルなメソッド名なので、なんとなくわかるかと思いますがちょろっと説明します。

task makeJar(type: Copy)

task makeJarCopyタスクですよって宣言です。

(type: Copy)の部分を色々変えることで、様々なメソッドを使えるようになります。

from

Copyタスクのメソッドです。

コピー元のファイル指定をします。

もし渡した引数がディレクトリパスの場合、そのディレクトリ以下が再起的にコピーされます。

from('build/intermediates/bundlens/release/')build/intermediates/bundlens/release/を指定しています。

into

Copyタスクのメソッドです。

コピー先ディレクトリの指定をします。

into('release/')release/以下にコピーするように指定しています。

include

Copyタスクのメソッドです。

コピーするファイルを選択することが出来ます。

include('classes.jar')classes.jarをコピーするように指定しています。

rename

Copyタスクのメソッドです。

ファイル名を変更します。

rename('classes.jar', JAR_ARTIFACT_ID + '-' + JAR_VERSION_NAME + '.jar')classes.jarの名前を変更しています。

終わりに

AdMaxSDKを作る際に.jarファイルを生成しなければならず、AndroidStudioで開発していたので、どうしてもAndroidStudioで出力したくて調べてみました。

AdMaxSDKの.jarファイルはこの方法で出力しています。

問題なく動いていますよね?

最後にサンプルプロジェクトをGitHubに上げたので、よかったら見てくださいませ。

NinjaAdMax/SampleExportJar

以上です。ありがとうございました。

参考

Create a jar libray with gradle using AAR info | Surviving w/ Android
How to export library to Jar in Android Studio? - Stack Overflow
第16章 ファイルを取り扱う

「Tech」のおすすめ記事