web-dev-qa-db-ja.com

Android 5.x ClassNotFoundExceptionは6.0以降で正常に動作します

プロジェクトのminSdkVersionを19から21に更新しました。これにより、5.0/5.1デバイスでアプリを実行できないという問題が発生しました。 ApplicationクラスでClassNotFoundExceptionが発生し続けます。完全なログ、Applicationクラス、gradleファイルは以下のとおりです。プロジェクトをminSdkVersion 19に戻すと、アプリは問題なく4.4以降で実行されます。

私が試したこと

  • クリーニング/再構築

  • ビルドツールバージョンの更新とダウングレード

  • プロジェクト全体のすべてのサポートライブラリのバージョン番号は同じです

  • すべてのマニフェストクラスを相対にしてから絶対にする

  • すべてのSDKおよびビルドツールを更新

ログ

04-27 14:37:07.152 6278-6278/? E/AndroidRuntime: FATAL EXCEPTION: main
     Process: com.package.testapp, PID: 6278
     Java.lang.RuntimeException: Unable to instantiate application com.package.TestApplication: Java.lang.ClassNotFoundException: Didn't find class "com.package.Application" on path: DexPathList[[Zip file "/data/app/com.package.testapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.package.testapp-1/lib/x86_64, /vendor/lib64, /system/lib64]]
         at Android.app.LoadedApk.makeApplication(LoadedApk.Java:563)
         at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4526)
         at Android.app.ActivityThread.access$1500(ActivityThread.Java:151)
         at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1364)
         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 "com.package.TestApplication" on path: DexPathList[[Zip file "/data/app/com.package.testapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.package.testapp-1/lib/x86_64, /vendor/lib64, /system/lib64]]
         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.newApplication(Instrumentation.Java:980)
         at Android.app.LoadedApk.makeApplication(LoadedApk.Java:558)
         at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4526) 
         at Android.app.ActivityThread.access$1500(ActivityThread.Java:151) 
         at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1364) 
         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) 
        Suppressed: Java.lang.ClassNotFoundException: com.package.testapp.welcome.TestClaimApplication
         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

グラドル

    buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
    }

    apply plugin: 'com.Android.application'
    apply plugin: 'io.fabric'

    repositories {
    maven { url 'https://maven.fabric.io/public' }
    }

Android {

    compileSdkVersion 25
    buildToolsVersion '25.0.3'

    defaultConfig {
        applicationId "com.package.testapp"
        minSdkVersion 21
        multiDexEnabled = true
        targetSdkVersion 25
        versionCode 2
        versionName "0.7"
        renderscriptTargetApi 18 // support mode not supported 21+
        renderscriptSupportModeEnabled true
        testInstrumentationRunner 
    "Android.support.test.runner.AndroidJUnitRunner"
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }

    productFlavors {
        companylocal
        companymaven
    }
}

dependencies {


    def ext = rootProject.ext;

    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile "com.Android.support:appcompat-v7:${ext.supportLibraryVersion}"
    compile "com.Android.support:design:${ext.supportLibraryVersion}"
    compile 'com.romandanylyk:pageindicatorview:0.0.9'
    compile "com.jakewharton:butterknife:${ext.butterknifeLibraryVersion}"
    annotationProcessor "com.jakewharton:butterknife-compiler:${ext.butterknifeLibraryVersion}"
    compile "uk.co.chrisjenx:calligraphy:2.2.0"
    compile 'com.Android.support:multidex:1.0.1'
    // Crashlytics Kit - for crash handling
    compile('com.crashlytics.sdk.Android:crashlytics:2.5.2@aar') {
        transitive = true
    }
    androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.Android.support', module: 'support-annotations'
    })

    testCompile 'junit:junit:4.12'
    testCompile 'org.robolectric:robolectric:3.0'
    testCompile "com.squareup.okhttp3:mockwebserver:${ext.okHttp3LibraryVersion}"
    testCompile('com.squareup.assertj:assertj-Android:1.1.1') {
        exclude module: 'support-annotations'
    }
}

アプリケーション

public class TestApplication extends Application {

    Engine engine;

    @Override
    public void onCreate() {
        super.onCreate();

        String privateServerUrlLocal = getString(R.string.server_url);
        ProfileLauncher profileLauncher = getProfileLauncher();
        LoginLauncher loginLauncher = getLoginLauncher();

        // Set up Crash Analytics
        final CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder().disabled(DEBUG).build();
        Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());

        Intent intent = new Intent(this, LogoutService.class);
        startService(intent);

        CertificatePinner certificatePinner = new CertificatePinner.Builder()
                .add("")
                .add("")
                .build();

        engine = new Engine.Builder(privateServerUrlLocal, getString(R.string.other_server_url))
                .setCertificatePinner(certificatePinner)
                .setSDKPartnerSetupManager(getSdkPartnerManager())
                .setLogoutActionHandler(getLogoutActionHandler())
                .setVLocationManager(new VLocationManagerImp())
                .setDebug(DEBUG)
                .addDeepLinkHandler(new ClaimDeepLinkHandler(loginLauncher, profileLauncher))
                .addDeepLinkHandler(new LinkGiftCodeDeeplinkHandler(loginLauncher, profileLauncher))
                .addDeepLinkHandler(new OpenLinkDeepLinkHandler())
                .addDeepLinkHandler(new DetailsDeepLinkHandler())
                .addClaimConfig(new ClaimConfig(false, false, false, false, true))
                .build();
        engine.startup(this);
    }



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

}

マニフェスト

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
package="com.package.testapp">

<uses-feature
    Android:name="Android.hardware.camera"
    Android:required="true" />
<uses-feature
    Android:name="Android.hardware.camera.autofocus"
    Android:required="false" />
<uses-feature
    Android:name="Android.hardware.camera.flash"
    Android:required="false" />

<!-- Required for g+ login -->
<uses-permission Android:name="Android.permission.CAMERA" />

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />

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

        <service
            Android:name="com.package.companycommon.ui.LogoutService"
            Android:stopWithTask="true" />

        <activity
            Android:name=".LaunchActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            Android:name=".welcome.WelcomeActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            Android:name=".RegisterActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            Android:windowSoftInputMode="adjustResize" />
        <activity
            Android:name=".LoginActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            Android:windowSoftInputMode="adjustResize" />
        <activity
            Android:name=".ActivationActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            Android:windowSoftInputMode="adjustResize" />
        <activity
            Android:name=".AddPhoneNumberActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            Android:windowSoftInputMode="adjustResize" />
        <activity
            Android:name=".ForgotPasswordActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            Android:windowSoftInputMode="adjustResize" />
        <activity
            Android:name=".GiftHistoryActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            Android:name="com.package.PartnerLoginHiddenActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            Android:name=".tutorial.TutorialActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            Android:name=".CreateNewPasswordActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            Android:name=".settings.SettingsActivity"
            Android:screenOrientation="portrait">
            <meta-data
                Android:name="Android.support.PARENT_ACTIVITY"
                Android:value=".GiftHistoryActivity" />
        </activity>
        <activity
            Android:name=".settings.ExtraSettingsActivity"
            Android:label="@string/settings"
            Android:screenOrientation="portrait">
            <meta-data
                Android:name="Android.support.PARENT_ACTIVITY"
                Android:value=".settings.SettingsActivity" />
        </activity>
        <activity
            Android:name="companyapp.company.NewsActivity"
            Android:label="@string/notifications"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme" />
        <activity
            Android:name=".termsandconditions.CompanyTermsAndConditionsActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme" />

        <activity
            Android:name="com.package.companycommon.ui.PhotoViewerActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme" />

        <activity
            Android:name="com.package.company.details.CompanyDetailActivity"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme" />
        <activity
            Android:name="com.package.company.details.CompanyDetailActivityLocation"
            Android:screenOrientation="portrait"
            Android:theme="@style/AppTheme">
            <meta-data
                Android:name="Android.support.PARENT_ACTIVITY"
                Android:value="com.package.company.details.CompanyDetailActivity" />
        </activity>
        <activity
            Android:name="com.package.company.ClaimActivity"
            Android:theme="@style/AppTheme.NoActionBar"
            tools:replace="Android:theme" />
    </application>

</manifest>
29
ganlaw

Api 21を対象とする場合、コンパイラーが読み取るdexファイルは100個に制限されています。だから私が見つけた簡単な解決策は、これをgradleファイルのdexOptionsに追加することでした。これにより、すべてのdexファイルが可能な限り低い量にマージされます。

Build.gradleファイルに以下を追加します

Android {
    ...
    dexOptions {
        preDexLibraries = false
    }
}
9
ganlaw

Instant Runオプションを無効にしてから、アプリを実行してください。多くの解決策を試した後、それは私のためにうまくいきました、私はこれを最終的に解決しました。

enter image description here

5
KrishCdbry

これは、multiDexが正しく機能しないため、一部のファイルが欠落していることを意味します。 Android 5.0にはmultiDexを使用する別の方法があります。アプリケーションクラスで何かをオーバーライドしましたか?

1
Meng Tim

マニフェストに完全なパスを指定してみてください

  <application
        Android:name=".TestApplication"

また、ビルドフォルダーを手動で削除します。クリーンアップが機能しない場合もあります。また、アプリを手動でアンインストールして開始します。

1
rupesh jain

なんらかの理由で、このクラスはメインの担当者ではなくなりました。

main-classesリストでクラスを宣言multiDexKeepFile (gradleでクラスをリスト)または multiDexKeepProguard (特定のプロガードファイルを指定)を使用主なクラス)。

1
rds

compile 'com.Android.support:multidex:1.0.1'を削除してみてください。 Googleドキュメント says

したがって、minSdkVersionが21以上の場合、multidexサポートライブラリは必要ありません。

これが役立つかどうかは決してわかりませんが、試す価値はあります。

1
Thomas

Progaudを有効にしてmultidexを無効にしてみてください。

この問題を修正するだけでなく、APKを小さくして、インストールと実行時間を高速化します。

注:これに関するヘルプが必要な場合は、コメントを残してください。解決できます。

  • OK、ProgaurdやMultiDexではない

エラーは、com.package.Applicationが欠落していることです。投稿したコード(またはマニフェスト)には、そのクラスへの参照が含まれていません。 com.package.Applicationはどこで定義していますか?そして、あなたがあなたのプロジェクトのどこにもいない場合、それは参照されていますか? (これを解明するには、プロジェクト全体で「com.package.Application」を検索します。)

1
Shmuel

私はあなたのコードと設定から demo を作成し、それがマシュマロの下で動作します

ダウンロードして確認し、コードと比較してください。そして、パッケージ名com.package.testappでプロジェクトを作成する方法がもう1つあります。同じパッケージ名でプロジェクトを作成できません

1
Rajesh Nasit

multidex-config.txtを作成して、このクラスをプライマリDEXファイルに保持します。

com/package/Application.class
com/package/TestApplication.class
com/package/testapp/welcome/TestClaimApplication.class

次のようにbuild.gradleのAndroid.buildTypes.releaseセクションにmultiDexKeepFileを追加します。

Android {
    buildTypes {
        release {
            multiDexKeepFile file 'multidex-config.txt'
        }
    }
}
1
MBN