依存しているライブラリが依存しているjava versionを知る方法

1,113 views
Skip to first unread message

Shigeo Mutoh

unread,
Dec 5, 2016, 4:06:39 AM12/5/16
to android-g...@googlegroups.com
武藤です。

教えてください。

割と単純な疑問なのですが、ある.jarが依存するjava version(1.7 or 1.8とか)
はどうやって調べたらよいのでしょう?

以下のようにプロジェクト内のどれかのライブラリがjava8依存している
らしいのですが、どのライブラリが該当するのかを突き止めたいと
思っています。

Error:Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been compiled using Java 8 or above.
If you are using the 'java' gradle plugin in a library submodule add
targetCompatibility = '1.7'
sourceCompatibility = '1.7'
to that submodule's build.gradle file.


ちなみに、プロジェクトをjava8対応に、jackをenableにいったんはしました。
そうすればビルド、実行はできます。

しかし以下のissumeに当たった模様で困ってます。
Issue 203168: Compiling with Jack takes very long time
https://code.google.com/p/android/issues/detail?id=203168

このissueの中で述べられているとおり、jvmにメモリをたっぷり
8Gbyteとか差し上げれば1分ぐらいには短縮できますが、根本的に
java1.7で行くか覚悟を決めて1.8で行くか、選択したいです。

ASは2.2.2です。

よろしくお願いします。


Shigeo Mutoh

unread,
Dec 5, 2016, 4:36:34 AM12/5/16
to android-g...@googlegroups.com
武藤です。

すみません、自己解決しそうです。
$ find . -name '*.class' |xargs -IXX javap -v XX |grep major
major version: 51
major version: 51
major version: 51
...

上記をもう少し小マシに改良して.jar対応にすれば、version52を
どこのどいつが握ってるか調べれば解決しそうです。
.classを調べればよいという発想にいたりませんでした。

お騒がせしました。

Shigeo Mutoh

unread,
Dec 5, 2016, 7:21:55 AM12/5/16
to android-g...@googlegroups.com
武藤です。

一応解決したので報告します。

片っ端から.classと.jarの中を調べてversion 52を探すshellを
ぶっ放したところ、なんということでしょう、自分のsub module
が作った.classがヒットしました。

そのmoduleはpure javaなので、buid.gradleはこうでした。
apply plugin: 'java'

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}

なぜか、このままだとjava1.8でbuildされることが原因でした。
これは超意外というか、勘弁してくれって感じです。

仕方ないので
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
を追加して事なきを得ることができました。

jack使用時は3分ぐらい(8Gあげれば1分)かかりましたが、圧倒的に速く
なって20秒ぐらいでbuildできるようになりました。

使用したshellは添付しておきました。

では。
checkClassVer.sh

Shigeo Mutoh

unread,
Dec 6, 2016, 12:17:27 AM12/6/16
to android-g...@googlegroups.com
武藤です。

中途半端なshellを上げていました。上げなおします。

ちなみに、これをプロジェクトのディレクトリで実行すると、自分の場合
総クラス数は約2万1千個、2時間以上かかりました。
android sdkもろもろ、inner classも何もかもチェックしてしまっているためです。
はい、非効率です。まあ、気にしない。

なぜか使いたくもないjava1.8に引っ張られてしまって困っている方は
時間はかかりますが原因は分かると思います。

では。

checkClassVer.sh

noxi

unread,
Dec 6, 2016, 4:17:41 AM12/6/16
to android-g...@googlegroups.com
noxiです。

> なぜか、このままだとjava1.8でbuildされることが原因でした。
> これは超意外というか、勘弁してくれって感じです。

https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_convention_properties

sourceCompatibility
Default value: version of the current JVM in use

だそうですよ?
pure javaで1.8が困るのはAndroid特有の事情なので
きちんと指定しましょう、、ということですね。


今時Java8使ってないプロダクトなんて、、、


2016年12月6日 14:17 Shigeo Mutoh <tmh...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-group-j...@googlegroups.com にメールを送信してください。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> https://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。

Shigeo Mutoh

unread,
Dec 6, 2016, 5:04:04 AM12/6/16
to android-g...@googlegroups.com
武藤です。

On 16/12/6 18:17, noxi wrote:
> sourceCompatibility
> Default value: version of the current JVM in use

まあそうですよね。そうするしかないでしょうから意外でも
何でもなかったです。

> 今時Java8使ってないプロダクトなんて、、、

うお、皆さんもうJava8は当たり前なんでしょうか?
jack激おそ問題ってごく少数なんですね。

実は今回のjack激おそ問題にぶつかる前は、javaのversionなどあまり意識
したことなかったのです。
ここを読んで、あーそうなのーって感じです。
https://developer.android.com/guide/platform/j8-jack.html

たまには勉強しないといかんー。

では。
Reply all
Reply to author
Forward
0 new messages