2014-11-05 35 views
31

Tôi đang thử ứng dụng MultiDex Support mới trên ứng dụng của mình và cho đến nay tôi đã quản lý để biên dịch ứng dụng chính xác, nhưng khi chạy ứng dụng, tôi có được ngoại lệ sau đây:Không tìm thấy lớp "android.support.multidex.MultiDexApplication" trên đường dẫn: DexPathList

java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication: java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path: DexPathList[[zip file "/data/app/me.myapp.main-2.apk"],nativeLibraryDirectories=[/data/app-lib/me..main-2, /vendor/lib, /system/lib]] 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:507) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4382) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:139) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5086) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path: DexPathList[[zip file "/data/app/me.myapp.main-2.apk"],nativeLibraryDirectories=[/data/app-lib/me.myapp.main-2, /vendor/lib, /system/lib]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:497) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:457) 
    at android.app.Instrumentation.newApplication(Instrumentation.java:998) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:502) 

Đây là tập tin của tôi gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.0" 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 21 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
     debug { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
    packagingOptions { 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
    } 
} 

repositories { 
    mavenCentral() 
    mavenLocal() 
} 


dependencies { 
    compile 'com.android.support:multidex:1.0.0' 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:support-v4:21.0.0' 
    compile 'com.android.support:support-v13:21.0.0' 
    compile 'com.android.support:appcompat-v7:21.0.0' 
} 

Và AndroidManifest.xml của tôi:

<application 
android:name="android.support.multidex.MultiDexApplication"> 

Tôi không hiểu vấn đề là gì. Tôi nghĩ tôi đang làm mọi thứ theo tài liệu. Có cái gì khác tôi đang mất tích? Tôi đảm bảo rằng tôi đã có thư viện hỗ trợ mới nhất và cài đặt lại từ trình quản lý SDK.

+0

Bạn cũng đảm bảo bạn có phiên bản Công cụ xây dựng mới nhất? Bạn cũng có thể chỉ định liệu dấu vết ngăn xếp có phải là từ bản gỡ lỗi hoặc bản phát hành không? – PaulR

+1

@PaulR Tôi có phiên bản Công cụ xây dựng 21.1 và theo dõi ngăn xếp thuộc về phiên bản gỡ lỗi. –

+0

@dustedrob Lạ. Trước tiên, hãy xác minh rằng MultiDexApplication là một phần trong danh sách maindexlist của bạn. Bạn có thể tìm thấy tệp văn bản này trong /app/build/intermediates/multi-dex/{debug/release}/maindexlist.txt –

Trả lời

16

cấu hình của tôi:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.14.+' // 0.14.1, 2014-11-6 
    } 
} 

dependencies { 
    compile 'com.android.support:multidex:1.0.0' 
} 

android { 
    compileSdkVersion = 21 
    buildToolsVersion = "21.1.0" 

    defaultConfig { 
     minSdkVersion 14 
     targetSdkVersion 21 
     multiDexEnabled true 
    } 
} 

Thật không may, tôi có cùng một vấn đề. Nhưng tôi tìm thấy một tình huống kỳ lạ:

build/trung gian/dex/debug:

-rw-rw-r-- 1 andrew andrew 2221176 Nov 6 20:18 classes2.dex 
-rw-rw-r-- 1 andrew andrew 8357596 Nov 6 20:18 classes.dex 

giải nén apk, xây dựng/đầu ra/apk:

-rw-rw-r-- 1 andrew andrew 8357596 Nov 6 20:18 classes2.dex 
-rw-rw-r-- 1 andrew andrew 2221176 Nov 6 20:18 classes.dex 

Trong apk, các lớp học chính của lớp học .dex nên lớn hơn classes2.dex, nhưng không phải. Tôi cũng dex2jar & jar giải nén để kiểm tra các lớp, lớp ứng dụng không có trong classes.dex, nó trong classes2.dex trái ngược.

Tuy nhiên, tôi nên sửa nó. Dưới đây là vá gradle Android của tôi cắm bạn có thể thử:

buildscript { 
    repositories { 
     mavenCentral() 
     maven { url 'https://github.com/yongjhih/android-gradle-plugin.m2/raw/master/' } 
    } 
    dependencies { 
     classpath 'com.infstory.tools.build:gradle:0.14.+' 
    } 
} 

Các miếng vá là: https://github.com/yongjhih/android-gradle-plugin/commit/9c2212e3b1b4c6e1f7b47f2086aba1903a6258bf hoặc https://android-review.googlesource.com/#/c/113331/

vấn đề: https://code.google.com/p/android/issues/detail?id=78761

Các bản vá chính thức là https://android-review.googlesource.com/#/c/113201/ đó đã được sáp nhập, tôi nghĩ rằng nó có thể được sửa trong phiên bản tiếp theo.

Đã được sửa chữa 0.14.2 (2014/11/10). (từ http://tools.android.com/tech-docs/new-build-system)

Release notes: 

0.14.2 (2014/11/10) 

Fix potential multi-dex issue where the dex files could be renamed during packaging, leading to the wrong main dex file being used. 
Fix versionNameSuffix support 
Fix BuildType.initWith to copy shrinkResources flag 
setup default proguard rule file if none are provided (SDK/tools/proguard/proguard-android.txt) 
BuildType.pseudoLocalesEnabled flag to include fake locales in apk. 
+0

Có! Điều này đã làm việc! Cảm ơn bạn đã giúp đỡ. –

+8

Tôi đang sử dụng 1.1.0 và vừa gặp vấn đề này ... – Sam

+0

Hey @Andrew Chen và @Roberto Betancourt, tôi đã thử thêm phụ thuộc và kho lưu trữ, nhưng tôi gặp phải lỗi khi tạo tệp đó là tệp mở Lỗi '(1.0) TEST_SDK_DIR'. –

3

Tôi đã sử dụng mới nhất của Android Studio và làm theo tấm tài liệu chính thức để hỗ trợ thêm để multidex https://developer.android.com/studio/build/multidex.html. Nhưng tôi vẫn có ngoại lệ tương tự. Tôi đã dành rất nhiều thời gian để giải quyết nó. Cuối cùng, tôi tìm thấy nguyên nhân là tôi đã bật "Điểm ngắt ngoại lệ Java - Bất kỳ ngoại lệ nào" và "Điểm ngắt ngoại lệ - Khi có bất kỳ lỗi nào bị ném". Sau khi tôi tắt chúng, ứng dụng chạy mà không có sự cố.

Chỉ cần làm theo tài liệu chính thức về multidex https://developer.android.com/studio/build/multidex.html. Nó hoạt động.

0

Thiết lập dự án ứng dụng của bạn để sử dụng cấu hình nhiều bên yêu cầu bạn thực hiện các sửa đổi sau cho dự án ứng dụng của mình, tùy thuộc vào phiên bản Android tối thiểu mà ứng dụng của bạn hỗ trợ.

Nếu minSdkVersion của bạn được thiết lập để 21 hoặc cao hơn, tất cả các bạn cần làm là thiết lập multiDexEnabled true trong tập tin build.gradle mô-đun cấp của bạn, như ở đây:

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

Tuy nhiên, nếu bạn minSdkVersion được thiết lập để 20 hoặc thấp hơn, sau đó bạn phải sử dụng các thư viện hỗ trợ multidex như sau:

  • Sửa đổi các tập tin mô-đun cấp build.gradle để cho phép multidex và thêm thư viện multidex như một sự phụ thuộc, như thể hiện ở đây:

    android { 
        defaultConfig { 
         ... 
         minSdkVersion 15 
         targetSdkVersion 26 
         multiDexEnabled true 
        } 
        ... 
    } 
    
    dependencies { 
        compile 'com.android.support:multidex:1.0.1' 
    } 
    
  • Tùy thuộc vào việc bạn ghi đè lên các lớp ứng dụng, thực hiện một trong các cách sau:

    • Nếu bạn không ghi đè lên các lớp ứng dụng, chỉnh sửa file manifest của bạn để thiết lập android: tên trong thẻ như sau:

      <?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> 
      
    • Nếu bạn làm ghi đè lên các lớp ứng dụng, thay đổi nó để mở rộng MultiDexApplication (nếu có thể) như sau:

      public class MyApplication extends MultiDexApplication { ... } 
      
    • Hoặc nếu bạn làm ghi đè lên các lớp ứng dụng nhưng nó không thể thay đổi các lớp cơ sở, sau đó bạn thay vì có thể ghi đè lên các phương pháp attachBaseContext() và gọi MultiDex.install (this) để cho phép multidex:

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

Gần đây tôi có vấn đề này. Mặc dù không có thay đổi cấu hình của tôi lỗi này bắt đầu xảy ra. Tôi đã thử tất cả các giải pháp được đề xuất bao gồm xóa thiết bị ảo và tạo một thiết bị mới.

Tuy nhiên, tôi đã nhận thấy rằng nếu tôi đã tạo APK và kéo nó vào trình giả lập để cài đặt, nó hoạt động tốt.

Cuối cùng làm sạch dự án và chạy lại và sau đó hoạt động.

Các vấn đề liên quan