标签: android-multidex

如何防止在android gradle中使用multi-dex

以下是我的gradle文件。我收到一个 MultiDexException。我不想启用 multidex 因为我的应用程序没有那么复杂。所以我确信我一定是做错了什么。有人会看看我的 gradle 文件并指出我可以做些什么来避免这个问题吗?

错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
    at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
    at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
    at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
Run Code Online (Sandbox Code Playgroud)

等级:

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'
?    apply plugin: 'com.google.gms.google-services'?    ?    
repositories {
?        maven { url 'https://maven.fabric.io/public' }?    
}? …
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin android-multidex

3
推荐指数
1
解决办法
3130
查看次数

Proguard 可以保存到 multidex 应用程序吗?

我有一个包含几个库的应用程序,达到了 65536 方法计数的红线。

  1. 我实现了将应用程序设置为multidexAPK。
  2. 对于大小优化,我决定使用 Proguard,因为我只使用了Guava和的一些功能common.java.lang,而这些库带来了他们的整个家庭。
  3. 在 Proguard 工作之后,我的应用程序 ref ~ 45 Kmethods
  4. 我经常读到 multidex 应用程序可能会不时崩溃
  5. 而且由于第二个 dex 运行时加载,这需要时间。

4和5是真的吗?

然后我只是尝试不使用mutidex,因为我的结束方法计数是 < 56Kmethods with prodGuard,但它失败了,好像它有更多!

为此,我只是将 gradle 参数设置multiDexEnabled为 false

还有什么要检查/做的吗?

这是我的 Gradle 的一部分:

android {
    compileSdkVersion ANDROID_BUILD_SDK_VERSION
    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION

    defaultConfig {
        applicationId "XXXX"
        targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
        minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
        versionCode ANDROID_BUILD_VERSION_CODE
        versionName ANDROID_BUILD_APP_VERSION_NAME
        // Enabling multidex support.
        multiDexEnabled false
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            debuggable false
            ext.enableCrashlytics = true
            renderscriptOptimLevel …
Run Code Online (Sandbox Code Playgroud)

android proguard android-gradle-plugin android-multidex android-proguard

3
推荐指数
1
解决办法
1042
查看次数

Android:Apache POI 重复条目:org/apache/xmlbeans/xml/stream/Location.class 错误

嗨,我在运行我的 android 项目时遇到以下错误:

Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: org/apache/xmlbeans/xml/stream/Location.class
Run Code Online (Sandbox Code Playgroud)

我在互联网上搜索过这个问题,不同类型的解决方案提供了以下几个:

1] Enable multidex, (by doing `multiDexEnabled true`),
2] Remove support library v4 as v7 comes with it, (I am using only v7),
3] Increase jvm heap size through gradle or through gradle.properties,
2] Do not use multiple playstore library versions (Which I am not using already)
Run Code Online (Sandbox Code Playgroud)

当我在 gradle 中为 Apache POI 添加依赖项时,上述所有内容都开始了,如下所示:

dependencies {
    ....
    compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.14'
}
Run Code Online (Sandbox Code Playgroud)

以上都不适用于我的情况。为什么会发生这种情况以及什么是可靠的解决方案。

java android apache-poi android-gradle-plugin android-multidex

3
推荐指数
1
解决办法
7736
查看次数

gradle 项目依赖与 MultiDex

我有两个.aar文件需要作为依赖项添加到我的项目中。我导入了项目并执行了以下操作,效果很好。

dependencies {
    compile project(':zoomcommonlib')
    compile project(':zoomsdk')
}
Run Code Online (Sandbox Code Playgroud)

但是,我添加了许多其他库,我不得不使用MultiDex 库来支持超过 64K 方法的应用程序

dependencies {
    compile 'com.android.support:multidex:1.0.1'
    compile project(':zoomcommonlib')
    compile project(':zoomsdk')
    compile 'com.google.android.gms:play-services-maps:10.2.0'
    compile 'com.google.android.gms:play-services-location:10.2.0'
    .....
}
Run Code Online (Sandbox Code Playgroud)

是的,MultiDex 设置正确,因为我可以构建应用程序并毫无问题地运行它。

问题:当我尝试使用这些特定项目时,应用程序崩溃。以下日志:

18790-18790/com.mypackage.name E/UncaughtException: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.mypackage.name-1/base.apk", zip file "/data/app/com.mypackage.name-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.mypackage.name-1/lib/arm64, /data/app/com.mypackage.name-1/base.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_dependencies_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_0_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_1_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_2_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_3_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_4_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_5_apk.apk!/lib/arm64-v8a, …
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin android-multidex

3
推荐指数
1
解决办法
3307
查看次数

java.lang.NoClassDefFoundError:解析失败:Lenovo K4 Note上的应用类运行android 6,API 23

GroupingHelper 是在应用程序本身的 helper 包中定义的一个类,而不是来自第三方库。尽管如此,在运行时仍未找到 GroupingHelper,并且出现以下崩溃:

    --------- beginning of crash
05-08 18:18:33.181 24111-24111/com.pkg.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.pkg.app, PID: 24111
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/pkg/app/helpers/GroupingHelper$$Lambda$0;
        at com.pkg.app.helpers.GroupingHelper.<init>(GroupingHelper.java:21)
        at com.pkg.app.activities.TransactionActivity.<init>(TransactionActivity.java:35)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1072)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2473)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5776)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.pkg.app.helpers.GroupingHelper$$Lambda$0" on path: DexPathList[[zip file "/data/app/com.pkg.app-1/base.apk"],nativeLibraryDirectories=[/data/app/com.pkg.app-1/lib/arm64, /data/app/com.pkg.app-1/base.apk!/lib/arm64-v8a, /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 com.pkg.app.helpers.GroupingHelper.<init>(GroupingHelper.java:21) 
        at com.pkg.app.activities.TransactionActivity.<init>(TransactionActivity.java:35) …
Run Code Online (Sandbox Code Playgroud)

android noclassdeffounderror guava runtimeexception android-multidex

3
推荐指数
1
解决办法
850
查看次数

解决失败:Multidex仪器

在实施multidex时,每当我同步项目时都会遇到以下错误。

解决失败:Multidex仪器

我按照这些说明进行了设置。

这是相关的应用程序级别的build.gradle:

android {
    compileSdkVersion 28

    defaultConfig {
        applicationId "xxx.xyz.zzz"
        minSdkVersion 16
        targetSdkVersion 22
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
}
dependencies {
    compile 'com.android.support:multidex:1.0.3'
    ....and the rest
}
Run Code Online (Sandbox Code Playgroud)

以及相关的项目级别的build.gradle:

buildscript {
    repositories {
        google()
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:3.1.2'
        classpath 'io.fabric.tools:gradle:1.+'
    }
}

allprojects {
    repositories {
        mavenLocal()
        mavenCentral()
        jcenter()
        maven {
            url "$rootDir/../node_modules/react-native/android"
        }
        google()
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么?

android gradle maven android-studio android-multidex

3
推荐指数
1
解决办法
1919
查看次数

Android Multidex列出所有类

我想使用ApplicationWrapepr方法在我的应用程序中使用multidex,如此处所述https://plus.google.com/104023661970539138053/posts/YTMf8ADTcFg

我使用了--minimal-main-dex选项以及这样的keep文件:

android/support/multidex/ZipUtil.class
android/support/multidex/ZipUtil$CentralDirectory.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDexExtractor.class
com/<mypackage>/common/MyApplication.class
com/<mypackage>/common/MyApplicationWrapper.class
com/<mypackage>/common/ui/DashboardActivity.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/MultiDex.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/MultiDex$V4.class
Run Code Online (Sandbox Code Playgroud)

这导致我的主dex文件中列出的类是可以的.我使用一个使用以下代码的库来列出dexfile中的所有类,但只获取主"clesses.dex"的条目,而不是所有其他加载的dex文件的条目,因为新的DexFile只检查"classes.dex" :

private static List<String> getPaths(final String[] sourcePaths) {
    List<String> result = new ArrayList<String>();

    for (String s : sourcePaths) {
      try {
        DexFile dexfile = new DexFile(s);
        Enumeration<String> entries = dexfile.entries();

        while (entries.hasMoreElements()) {
          result.add(entries.nextElement());
        }
      } catch (IOException ioe) {
        Log.w(TAG, "cannot open file=" + s + ";Exception=" + ioe.getMessage());
      }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

现在的单一路径通过以下方式确定:

application.getApplicationContext().getApplicationInfo().sourceDir;
Run Code Online (Sandbox Code Playgroud)

结果像/data/../myapplicationname.apk

还有另一种可能性来列出dex文件中的所有类吗?或者目前在ClassLoaders中的所有课程?该库对项目至关重要,并使用此方法稍后通过反射查找组件实现.

EDIT1: 如果发现classes2.dex文件位于:/data/data/com./code_cache/secondary-dexes/com.-1.apk.classes2.dex

但是当使用带有此路径的新DexFile()时,将抛出IOEsxception,并显示消息"无法打开dexfile".

android classloader dex dexclassloader android-multidex

2
推荐指数
1
解决办法
3597
查看次数

以下Lollipop版本的java.lang.NoClassDefFoundError:com.parse.Parse $ Configuration $ Builder

我在我的应用程序中使用parse.com sdk.它与Lollipop完全一致.但是当我在棒棒糖版本下面运行应用程序时,我收到此错误:

java.lang.NoClassDefFoundError: com.parse.Parse$Configuration$Builder
at com.parse.Parse.initialize(Parse.java:297)
at com.xxx.android.MyApp.onCreate(MyApp.java:16)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1014)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4747)
at android.app.ActivityThread.access$1500(ActivityThread.java:166)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5584)
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:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

初始化解析时我收到此错误

Parse.initialize(this); 
Run Code Online (Sandbox Code Playgroud)

应用类代码:

public class MyApp extends Application {
@Override
public void onCreate() {
    super.onCreate();
    // Enable Local Datastore.
    Parse.enableLocalDatastore(this);
    Parse.initialize(this);
}
Run Code Online (Sandbox Code Playgroud)

}

我的清单代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.android">


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" …
Run Code Online (Sandbox Code Playgroud)

android noclassdeffounderror parse-platform android-multidex

2
推荐指数
1
解决办法
801
查看次数

错误:任务':app:transformClassesWithDexForDebug'的执行失败 - 对于multidex应用程序

运行/构建我的应用程序的APK时,我收到此错误.

Information:Gradle tasks [:app:assembleDebug]
:app:preBuild
:linkedin-sdk:preBuild
:app:preBuild UP-TO-DATE
:linkedin-sdk:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:linkedin-sdk:preReleaseBuild
:app:checkDebugManifest
:linkedin-sdk:preReleaseBuild UP-TO-DATE
:linkedin-sdk:compileReleaseNdk UP-TO-DATE
:app:preReleaseBuild
:linkedin-sdk:compileLint
:app:preReleaseBuild UP-TO-DATE
:app:preDebugAndroidTestBuild UP-TO-DATE
:linkedin-sdk:copyReleaseLint UP-TO-DATE
:app:generateDebugBuildConfig
:linkedin-sdk:checkReleaseManifest
:linkedin-sdk:preDebugAndroidTestBuild UP-TO-DATE
:linkedin-sdk:preDebugBuild UP-TO-DATE
:linkedin-sdk:preDebugUnitTestBuild UP-TO-DATE
:linkedin-sdk:preReleaseUnitTestBuild UP-TO-DATE
:linkedin-sdk:prepareComAndroidSupportSupportV42103Library
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:processDebugGoogleServices
:linkedin-sdk:prepareComAndroidSupportSupportV42103Library UP-TO-DATE
:linkedin-sdk:prepareReleaseDependencies
:linkedin-sdk:compileReleaseAidl
:app:compileDebugNdk UP-TO-DATE
:app:processDebugJavaRes UP-TO-DATE
:app:validateDebugSigning
:linkedin-sdk:compileReleaseAidl UP-TO-DATE
:linkedin-sdk:compileReleaseRenderscript UP-TO-DATE
:linkedin-sdk:generateReleaseBuildConfig UP-TO-DATE
:linkedin-sdk:generateReleaseAssets UP-TO-DATE
:linkedin-sdk:mergeReleaseAssets UP-TO-DATE
:linkedin-sdk:generateReleaseResValues UP-TO-DATE
:linkedin-sdk:generateReleaseResources UP-TO-DATE
:linkedin-sdk:mergeReleaseResources UP-TO-DATE
:linkedin-sdk:processReleaseManifest UP-TO-DATE
:linkedin-sdk:processReleaseResources UP-TO-DATE
:linkedin-sdk:generateReleaseSources UP-TO-DATE
:linkedin-sdk:compileReleaseJavaWithJavac UP-TO-DATE
:linkedin-sdk:extractReleaseAnnotations UP-TO-DATE
:linkedin-sdk:mergeReleaseProguardFiles …
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin android-multidex

2
推荐指数
1
解决办法
1万
查看次数

使用firebase messaging api的android multidex支持

所以我有和Android项目,我需要包括Firebase消息api,这是我的grande配置

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"

    signingConfigs {
        config {
            keyAlias 'XXXXXXX'
            keyPassword 'XXXXXXXX'
            storeFile file('/path/path/etc')
            storePassword 'noiGGW4P6509'
        }
    }

    defaultConfig {
        applicationId "xxx.xxxxxx.xxxxxx"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 37
        versionName "2.0"
        renderscriptTargetApi 20
        renderscriptSupportModeEnabled true
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.android.support:support-v4:24.0.0'
    compile 'com.android.support:design:24.0.0'
    compile 'com.google.android.gms:play-services-maps:9.2.0'
    compile 'com.google.android.gms:play-services-location:9.2.0'
    compile 'com.google.android.gms:play-services-analytics:9.2.0' …
Run Code Online (Sandbox Code Playgroud)

android gradle android-studio android-multidex firebase-cloud-messaging

2
推荐指数
1
解决办法
3097
查看次数