Unityメソッドの数が64Kの制限を超えています


20

Unityで64kメソッドに関連する問題が発生したため、プロジェクトをビルドできません。メソッド制限が64kメソッドカウントの制限を超えていることを示しています。だから、この問題を解決するためにここの誰かが私を助けることができますか?

回答:


22

この回答は、Androidの公式ドキュメント(特に引用部分)に大きく依存しています。


UnityプロジェクトのMultidexサポートのセットアップ方法

Multidexとは:

Androidアプリケーション(APK)ファイルには、アプリの実行に使用されるコンパイル済みコードを含むDalvik実行可能(DEX)ファイル形式の実行可能バイトコードファイルが含まれます。Dalvik Executable仕様では、Androidフレームワークメソッド、ライブラリメソッド、独自のコード内のメソッドなど、単一のDEXファイル内で参照できるメソッドの総数を65,536に制限しています。この制限を超えるには、アプリのビルドプロセスを構成して、複数dex構成と呼ばれる複数のDEXファイルを生成する必要があります。

Multidexを使用する場合:

単一のDEXファイル内で参照できるメソッドの総数が65,536を超えた場合-Androidフレームワークメソッド、ライブラリメソッド、独自のコードのメソッドなど。

64Kの制限を回避する

64K以上のメソッド参照を使用できるようにアプリを構成する前に、アプリコードまたは含まれているライブラリで定義されたメソッドを含め、アプリコードによって呼び出される参照の総数を減らす手順を実行する必要があります。次の戦略は、DEX参照制限​​に達するのを防ぐのに役立ちます。

アプリの直接および推移的な依存関係を確認する確認します-アプリに追加するコードの量を上回る方法で、アプリに含める大きなライブラリ依存関係が使用されるようにします。一般的なアンチパターンは、いくつかのユーティリティメソッドが有用だったため、非常に大きなライブラリを含めることです。多くの場合、アプリコードの依存関係を減らすことで、DEX参照の制限を回避できます。

ProGuardを使用して未使用のコードを削除する - コードの縮小有効にして、リリースビルドでProGuardを実行します。縮小を有効にすると、APKで未使用のコードが出荷されなくなります。

これらの公式のヒントは別として、Unityプロジェクトをビルドするときは、次の手順に従うとさらに役立ちます。

  1. Unity EditorからAndroidプロジェクトをビルドします。 セット1

  2. Android StudioでAndroidプロジェクトをインポートします。 ステップ2

  3. マルチdex構成を使用するようにアプリプロジェクトを設定するには、次の変更を行う必要があります。

    minSdkVersionが21以上に設定されている場合、次に示すように、モジュールレベルのbuild.gradleファイルで設定multiDexEnabledするだけtrueです。

    android {
    defaultConfig {
            ...
            minSdkVersion 21 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }

    ただし、 minSdkVersionが20以下に設定されているは、次のようにmultidexサポートライブラリを使用する必要があります。

    3.1。次に示すように、モジュールレベルのbuild.gradleファイルを変更してmultidexを有効にし、multidexライブラリを依存関係として追加します。

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }

    3.2。Applicationクラスをオーバーライドするかどうかに応じて、次のいずれかを実行します。

    • Applicationクラスをオーバーライドしない場合は、マニフェストファイルを編集して、次のようにタグに設定android:name<application>ます。
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="android.support.multidex.MultiDexApplication" >
            ...
        </application>
    </manifest>
    • Applicationクラスをオーバーライドする場合は、MultiDexApplication(可能な場合)を拡張するように次のように変更します。
    public class MyApplication extends MultiDexApplication { ... }
    • または、Applicationクラスをオーバーライドしてもベースクラスを変更できない場合は、代わりにattachBaseContext()メソッドをオーバーライドし、MultiDex.install(this)を呼び出してmultidexを有効にすることができます。
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. 他のプラグインマニフェストのエラーを確認し、プロジェクトをクリーンアップし、syscを再度実行します。

  5. プロジェクトに依存関係の問題がある場合は、Androidターミナルでこのコマンドを実行します

    % Gradle clean App."App name"
  6. Application Gradleの依存関係の下にこれらの依存関係をコピーします。

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. メインプロジェクトGradleにsigningConfigを追加します。

    ステップ8

    または、手動で署名モードをデバッグモードに設定し、[ファイル]-> [プロジェクト構造]-> [モジュール]でプロジェクトをクリックし、[ビルドタイプ]で[デバッグ]-> [署名構成の選択]-> [デバッグ]

    ここに画像の説明を入力してください

  8. Gradleを同期して、プロジェクトをビルドします。


1
このエラーにつながったプロジェクトはどれくらいの大きさですか?
-Evorlor

1
実際、Google AdMobメディエーションを使用しているため、6〜7個の広告SDKを追加するために使用されるため、最終的なプロジェクトメソッド数は約76kでした。
ラケシュ

0

ユニティを通じて直接マルチデックス対応のゲームを作成するのに役立つこのリンクを使用することをお勧めします。

https://medium.com/@abhpatidar/solving-unity-dex-issue-538e134c8809

注:これにより、Unity自体でMultidexのみが有効になります(Multidexの問題を修正する必要があります)。gradleに関連する問題は修正されません。


3
これは現在、リンクのみの回答です。リンクは質問に回答ますが、回答回答しません。リンクされたコンテンツのコアをここに含めることもできます(リンク自体は悪くありません。単に悪いリンクだけが存在します)。
ベイランクール

同意しますが、書かれている手順が多すぎます。そのため、記事を作成してリンクを共有する必要がありました。私はその方法を好むので、複数の真実を作成するのではなく、真実のソースを1つだけ持っています。
アビシェークパティダー

理解することですが、Stack Exchangeサイトの仕組みではありません:リンクのみの回答は削除されます。¤必要に応じて、この回答を質問のコメントに変換できます。今後のユーザーに参照を表示しておくと、リンクのみの回答はありません。(¤リンクのみの回答の主な問題は、サイトを停止した場合(またはISPがすべてのデータで破産した場合)、この回答はまったく役に立たないことです。これが回答が質問に答える理由です。)
Vaillancourt

理にかなっています。回答を完全な指示に変換します。
アビシェークパティダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.