web-dev-qa-db-ja.com

SDK 21の下のNoClassDefFoundError

アプリで厄介なバグが発生しました。

Nexus 5/7では、Android 5.0.1/5.0.2を実行すると、すべて正常に動作します。ただし、以前のバージョン(テスト済み4.4 .4および4.3)次のエラーが表示されます。

03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'com.default.package.application.model.Appcomponent', referenced from method com.default.package.application.controller.DatabaseHandler.getScreenComponents
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'Android.support.v7.app.ActionBarActivityDelegate$1', referenced from method Android.support.v7.app.ActionBarActivityDelegate.<init>
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'Android.support.v7.app.ActionBarActivityDelegateHC', referenced from method Android.support.v7.app.ActionBarActivityDelegate.createDelegate
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'Android.support.v7.app.ActionBarActivityDelegateBase', referenced from method Android.support.v7.app.ActionBarActivityDelegate.createDelegate
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'Android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl', referenced from method Android.support.v7.app.ActionBarActivityDelegate.getDrawerToggleDelegate
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'Android.support.v7.internal.view.SupportMenuInflater', referenced from method Android.support.v7.app.ActionBarActivityDelegate.getMenuInflater
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'Android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl', referenced from method Android.support.v7.app.ActionBarActivityDelegate.getV7DrawerToggleDelegate
03-13 13:49:41.150  21714-21714/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.default.package, PID: 21714
    Java.lang.NoClassDefFoundError: Android.support.v7.app.ActionBarActivityDelegateHC

Support.v7ライブラリをjarとして追加しようとしましたが、違いはありません。しかし、Lollipopデバイスで動作するため、これはとにかく意味がありません。

Dalvik/Artの変更に関する問題があるのでしょうか?または、かなり大きなアプリなのでcom.Android.support:multidex:1.0.0を使用しなければならなかったという事実かもしれません。

更新:いくつかの依存関係を削除して、65kメソッドの制限内に収めようとしました。その後、アプリは4.4.4および4.3デバイスで実行されました。 multidexサポートを有効にするために私がしたことはすべて設定

multiDexEnabled true

defaultConfigセクションで追加

compile 'com.Android.support:multidex:1.0.0'

私のbuild.gradleの依存関係セクションの下に。

これが古いAndroid=バージョンでこれらの問題を引き起こす理由は?

23
user2700475

これをアプリケーションクラスに追加することで問題を解決しました。

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

Android 5.より前のバージョンでは必要なようです。

43
user2700475

これが機能する方法は3つあります。

  1. @FireZenkが指摘したように、このクラスをAndroidManifest.xmlでアプリケーションとして宣言できます。
<application Android:name="Android.support.multidex.MultiDexApplication">

そして実際には、defaultConfig、ProductFlavor、またはBuildTypetheでmultiDexEnabledをtrueに指定すると、Android gradeプラグインバージョン0.14.0およびビルドツールバージョン21.1.0で、com.Androidへの依存関係が自動的に含まれます。 .support:multidex:1.0.0。androidDependencieタスクで確認するか、。/ gradlew -q Android:dependenciesコマンドを実行できます(Android:is my Android module)。明示的に追加する必要はありません

compile 'com.Android.support:multidex:1.0.0'

アプリでApplicationクラスを拡張した場合:

  1. 次のように、アプリケーションがMultiDexApplicationクラスを拡張することを定義します。
public class MyApplication extends MultiDexApplication {
    ...
}

または@ user2700475のような投稿

  1. アプリケーションでattachBaseContextをオーバーライドします。
public class MyApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);}
}

以前の回答の助けを借りて、この問題の解決策を見つけることができました。これをすべてまとめたいだけです。

12
RenatoIvancic

Applicationクラスを持っていない/使用していない場合は、これを置くことができます:

Android:name="Android.support.multidex.MultiDexApplication"

AndroidManifest.xmlのタグに

Applicationクラスを既に実装している場合は、@ user2700475 + @sirvon応答が最適な選択です。

また、明らかに、Gradle依存関係を追加する必要があります。

compile 'com.Android.support:multidex:1.0.0'

65kメソッドの問題に関する詳細情報: https://developer.Android.com/tools/building/multidex.html

5
FireZenk