web-dev-qa-db-ja.com

ClassNotFoundException:パス上のクラスが見つかりませんでした:DexPathList

プレイストアでアプリを更新してから問題が発生しました。この更新以降、例外がスローされますが、この例外に関連するものは何も変更していません。

スタックトレース:

Java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{de.opiatefuchs.onthejobtimerlight/de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity}: Java.lang.ClassNotFoundException: Didn't find class "de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity" on path: DexPathList[[Zip file "/data/app/de.opiatefuchs.onthejobtimerlight-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2236)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2387)
at Android.app.ActivityThread.access$800(ActivityThread.Java:151)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1303)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:135)
at Android.app.ActivityThread.main(ActivityThread.Java:5254)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)
Caused by: Java.lang.ClassNotFoundException: Didn't find class "de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity" on path: DexPathList[[Zip file "/data/app/de.opiatefuchs.onthejobtimerlight-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:56)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:511)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:469)
at Android.app.Instrumentation.newActivity(Instrumentation.Java:1066)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2226)
... 10 more
Suppressed: Java.lang.ClassNotFoundException: de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity
at Java.lang.Class.classForName(Native Method)
at Java.lang.BootClassLoader.findClass(ClassLoader.Java:781)
at Java.lang.BootClassLoader.loadClass(ClassLoader.Java:841)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:504)
... 13 more
Caused by: Java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

問題は、以前の私のアプリのバージョンは問題なく実行され、このアクティビティに関連するものは何も変更していないということです。このアクティビティとは関係のない新しい情報ダイアログを追加しました。このアプリは無料のライトバージョンです。プロバージョンでもまったく同じ変更を加えましたが、何もスローされません。これは期待どおりに機能します。 proとliteの唯一の違いは、LiteバージョンにAdmob(新しい方法)を統合し、proバージョンにGoogle Playライセンスを統合したことです。しかし、これは最初から統合しており、これに変更を加えていません。また、マニフェストに変更を加えていません。ここで多くの投稿を読みましたが、何も助けにはなりません。

Android 5.0以降のバージョンで発生するようです。この問題が引き起こす可能性のあるアイデアや、同じ経験を誰かが持っている人はいますか? 、変更なし)?

私はこの例外に関連する変更を加えていないと言ったように、この問題にとって重要ではないため、コードを投稿しませんでした。

この質問は重複としてマークされていますが、そうではありません。リンク付きのコメントは私の問題を解決しません。すべてのライブラリがチェックされ、正しい方法で統合されます。また、NDKは使用していません。

30
Opiatefuchs

更新

久しぶりに、それはプロガードと関係があるに違いないことが判明しました。エラーの原因を正確に言うことはできませんが、少し試してみたところ、気づきました(Eclipse IDEの場合)。

  • 署名するプロジェクトのすべてのタブを閉じる必要があります
  • 私はプロジェクトをきれいにしなければならず、きれいにした後、apkをエクスポートするだけです
  • マニフェストに小さな変更を加えて保存し、変更を元に戻す(および保存する)
  • 「YourClass」または「.YourClass」という名前のマニフェストにクラスがある場合、「com.yourpackage.yourClass」に変更します

それが私がやった4つのポイントであり、それはうまくいきました。これは疑わしいように見えますが、難読化には問題があると思います。これらのポイントを実行しなくても、apkをコンパイルしてEclipseからインストールするだけです。私にとって、この動作の明白な理由はありません。また、Eclipseからのみインストールする場合、パッケージ名は変更なしで機能します。これらのポイントが誰かを助けることを願っています。

26
Opiatefuchs

マニフェストパッケージ名がOKの場合、プロジェクトをクラッシュさせ、ファイルエクスプローラーでプロジェクトの名前を変更したが、プロジェクトをインポートした後、この問題が再び発生する場合、ここでの唯一の方法は

そのフォルダを削除。gradle

これは、エクスプローラーを使用してプロジェクトフォルダーにあります。古いプロジェクトの名前を含むアーティファクトファイルがあります。 Android Studioでプロジェクトを再度開くと、フォルダーは自動的に再作成されます。

16
CodeToLife

Gradleをcom.Android.tools.build:gradle:2.2.2からcom.Android.tools.build:gradle:2.2.0に変更したところ、問題は解決しました!

8
林志文

私にとっては、パッケージ名(ディレクトリ名)が変更されたときに起こりました。

「build」フォルダがプロジェクトビルドの中間ファイルを魔法のように保持していることに気付きました。 「app」フォルダーの下の「build」フォルダーを削除しました。ここで、gradleはすべてのファイルを新しいパッケージ名で再作成する必要がありました。今では正常に動作しています。

4
HBB20

複数のモジュールがある場合、multidexと複数のパッケージ名に関係があると思います。プロジェクトをクリーンアップし、すべてのビルド/フォルダーを削除します。

3
Ozzz

tl; dr:これは、AndroidManifest.xmlの相対宣言と絶対宣言の両方が混在していることが原因のようです。 <application .../><activity .../><receiver .../>、および<service .../>AndroidManifest.xmlで宣言するとき、最良の解決策は相対表記を使用することだと思います。

完全な説明:

TOO LONGでこの問題が発生したのは、<application .../>で絶対および相対<activity .../><receiver .../><service .../>、およびAndroidManifest.xml宣言を使用していたためです。これを修正するために私がしたことは次のとおりです。

AndroidManifest.xmlセクションで<manifest .../>セクションにpackage:プロパティが正しく指定されていることを確認してください。次のように、正確な絶対パスである必要があります。

<manifest
    package="com.my.absolute.package.path"
    xmlns:Android="http://schemas.Android.com/apk/res/Android">...</manifest>

<manifest .../>セクションで正しい絶対パスが指定されたので、<application .../>で定義されているすべての<activity .../><receiver .../><service .../>、およびAndroidManifest.xmlに相対パスを使用する必要があります。

例:

<application
    Android:name=".BaseApplication"
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">

    <activity
        Android:name=".activity.SomeActivity"
        Android:configChanges="orientation"
        Android:label="@string/app_name"
        Android:parentActivityName=".activity.ParentActivity"
        Android:screenOrientation="portrait"
        Android:theme="@style/AppTheme">
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value=".activity.ParentActivity"/>
    </activity>

    <activity
        Android:name=".activity.MyActivity"
        Android:configChanges="orientation"
        Android:label="@string/app_name"
        Android:parentActivityName=".activity.ParentActivity"
        Android:screenOrientation="portrait"
        Android:theme="@style/AppTheme"
        />

    <receiver
        Android:name=".receivers.MyReceiver"
        Android:enabled="true"
        Android:exported="false">
    </receiver>

    <service
        Android:name=".services.MyService"
        Android:enabled="true"
        Android:exported="false"
        />
</application>

もちろん、プロジェクトも必ず削除してください。

3
Sakiboy

署名されたapkファイルを生成するときに、依存ライブラリの問題(jarライブラリの複製)がある場合、このエラーが発生することがあります。ビルドパスを確認し、重複するライブラリを削除し、注文とエクスポートタブでチェックされていないライブラリがあるかどうかを確認してください。

1
Dhiren

その理由は、Android dexpathで特定のアクティビティを見つけることができません。

したがって、「マニフェストファイル」でアクティビティの完全なパスを提供する必要があります。

たとえば、アクティビティ名は「SplashActivity」であり、「com.packagename.package」にあります。そのため、そのアクティビティのパッケージ名全体を提供する必要があります。

com.packagename.package.SplashActivity
1
Kona Suresh

追加した

compile "com.Android.support:support-core-utils:25.3.1"
compile 'com.Android.support:support-v4:25.3.1'
0
SpyZip

私は同様の問題を抱えていました、私の解決策は次のとおりです:

  1. AndroidManifestのアプリケーション名をフルパスに変更します
  2. クリーンプロジェクト
  3. プロジェクトを再構築
  4. APKをビルドする
0
Jelil Adesina

ディレクトリ名を変更してインポートするだけでディレクトリ名を変更した後、同様のエラーが発生しました。もうインストールできません。 USBデバッグを再度有効にすることも、プロジェクトを再構築することもできません。

新しいプロジェクトを作成し、関連するすべてのコンテンツを新しいプロジェクトに手動でコピーすることで解決します。

0
林果皞