7

この質問と同様に、次のエラーを受け取りました。

[INFO] --- android-maven-plugin:3.3.0:dex (default-dex) @ betodef-android ---
[INFO] /usr/lib/jvm/java-6-sun-1.6.0.32/jre/bin/java [-Xmx1024M, {snip}
[INFO] 
[INFO] UNEXPECTED TOP-LEVEL ERROR:
[INFO] java.lang.OutOfMemoryError: GC overhead limit exceeded

これは、 fastutilを含むいくつかの依存関係をAndroid プロジェクトに追加した後に発生しました。ただし、使用可能なメモリを増やしてdexも問題は解決しません。

4

1 に答える 1

9

問題はdexフォーマットの制限、具体的はメソッド参照数の 65536 制限にあります

問題を診断するには、メモリをより大きな量に増やします (デバッグ/詳細出力を有効にしても、不思議なことに役に立ちません)。私の場合、次をandroid-maven-plugin構成に追加しました。

<dex>
    <jvmArguments>
        <jvmArgument>-Xmx4096M</jvmArgument>
    </jvmArguments>
</dex>

十分な大きさのヒープ サイズを選択すると、メッセージが次のように変わります。

[INFO] trouble writing output: Too many methods: 172296; max is 65536. By package:
[INFO]     20 android.app
[INFO]     18 android.content
[INFO]      1 android.content.pm
[INFO]      7 android.content.res
[INFO]      7 android.hardware
[INFO]     38 android.media
[INFO]     20 android.opengl
[INFO]     11 android.os
[INFO]      1 android.text.method
[INFO]      8 android.util
[INFO]     38 android.view
[INFO]      2 android.view.inputmethod
[INFO]     21 android.widget
...
[INFO]      3 com.google.common.annotations
[INFO]    746 com.google.common.base
[INFO]      9 com.google.common.base.internal
[INFO]    833 com.google.common.cache
[INFO]   8478 com.google.common.collect
[INFO]     50 com.google.common.eventbus
[INFO]    385 com.google.common.hash
[INFO]    597 com.google.common.io
[INFO]     92 com.google.common.math
[INFO]    134 com.google.common.net
[INFO]    521 com.google.common.primitives
[INFO]    404 com.google.common.reflect
[INFO]    954 com.google.common.util.concurrent
[INFO]     16 default
[INFO]    227 it.unimi.dsi.fastutil
[INFO]   1370 it.unimi.dsi.fastutil.booleans
[INFO]  17249 it.unimi.dsi.fastutil.bytes
[INFO]  17249 it.unimi.dsi.fastutil.chars
[INFO]  17279 it.unimi.dsi.fastutil.doubles
[INFO]  17263 it.unimi.dsi.fastutil.floats
[INFO]  17309 it.unimi.dsi.fastutil.ints
[INFO]    628 it.unimi.dsi.fastutil.io
[INFO]  17315 it.unimi.dsi.fastutil.longs
[INFO]  26514 it.unimi.dsi.fastutil.objects
[INFO]  17257 it.unimi.dsi.fastutil.shorts
[INFO]      2 java.awt
[INFO]      5 java.awt.datatransfer
[INFO]    206 java.io
[INFO]    346 java.lang
[INFO]     10 java.lang.ref
[INFO]     71 java.lang.reflect
[INFO]     27 java.math
[INFO]     26 java.net
[INFO]    108 java.nio
[INFO]      6 java.nio.channels
[INFO]      2 java.nio.charset
[INFO]     13 java.security
[INFO]      2 java.text
[INFO]    382 java.util
[INFO]    128 java.util.concurrent
[INFO]     33 java.util.concurrent.atomic
[INFO]     40 java.util.concurrent.locks
[INFO]      6 java.util.jar
[INFO]      6 java.util.logging
[INFO]     10 java.util.regex
[INFO]     20 java.util.zip
[INFO]     26 javax.microedition.khronos.egl
[INFO]    188 javax.microedition.khronos.opengles
[INFO]      7 sun.misc

ご覧のとおり、 fastutilクラスには大量の参照があります。

この問題には、次の2 つの解決策があります。

  1. 問題のある依存関係に代わるものを使用してください (duh)。
  2. Proguard (一般的な AndroidMaven 固有)などのオプティマイザーを使用します。
于 2013-01-05T16:36:42.523 に答える