Android

JDK7でAndroid開発、していいの?ダメなの?

More than 3 years have passed since last update.

JDK7でAndroid開発できるのかどうかについて、調べました。

(2014-05-14追記)

2014年3月にリリースされた SDK Tools r22.6 / ADT Plugin 22.6.0 以降、
JDK7 の使用が公式にサポートされました。

ADT Plugin および SDK Tools のページにある 22.6.0 のリリースノートより

Added support for Java 7 language features like multi-catch, try-with-resources, and the diamond operator. These features require version 19 or higher of the Build Tools. Try-with-resources requires minSdkVersion 19; the rest of the new language features require minSdkVersion 8 or higher.

To use the new language features after installing ADT 22.6.0, ensure that you run Eclipse on JDK 7 and change your application project settings to use JDK 7.

try-with-resources 構文は、 minSdkVersion >= 19 で利用できます。

それ以外のマルチキャッチやダイアモンドオペレータ等の各種機能は、
minSdkVersion >= 8 で利用できます。

Eclipse ADT については Eclipse 自体を JDK7 以上で起動し、
プロジェクト設定でコンパイラレベルを変更すれば利用できるようになります。

try-with-resources の要求 API レベルが高いのが残念ですが、
マルチキャッチやダイアモンドオペレータ、 String-switch だけでも
いくらか楽ができそうですね。

背景

手元のJDK6がu20台とかなり低かったので更新しようかと思ったら
OracleJDKのprevious releasesを落とすにはアカウントが必要になったんですよね。
めんどくさい ということでJDK7でやっちゃダメなのか調べてみました。

調査

まず、関連しそうなキーワードでググっているなかで参考にさせていただいた記事がこちら。

JDK7でAndroidアプリをリリースビルドする方法

要点だけまとめると

  • APKの署名にはsigalg="SHA1withRSA", digestalg="SHA1"を使う
  • APKリリースビルドの署名にはAntのsignjarタスクが使われてた (今は違います)
  • signjarはJDKのjarsignerを使っている
  • Ant1.8.2以前のsignjarは、ダイジェストアルゴリズム指定する方法がなかった
  • JDK6→7で、jarsignerのアルゴリズムのデフォが変わってしまった
  • 死んだ

ただしこれは2012年5月の情報。今はどうなのか?

手元の環境(Android SDK Tools 22.2.1)のtools/ant/build.xmlを見ると、
APKの署名がsignapkタスクに変わってました。

SignApkTaskの中身を見てみると、SignedJarBuilderにkeystoreとAPKを渡してるだけ。
ソース

じゃあSignedJarBuilderの中身は何なのか?
ソース

ん?ちゃんと SHA1with(Algorithm) と SHA1 指定されてるんじゃない?
(writeEntryメソッドのあたりとか。)

実験

Win環境ですが、JDKを全てアンインストールし、JDK7u40のみ入れなおして試してみました。
実験環境は次のとおりです。

  • Windows7 HP 32bit
  • JDK7 u40
  • Ant 1.9.2
  • Android SDK Tools 22.2.1

確認

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

> java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode, sharing)

> javac -version
javac 1.7.0_40

> ant -version
Apache Ant(TM) version 1.9.2 compiled on July 8 2013

Android SDK Toolsについてはコマンド分からなかったので画像で。
SDK Tools version

作業ディレクトリの作成

cd %UserProfile%
mkdir buildtest
cd buildtest

実験用キーストアの生成

keytool -genkeypair -v -keyalg RSA -keysize 2048 -validity 10000 \
-keystore hoge.keystore -storepass hogestore \
-alias hoge -keypass hogekey \
-dname "CN=YourName, OU=SoftwareDevDept, O=HogeCompany, L=Shinjuku, S=Tokyo, C=JP"

実験用アプリプロジェクトの生成

android create project --name HogeApp --package com.example.hoge \
--activity MainActivity --target android-18 --path .\HogeApp

鍵情報をant.propertiesに追記
(※セキュリティ上、実際のアプリではパスワードは書かないのが普通です)

HogeApp/ant.properties
key.store=../hoge.keystore
key.store.password=hogestore
key.alias=hoge
key.alias.password=hogekey

アプリをリリースビルド

ant -f HogeApp\build.xml release
(中略)
BUILD SUCCESSFUL
Total time: 4 seconds

インスコしてみる

adb install HogeApp\bin\HogeApp-release.apk
1833 KB/s (37558 bytes in 0.020s)
        pkg: /data/local/tmp/HogeApp-release.apk
Success

いけた!!!

実機へインストールされていることと、起動してHelloWorldが表示されることを確認できました。

特に意味のない実機SS

まとめ

少なくとも今回試した環境では、JDK7でも実機インストール可能なリリース用APKがビルドできました。

動作も問題なさそうなので、 個人開発でやるぶんには問題無さそう ですが、
ビジネスで行う開発作業は公式の推奨環境であるJDK6でやるべき かと思います。

最後にもう一度、環境を記しておきます。

  • Windows7 HP 32bit
  • JDK7 u40
  • Ant 1.9.2
  • Android SDK Tools 22.2.1

以上。