15

Tôi hiện đang phát triển một ứng dụng Android bằng Android Studio. Hiện tại, ứng dụng đang khởi chạy hoàn hảo trên các thiết bị Lollipop, nhưng gặp sự cố khi khởi chạy do một thiết bị pre-lollipop ClassNotFoundException (tôi đã thử nghiệm trên ICS và không thành công).Android: thư viện tải ứng dụng khi chạy trên Lollipop nhưng không phải là IceCreamSandwich

Lớp bị thiếu luôn xuất phát từ thư mục librairies bên ngoài khi chạy.

Dưới đây là file gradle:

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' 

android { 
    compileSdkVersion 23 
    buildToolsVersion '23.0.0' 
    defaultConfig { 
     applicationId 'com.kappsports.kapp10' 
     minSdkVersion 18 
     targetSdkVersion 23 
     versionCode 1 
     versionName '1.0.0' 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      shrinkResources true 
     } 
    } 
    lintOptions { 
     abortOnError false 
    } 
    dexOptions { 
     incremental true 
     javaMaxHeapSize '4g' 
    } 
} 

repositories { 
    mavenCentral() 
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 
    maven { url 'https://maven.fabric.io/public' } 
    jcenter() 
} 

dependencies { 
    compile fileTree(dir: 'libs', exclude: 'android-support-v4.jar', include: '*.jar') 
    compile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
     transitive = true; 
    } 
    compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT' 
    compile 'com.github.johnpersano:supertoasts:[email protected]' 
    compile 'com.google.code.gson:gson:2.3' 
    compile 'com.squareup:otto:1.3.5' 
    compile 'com.makeramen:roundedimageview:1.3.0' 
    compile 'com.jakewharton:butterknife:6.0.0' 
    compile 'com.malinskiy:superrecyclerview:1.0.0' 
    compile 'com.android.support:multidex:1.0.1' 
    compile 'com.jpardogo.materialtabstrip:library:1.0.9' 
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3' 
    compile 'com.squareup.okhttp:okhttp:2.4.0' 
    compile 'org.buraktamturk:loadingview:[email protected]' 
    compile 'com.facebook.android:facebook-android-sdk:4.1.0' 
    compile 'com.github.navasmdc:MaterialDesign:[email protected]' 
    compile 'net.danlew:android.joda:2.8.2' 
    //noinspection GradleCompatible 
    compile 'com.android.support:appcompat-v7:22.2.1' 
    compile 'com.google.android.gms:play-services:7.5.0' 
    //noinspection GradleCompatible 
    compile 'com.android.support:recyclerview-v7:22.2.1' 

} 

Đây là một shunk sản lượng logcat:

> 09-06 23:25:58.414 27436-27436/? W/dalvikvm﹕ Link of class 
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 
> 27436-27436/? E/dalvikvm﹕ Could not find class 
> 'io.fabric.sdk.android.InitializationTask', referenced from method 
> io.fabric.sdk.android.Kit.<init> 09-06 23:25:58.414 27436-27436/? 
> W/dalvikvm﹕ VFY: unable to resolve new-instance 8228 
> (Lio/fabric/sdk/android/InitializationTask;) in 
> Lio/fabric/sdk/android/Kit; 09-06 23:25:58.414 27436-27436/? 
> D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0003 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of 
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Link of class 
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of 
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Link of class 
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 
> 27436-27436/? I/dalvikvm﹕ Could not find method 
> io.fabric.sdk.android.InitializationTask.getDependencies, referenced 
> from method io.fabric.sdk.android.Kit.getDependencies 09-06 
> 23:25:58.414 27436-27436/? W/dalvikvm﹕ VFY: unable to resolve virtual 
> method 57413: 
> Lio/fabric/sdk/android/InitializationTask;.getDependencies 
>()Ljava/util/Collection; 09-06 23:25:58.414 27436-27436/? D/dalvikvm﹕ 
> VFY: replacing opcode 0x6e at 0x0002 09-06 23:25:58.414 27436-27436/? 
> W/dalvikvm﹕ VFY: unable to find class referenced in signature 
> (Lio/fabric/sdk/android/services/common/IdManager;) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of 
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Link of class 
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of 
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Link of class 
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 
> 27436-27436/? I/dalvikvm﹕ Could not find method 
> io.fabric.sdk.android.InitializationTask.executeOnExecutor, referenced 
> from method io.fabric.sdk.android.Kit.initialize 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ VFY: unable to resolve virtual method 57412: 
> Lio/fabric/sdk/android/InitializationTask;.executeOnExecutor 
> (Ljava/util/concurrent/ExecutorService;[Ljava/lang/Object;)V 09-06 
> 23:25:58.414 27436-27436/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at 
> 0x0011 09-06 23:25:58.414 27436-27436/? W/dalvikvm﹕ VFY: unable to 
> find class referenced in signature 
> (Lio/fabric/sdk/android/services/common/IdManager;) 09-06 23:25:58.419 
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of 
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.419 
> 27436-27436/? W/dalvikvm﹕ Link of class 
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.419 
> 27436-27436/? D/dalvikvm﹕ DexOpt: unable to opt direct call 0xe03e at 
> 0x05 in Lio/fabric/sdk/android/Kit;.<init> 09-06 23:25:58.419 
> 27436-27436/? D/AndroidRuntime﹕ Shutting down VM 09-06 23:25:58.419 
> 27436-27436/? W/dalvikvm﹕ threadid=1: thread exiting with uncaught 
> exception (group=0x41bfb700) 09-06 23:25:58.419 27436-27436/? 
> E/AndroidRuntime﹕ FATAL EXCEPTION: main 
>  java.lang.NoClassDefFoundError: io.fabric.sdk.android.services.common.ExecutorUtils 
>    at com.crashlytics.android.core.CrashlyticsCore.<init>(CrashlyticsCore.java:205) 
>    at com.crashlytics.android.core.CrashlyticsCore$Builder.build(CrashlyticsCore.java:189) 
>    at com.kappsports.kapp10.Kapp10Application.onCreate(Kapp10Application.java:53) 
>    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024) 
>    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4684) 
>    at android.app.ActivityThread.access$1400(ActivityThread.java:159) 
>    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376) 
>    at android.os.Handler.dispatchMessage(Handler.java:99) 
>    at android.os.Looper.loop(Looper.java:176) 
>    at android.app.ActivityThread.main(ActivityThread.java:5419) 
>    at java.lang.reflect.Method.invokeNative(Native Method) 
>    at java.lang.reflect.Method.invoke(Method.java:525) 
>    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
>    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
>    at dalvik.system.NativeStart.main(Native Method) 09-06 23:25:58.424 2346-2891/? I/ActivityManager﹕ Notify an 
> ApplicationCrash 

Tôi hiện đang ra khỏi giải pháp cho bây giờ. Bất kỳ đầu mối về điều đó sẽ được đánh giá cao.

Xin cảm ơn, Trân trọng.

+2

Thêm đầu ra của ngoại lệ cho câu hỏi của bạn. – Breavyn

+1

Sự cố gần như chắc chắn là do sử dụng multidex trong ứng dụng của bạn. Bất cứ lớp nào không được tìm thấy có nhiều khả năng được truy cập trước khi attachBaseContext được gọi trong ứng dụng của bạn và các dexes phụ được nạp. Bạn đã làm theo ví dụ multidex và đảm bảo rằng nó đang được khởi tạo trong lớp Ứng dụng của bạn? –

+0

Đăng logcat với classnotdeffoundexception –

Trả lời

23

1) Thêm hỗ trợ multidex để ứng dụng của bạn:

compile 'com.android.support:multidex:1.0.1' 

2) Đặt ứng dụng của bạn như một MultiDexApplication. Chọn một trong các tùy chọn dưới đây:

Đây là mã nguồn của lớp MultiDexApplication android của:

public class MultiDexApplication extends Application { 
    public MultiDexApplication() { 
    } 

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

Lựa chọn 1) Bạn có thể mở rộng ứng dụng tùy chỉnh của bạn từ MultiDexApplication:

public class MyApplication extends MultiDexApplication { 
    // Your application implementation here 
} 

Tùy chọn 2) Bạn có thể mở rộng ứng dụng tùy chỉnh của mình từ lớp mặc định Application, sau đó bạn cần gọi số MultiDex.install tại attachBaseContext(Context base) phương pháp:

public class MyApplication extends Application { 

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

    // Your application implementation here 
} 

Lựa chọn 3) Nếu bạn không có bất kỳ ứng dụng tùy chỉnh và bạn không muốn bất kỳ, chỉ cần đặt tên ứng dụng của bạn (ở AndroidManifest.xml) để MultiDexApplication:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.multidex.myapplication"> 
    <application 
     ... 
     android:name="android.support.multidex.MultiDexApplication"> 
     ... 
    </application> 
</manifest> 

Lưu ý: Nếu bạn đang sử dụng một lớp ứng dụng tùy chỉnh (xem OPTION1 và OPTION2), application thẻ của android:name phải đã được thiết lập để lớp ứng dụng tùy chỉnh của bạn.

3) Thêm multiDexEnabled true thiết lập vào tập tin build.gradle của bạn:

defaultConfig { 
    // Other settings here 
    multiDexEnabled true 
} 

More information.

+0

Nếu tôi không sử dụng lớp ứng dụng thì sao? –

+0

@HeenaArora áp dụng tùy chọn thứ 3: "Nếu bạn không có bất kỳ ứng dụng tùy chỉnh nào và bạn không muốn bất kỳ ứng dụng nào, chỉ cần đặt tên ứng dụng của bạn (tại AndroidManifest.xml) thành MultiDexApplication:" – Devrim

22

Tôi quên thêm dòng này ngay sau khi cuộc gọi siêu trong onCreate() của lớp ứng dụng tùy chỉnh của tôi:

MultiDex.install(getBaseContext()); 

Cảm ơn Kane cho các giải pháp!

4

Trên một số thiết bị cấp thấp thêm MultiDex.install(getBaseContext()); vào MyApplication onCreate() không hoạt động? gây java.lang.NoClassDefFoundError:

gì đã làm công việc đã được thêm MultiDex.install(getBaseContext()); để MyApplication attachBaseContext(Context base)

public class MyApplication extends Application { 
... 
    @Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 
     MultiDex.install(base); 
    } 
... 
0

Bạn có thể thêm này trong thẻ Áp dụng file manifest.

android:name="android.support.multidex.MultiDexApplication" 
Các vấn đề liên quan